当前位置: 首页 > 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://www.xdnf.cn/news/1445077.html

相关文章:

  • HTML第八课:HTML4和HTML5的区别
  • 网络通信与协议栈 -- OSI,TCP/IP模型,协议族,UDP编程
  • Linux 网络编程中核心函数`recv`。
  • Qt6用Chart模块做数据可视化?别再用老套路,看看这套35张图背后的秘密
  • MySQL :索引原理
  • 【面试题】BPE和WordPiece的区别?
  • Anaconda3出现Fatal error in launcher: Unable to create process using.....问题
  • STM32CubeMX + HAL 库:基于 I²C 通信的 BMP280气压海拔测量
  • 【超详细】别再看零散的教程了!一篇搞定Gitee从注册、配置到代码上传与管理(内含避坑指南最佳实践)
  • PS大神级AI建模技巧!效率翻倍工作流,悄悄收藏!
  • Wan系列模型解析--详细架构图
  • 机器学习在Backtrader多因子模型中的应用
  • 美团龙猫利用expat库实现的保存xml指定范围数据到csv的C程序
  • TypeScript 泛型入门(新手友好、完整详解)
  • XSENS VISION NAVIGATOR助力智能城市自动化清洁机器人精确导航
  • TLSF内存算法适配HTOS
  • 【Unity UGUI Canvas(画布)(1)】
  • 【音视频】FMP4 介绍
  • 【正点原子K210连载】第三十一章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • 【论文阅读】-《THE JPEG STILL PICTURE COMPRESSION STANDARD》
  • Android 接入deepseek
  • 关于ES中文分词器analysis-ik快速安装
  • k8s使用StatefulSet(有状态)部署单节点 MySQL方案(使用本地存储)
  • 【Bug】Nexus无法正常启动的五种解决方法
  • SuperMap GIS基础产品FAQ集锦(20250901)
  • Elasticsearch 数字字段随机取多值查询缓慢-原理分析与优化方案
  • 504 Gateway Timeout:服务器作为网关或代理时未能及时获得响应如何处理?
  • 揭秘设计模式:优雅地为复杂对象结构增添新功能-访问者模式
  • go语言面试之Goroutine详解
  • Linux使用-Linux系统管理