Ansible 核心配置与任务管理:主机清单、剧本,任务的导入、配置并行
一、Ansible 主机清单表述方式
主机清单(Inventory)用于定义 Ansible 管理的目标主机 / 主机组,支持精确匹配、通配符、组运算等多种表述方式,满足不同场景下的主机选择需求。
表述格式 |
功能说明 |
示例 |
单主机(IP / 主机名) |
指定单个受控主机,支持 IP、短主机名、FQDN |
- hosts: node1(短主机名) - hosts: node1.example.com(FQDN) - hosts: 172.16.30.10(IP 地址) |
全量主机 |
匹配所有受控主机 |
- hosts: all(官方推荐)- hosts: '*'(通配符等效) |
通配符匹配 |
通过 * 匹配符合规则的主机 / 主机名 |
- hosts: '*.example.com'(匹配所有 example.com 域名的主机) - hosts: '172.16.30.*'(匹配 172.16.30 网段所有主机) - hosts: 'web*'(匹配以 web 开头的主机 / 主机组) |
序列匹配 |
通过 [起始-结束] 匹配连续序列 |
- hosts: node[1-5](匹配 node1 到 node5) - hosts: node[a-d](匹配 nodea 到 noded) |
主机组运算 |
对多个主机组进行 “并集、交集、差集” 运算 |
- hosts: net:webserver(并集:net 组和 webserver 组所有主机) - hosts: net:&webserver(交集:同时在 net 组和 webserver 组的主机) - hosts: net:!node1(差集:net 组所有主机,排除 node1) |
二、Ansible 并行执行配置(forks 与 serial)
并行执行控制 Ansible 同时连接的受控主机数量,核心通过 forks 全局参数和 serial Play 级参数实现,适配不同场景下的资源占用与执行效率需求。
2.1 forks 全局参数
- 作用:定义 Ansible 最大同时连接的受控主机数,控制全局并行度。
- 默认值:5(即默认同时连接 5 台主机执行任务)。
- 执行逻辑:
若 Play 包含 10 台主机,forks=5 时,先同时对前 5 台主机执行所有任务,完成后再对后 5 台主机执行任务,所有主机完成当前 Play 后,才进入下一个 Play。
- 调整建议:
-
- Linux 受控主机:可适当调大(如 10-20),因任务在受控端执行,控制端资源占用低;
-
- 网络设备:需调小(如 2-5),因网络设备连接资源有限,避免并发过高导致连接失败。
- 配置方式:
在 /etc/ansible/ansible.cfg 中修改 forks = 10(全局生效),或执行 Playbook 时临时指定:ansible-playbook --forks 10 playbook.yml。
2.2 serial Play 级参数
- 作用:在单个 Play 内拆分主机组,按批次执行任务,优先级高于 forks,解决 “多主机执行时 handlers 触发不及时” 等问题。
- 执行逻辑:
若 serial=2,Play 会先选择 2 台主机执行完所有任务,再选择下一批 2 台,直到所有主机执行完成。
- 配置位置:与 hosts 同层级,属于 Play 的一级参数。
- 示例:
- name: 按批次执行任务
hosts: all
serial: 2 # 每批次 2 台主机
tasks:
- name: 安装 httpd
yum:
name: httpd
state: present
三、Ansible notify 与 handlers(状态触发机制)
notify(通知器)和 handlers(处理器)用于实现 “任务状态变化后触发后续操作”,避免无意义的重复执行(如仅配置文件修改后才重启服务)。
3.1 核心逻辑
- 触发条件:仅当带有 notify 的任务执行后状态为 changed=true(即产生实际变化,如文件修改、软件安装),才会触发 handlers;若任务状态为 changed=false(无变化),则不触发。
- 执行时机:默认情况下,handlers 会在当前 Play 的所有普通任务执行完毕后统一执行;若多个任务触发同一个 handlers,仅执行 1 次。
- 失败处理:若普通任务执行失败,默认不执行 handlers;若需强制执行,可在执行 Playbook 时添加参数:ansible-playbook --force-handlers playbook.yml。
3.2 示例
---
- name: 配置 Nginx 并触发重启
hosts: web_servers
tasks:
- name: 拷贝 Nginx 配置文件
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
notify: 重启 Nginx 服务 # 配置文件变化时触发 handlers
- name: 启动 Nginx 服务(首次执行)
service:
name: nginx
state: started
handlers: # 定义处理器,仅被 notify 触发
- name: 重启 Nginx 服务
service:
name: nginx
state: restarted
四、Ansible 包含与导入(模块化管理)
通过 “导入 / 包含” 功能将 Playbook、任务拆分到独立文件,实现代码复用与结构清晰,核心分为 “导入 Playbook”“导入任务”“包含任务” 三类场景。
4.1 核心区别:导入(import)vs 包含(include)
功能类型 |
语法 |
加载时机 |
动态性支持 |
适用场景 |
导入 Playbook |
import_playbook: 文件名.yml |
解析阶段(静态) |
不支持 |
复用完整的 Play 集合(如基础环境配置) |
导入任务 |
import_tasks: 文件名.yml |
解析阶段(静态) |
不支持 |
复用固定逻辑的任务(如标准安装步骤) |
包含任务 |
include_tasks: 文件名.yml |
执行阶段(动态) |
支持 |
按条件 / 变量动态加载任务(如多环境适配) |
4.2 实战示例:模块化管理 Playbook 与任务
场景需求
创建 3 个文件:repo.yml(配置 YUM 仓库)、web.yml(安装 httpd 任务)、httpd.yml(主 Playbook,导入前两者),实现 “先配仓库、再装服务” 的完整流程。
1. 配置 YUM 仓库(repo.yml)
---
- name: 配置 RHEL9 YUM 仓库
hosts: all
tasks:
- name: 创建 BaseOS 仓库
yum_repository:
file: server # 仓库配置文件名(/etc/yum.repos.d/server.repo)
name: BaseOS # 仓库 ID
description: RHEL9 BaseOS
baseurl: http://ansible.example.com/rhel9/BaseOS
enabled: yes # 启用仓库
gpgcheck: no # 关闭 GPG 校验
- name: 创建 AppStream 仓库
yum_repository:
file: server
name: AppStream
description: RHEL9 AppStream
baseurl: http://ansible.example.com/rhel9/AppStream
enabled: yes
gpgcheck: no
2. 安装 httpd 任务(web.yml)
---
# 独立任务文件,无 hosts 字段,仅包含任务列表
- name: 安装 httpd 软件包
yum:
name: httpd
state: present # 确保软件已安装
3. 主 Playbook(httpd.yml)
---
# 1. 导入 repo.yml 完整 Playbook(配置 YUM 仓库)
- name: 导入 YUM 仓库配置
import_playbook: repo.yml # 静态导入,解析阶段加载
# 2. 定义主 Play:安装并启动 httpd
- name: 部署 httpd 服务
hosts: all
tasks:
# 导入 web.yml 任务(安装 httpd)
- name: 导入 httpd 安装任务
import_tasks: web.yml # 静态导入任务
# 直接定义任务:启动并设置 httpd 开机自启
- name: 启动 httpd 服务并设置开机自启
service:
name: httpd
state: started # 确保服务运行
enabled: yes # 确保开机自启
4.3 执行与验证
- 执行主 Playbook:ansible-playbook httpd.yml
- 验证结果:
-
- 检查 YUM 仓库:在受控主机执行 yum repolist,确认 BaseOS 和 AppStream 仓库已加载;
-
- 检查 httpd 服务:在受控主机执行 systemctl status httpd,确认服务已启动且开机自启。
五、总结
- 主机清单:灵活运用 “精确匹配、通配符、组运算”,快速定位目标主机;
- 并行配置:forks 控制全局并发,serial 实现批次执行,平衡效率与资源;
- 状态触发:notify+handlers 仅在任务变化时执行后续操作,减少冗余;
- 模块化管理:通过 import_playbook/import_tasks/include_tasks 拆分代码,提升复用性与可维护性。