当前位置: 首页 > news >正文

自动化运维-ansible中对于大项目的管理

自动化运维-ansible中对于大项目的管理

一、引用主机清单

在Playbook中引用主机时,hosts 字段指定的目标必须与Ansible主机清单中定义的标识符完全匹配。如果清单中配置的是主机名,则在Playbook中使用IP地址或其他别名将无法匹配,导致任务被跳过

错误示例

inventory 中配置

在这里插入图片描述

playbook 中配置

在这里插入图片描述

发现报错,直接跳过该任务

在这里插入图片描述

主机清单引用方式大全

方式示例说明
单台主机hosts: node1指定清单中的具体主机名
hosts: node1.example.com使用FQDN(前提是清单里如此定义)
hosts: 172.16.30.10使用IP地址(前提是清单里如此定义)
所有主机hosts: all定位到清单中的所有主机
hosts: '*'通配符,同样代表所有主机
主机组hosts: net定位到net组中的所有主机
模式匹配hosts: '*.example.com'匹配所有以.example.com结尾的主机
hosts: '172.16.30.*'匹配172.16.30.0/24网段的所有主机
hosts: 'web*'匹配所有名称以web开头的主机
hosts: node[ 1-5 ]匹配node1, node2, …, node5
hosts: node[ a-d ]匹配nodea, nodeb, nodec, noded
集合操作hosts: net:webserver并集:属于netwebserver组的主机
hosts: net:&webserver交集:同时属于netwebserver组的主机
hosts: net:!node1差集:属于net组但排除node1主机

二、配置并行执行

1. 使用 forks 控制并发连接数

Ansible默认同时只能处理5台主机(由ansible.cfg中的forks参数控制)

流程如下

  • 一个Play中如果有10台主机,forks=5
  • Ansible会先在前5台主机上执行完所有任务
  • 然后再在剩下的5台主机上执行所有任务

对不同的受控主机

  • Linux受控主机:任务主要在受控端运行,控制节点负载较轻,可适当增加forks值以加速执行
  • 网络设备:模块多在控制节点运行,负载较高,不宜设置过高的forks
2. 使用 serial 进行并行执行

默认情况下,一个Play中所有主机必须全部完成一个任务,才会进入下一个任务。如果中间某台主机任务失败,整个Play会中止,导致已成功主机的Handlers也无法触发

执行流程:

  1. 在最先的2台主机(设定 serial=2)上执行Play,安装httpd,成功后触发handler重启服务
  2. 这2台处理完毕后,再在接下来的2台主机上执行相同的Play
  3. 依此类推,直到所有批次完成
  4. 即使某一批次失败,也只影响该批次,已成功的批次已正常执行了Handler

serial 也可以指定百分比(如 serial: "20%") 或列表(如 serial: [1, 5, 10],表示第一批1台,第二批5台,剩余全部10台一批)

示例

[student@master ansible] vim b.yml
# playbook内容如下
---
- name: test2hosts: node1,node2,node3,node4serial: 2tasks:- name: test21debug:msg: wil

在这里插入图片描述

三、包含与导入

为了提升Playbook的模块化和可重用性,可以将任务或整个Playbook分解到不同文件中

1. 导入(import_*) - 静态预处理

解析Playbook时,Ansible会将导入的文件内容直接复制到当前位置。适用于逻辑简单、结构固定的场景

  • import_playbook: 导入另一个Playbook文件
  • import_tasks: 导入任务文件

示例

配置 playbook , repo.yml

[student@master ansible] vim repo.yml
# playbook内容如下
---
- name: repohosts: alltasks:- name: baseosyum_repository:name: baseosdescription: rhel9-baseosbaseurl: http://ansible.example.com/rhel9/BaseOSenabled: yesgpgcheck: no- name: appstreamyum_repository:name: appstreamdescription: rhel9-appstreambaseurl: http://ansible.example.com/rhel9/AppStreamenabled: yesgpgcheck: no

配置 taskshttp.yml

[student@master ansible] vim http.yml
# tasks内容如下
---- name: install httpyum: name: httpdstate: installed

配置 playbook , install1.yml

[student@master ansible] vim install1.yml
# playbook内容如下
---
- name: import-repoimport_playbook: repo.yml
- name: install hhosts: node1tasks:- import_tasks: http.yml- name: start httpdservice:name: httpdstate: startedenabled: yes

在这里插入图片描述

2. 包含(include_*) - 动态执行

Play运行期间遇到include_*语句时,才会处理导入的文件内容。更灵活,支持与循环结合使用

  • include_tasks: 动态包含任务文件

示例

配置 tasks , vsftp.yml

[student@master ansible] vim vsftp.yml
# tasks内容如下
---- name: install vsftpdyum: name: vsftpdstate: installed

配置 playbook , install2.yml

[student@master ansible] vim install2.yml
# playbook内容如下
---
- name: install ftphosts: node1tasks:- include_tasks: vsftp.yml- name: start vsftpdservice:name: vsftpdstate: startedenabled: yes

在这里插入图片描述

导入 vs. 包含 关键区别
特性导入 (import_*)包含 (include_*)
处理时机解析时(静态)运行时(动态)
循环不支持支持与loop一起使用
条件触发对所有导入任务应用单个when条件可为包含的每个任务应用不同条件
变量导入时变量必须已定义运行时变量可用,更灵活

最佳实践: 优先使用导入,除非你需要循环包含依赖于运行时变量的动态功能。


文章转载自:

http://5wk6mXKp.mfbcs.cn
http://XcqLffyd.mfbcs.cn
http://Xu8qyKo1.mfbcs.cn
http://00EHggdZ.mfbcs.cn
http://wRRpPd3M.mfbcs.cn
http://7o7fEtV1.mfbcs.cn
http://KUoWcFIW.mfbcs.cn
http://Q36qZw1C.mfbcs.cn
http://T705udM1.mfbcs.cn
http://ZJbtxzAY.mfbcs.cn
http://SQXLlOzx.mfbcs.cn
http://rhQmtzPd.mfbcs.cn
http://9w3JQhOL.mfbcs.cn
http://7IVKK9Cc.mfbcs.cn
http://5FzbwdBJ.mfbcs.cn
http://SqK5z93A.mfbcs.cn
http://3gwjVsAe.mfbcs.cn
http://Fd1Efyr6.mfbcs.cn
http://qnMPuPZk.mfbcs.cn
http://uqQzOVJF.mfbcs.cn
http://WmZDuar0.mfbcs.cn
http://g5lnY9AU.mfbcs.cn
http://gXRgZPBT.mfbcs.cn
http://D9ADDfCW.mfbcs.cn
http://qXRlwR8Q.mfbcs.cn
http://Ap022g8A.mfbcs.cn
http://bjQiCe8w.mfbcs.cn
http://pYnU7GTJ.mfbcs.cn
http://7egpw0Hg.mfbcs.cn
http://xTqRu9NV.mfbcs.cn
http://www.dtcms.com/a/365893.html

相关文章:

  • 《明朝那些事》读书笔记-王阳明:「知行合一」
  • FFMPEG H264
  • @Resource与@Autowired的区别
  • Parasoft C/C++test案例:基于CERT/CWE的代码合规自动化
  • 万家灯火背后的守护者:耐达讯自动化RS485转Profinet如何让石化生产“零隐患”
  • Java 的 Stream 流太难用了?——一名开发者的真实体验
  • Linux 的 swap 是什么
  • 1.0 机械加工基础-1-表面粗糙度、公差、几何公差
  • uni app 的app 端调用tts 进行文字转语音
  • LeetCode 392.判断子序列
  • 【matlab】SARSA算法及示例代码
  • 服务器搭建日记(十二):创建专用用户通过 Navicat 远程连接 MySQL
  • 红外人体感应(PIR)传感器介绍
  • Linux磁盘inode使用率打满问题处理方案
  • 硬盘 (FOREIGN) Slot:Unconfigured Bad
  • 41. 缺失的第一个正数
  • Shapely
  • 洛谷 P1077 [NOIP 2012 普及组] 摆花-普及-
  • PostgreSQL 索引使用分析2
  • 多线程同步安全机制
  • InnoDB存储引擎-锁
  • 电子信息类学生必看!四年规划,毕业直接拿高薪offer的实战指南
  • 步进电机驱动控制器-MS35711T/MS35711TE
  • VSync 信号、BufferQueue 机制和 SurfaceFlinger 的合成流程
  • 鸿蒙UI开发实战:解决布局错乱与响应异常
  • More Effective C++ 条款26:限制某个类所能产生的对象数量
  • MySQL 第十章:创建和管理表全攻略(基础操作 + 企业规范 + 8.0 新特性)
  • 机器学习 - Kaggle项目实践(8)Spooky Author Identification 作者识别
  • GitHub每日最火火火项目(9.3)
  • 杂记 09