Ansible Playbook 核心配置实操指南:主机清单引用、并行执行与模块化组织
Ansible Playbook 核心配置实操指南:主机清单引用、并行执行与模块化组织
一、主机清单引用:精准匹配是执行前提
核心原则:playbook中hosts
字段值,必须与主机清单(默认/etc/ansible/hosts
)配置完全一致,否则任务会被跳过。
1. 常见引用方式(含场景)
引用格式 | 说明 | 适用场景 |
---|---|---|
hosts: node1 | 单个主机(清单中配置的主机名) | 特定主机单独操作 |
hosts: 172.16.30.10 | 单个主机(清单中配置的IP) | 直接通过IP指定主机 |
hosts: all / hosts: '*' | 所有主机 | 通用任务(如系统初始化) |
hosts: webserver | 主机组(清单中定义的组名) | 同角色主机批量操作(如web服务) |
hosts: 'web*' | 通配符匹配(以web 开头的主机/组) | 模糊匹配一类主机 |
hosts: '172.16.30.*' | 网段匹配 | 某一网段内主机统一操作 |
hosts: net:webserver | 并集(net组 + webserver组所有主机) | 多组主机合并执行任务 |
hosts: net:&webserver | 交集(同时在net组和webserver组的主机) | 跨组精准定位主机 |
hosts: net:!node1 | 排除(net组排除node1主机) | 批量操作中排除特定主机 |
hosts: node[ 1-5 ] | 序列匹配(node1~node5) | 连续命名主机批量操作 |
2. 关键注意事项
- 若
hosts
值在清单中不存在(如清单写node2
,playbook写node2.example.com
),Ansible会提示警告并跳过任务。 - 大项目建议按“角色(web、db)”或“网段”规范主机组,避免引用混乱。
二、并行执行配置:平衡效率与稳定性
大项目中受控主机数量多,需通过参数控制并发,避免控制节点负载过高或任务中断风险。
1. forks
参数:控制最大并发连接数
- 作用:定义Ansible同时连接的主机数量(默认值为5)。
- 执行逻辑:如
forks=5
、目标主机10台 → 先并发处理前5台,完成后再处理后5台;所有主机完成当前任务,才进入下一个任务。 - 配置建议:
- Linux主机:任务在受控端运行,控制节点负载低 → 可提高
forks
(如20-50),提升效率。 - 网络设备(路由器/交换机):任务在控制端运行,负载高 → 保持默认或降低
forks
,避免崩溃。
- Linux主机:任务在受控端运行,控制节点负载低 → 可提高
2. serial
参数:分批执行,降低风险
- 解决的问题:默认情况下,若1台主机任务失败,整个play中断,已成功主机无法执行
handlers
(如服务重启)。 - 作用:指定每次并发执行的主机数量(分批处理),如
serial: 2
→ 每次处理2台,完成后再处理下一批。 - 核心优势:
- 某批次主机失败,不影响已完成批次的
handlers
执行(如已成功的web主机仍能重启httpd)。 - 降低控制节点瞬时负载,适合大规模主机场景。
- 某批次主机失败,不影响已完成批次的
设置serial: 2前
TASK [aaaa] ********************************************************************************
ok: [node1] => {"msg": 123456
}
ok: [node2] => {"msg": 123456
}
ok: [node5] => {"msg": 123456
}
ok: [node3] => {"msg": 123456
}
ok: [node4] => {"msg": 123456
}TASK [bbbb] ********************************************************************************
ok: [node1] => {"msg": 654321
}
ok: [node2] => {"msg": 654321
}
ok: [node3] => {"msg": 654321
}
ok: [node5] => {"msg": 654321
}
ok: [node4] => {"msg": 654321
}
设置后
TASK [Gathering Facts] *********************************************************************
ok: [node1]
ok: [node2]TASK [aaaa] ********************************************************************************
ok: [node1] => {"msg": 123456
}
ok: [node2] => {"msg": 123456
}TASK [bbbb] ********************************************************************************
ok: [node1] => {"msg": 654321
}
ok: [node2] => {"msg": 654321
}PLAY [web station] *************************************************************************TASK [Gathering Facts] *********************************************************************
ok: [node5]
ok: [node3]TASK [aaaa] ********************************************************************************
ok: [node5] => {"msg": 123456
}
ok: [node3] => {"msg": 123456
}TASK [bbbb] ********************************************************************************
ok: [node5] => {"msg": 654321
}
ok: [node3] => {"msg": 654321
}PLAY [web station] *************************************************************************TASK [Gathering Facts] *********************************************************************
ok: [node4]TASK [aaaa] ********************************************************************************
ok: [node4] => {"msg": 123456
}TASK [bbbb] ********************************************************************************
ok: [node4] => {"msg": 654321
}
三、包含与导入:模块化组织playbook
大项目任务复杂,通过“包含/导入”实现代码复用,减少冗余,提升可维护性。核心区别:import
静态加载(解析时),include
动态加载(运行时)。
1. 导入playbook(import_playbook
)
-
作用:在1个playbook中导入另1个完整playbook(含
hosts
、tasks
),实现多流程串联。 -
示例:
导入剧本
--- - name: bbbbbhosts: node1tasks:- name: debug3debug:msg: abcdefghijklmn
剧本
--- - name: web stationhosts: node1tasks:- name: debug1debug:msg: 123456- name: debug2debug:msg: 654321- import_playbook: bbb.yml
运行结果
TASK [debug1] ****************************************************************************** ok: [node1] => {"msg": 123456 }TASK [debug2] ****************************************************************************** ok: [node1] => {"msg": 654321 }PLAY [bbbbb] *******************************************************************************TASK [Gathering Facts] ********************************************************************* ok: [node1]TASK [debug3] ****************************************************************************** ok: [node1] => {"msg": "abcdefghijklmn" }
2.包含tasks(include_tasks)
包含tasks不用写成完全的playbook可直接写模块
包含
---
- name: debug4debug:msg: 1qaz2wsx
剧本
---
- name: web stationhosts: node1tasks:- name: debug1debug:msg: 123456- include_tasks: ccc.yml- name: debug2debug:msg: 654321
运行效果
TASK [debug1] ******************************************************************************
ok: [node1] => {"msg": 123456
}TASK [include_tasks] ***********************************************************************
included: /home/student/ansible/ccc.yml for node1TASK [debug4] ******************************************************************************
ok: [node1] => {"msg": "1qaz2wsx"
}TASK [debug2] ******************************************************************************
ok: [node1] => {"msg": 654321
}
3. 导入 /包含任务(import_tasks
vs include_tasks
)
- 作用:在
tasks
中复用外部任务文件,避免重复编写。 - 核心区别与示例:
方式 | 加载时机 | 灵活性 | 示例(复用vsftpd安装任务) |
---|---|---|---|
import_tasks | 解析时 | 较低(适合固定任务) | yaml tasks: - import_tasks: vsftpd.yml # vsftpd.yml含安装vsftpd的任务 |
include_tasks | 运行时 | 较高(支持动态条件) | yaml tasks: - include_tasks: vsftpd.yml # 可搭配when条件动态加载 |
---------------------------------------------------------- |
| import_tasks
| 解析时 | 较低(适合固定任务) | yaml tasks: - import_tasks: vsftpd.yml # vsftpd.yml含安装vsftpd的任务
|
| include_tasks
| 运行时 | 较高(支持动态条件) | yaml tasks: - include_tasks: vsftpd.yml # 可搭配when条件动态加载
|