Ansible高效管理大项目实战技巧
管理大项目
1. 引用主机清单
在 playbook 中引用主机时,如果对应的主机清单中未配置该主机,则无法执行。
若主机清单中配置的是主机名称,则在 playbook 的 hosts
字段中必须使用与之完全一致的主机名或 IP 地址,否则也会执行失败。示例如下:
清单文件 /etc/ansible/hosts:
node1
node2
Playbook a.yml:
---
- name: testhosts: 172.16.30.10,node2.example.comtasks:- name: debug1debug:msg: chenyu
执行该 playbook 时将出现警告并跳过任务:
[root@server ansible]# ansible-playbook a.yml
[WARNING]: Could not match supplied host pattern, ignoring: 172.16.30.10
[WARNING]: Could not match supplied host pattern, ignoring: node2.example.comPLAY [test] ********************************************************************
skipping: no hosts matchedPLAY RECAP *********************************************************************
因此,在引用主机清单时,必须确保 hosts
字段的内容与清单中配置的完全一致。
常用主机引用方式
hosts: node1
hosts: node1.example.com
hosts: 172.16.30.10
hosts: all
# 所有受控主机hosts: net
# 主机组 nethosts: '*'
# 所有主机(通配符)hosts: '*.example.com'
# 匹配域名hosts: '172.16.30.*'
# 匹配 IP 段hosts: 'web*'
# 匹配名称以 web 开头的主机hosts: net:webserver
# 取 net 组和 webserver 组的并集hosts: net:&webserver
# 取 net 组和 webserver 组的交集hosts: net:!node1
# net 组中除 node1 外的主机hosts: node[ 1-5 ]
# 匹配 node1 到 node5hosts: node[ a-d ]
# 匹配 nodea 到 noded
2. 配置并行执行
Ansible 默认按顺序运行每个 play 和每个任务。通常,所有主机必须在任何主机进入下一个任务之前完成当前任务。
Ansible 的最大同时连接数由 ansible配置文件的forks
参数控制,默认值为 5。
例如,一个 play 有 10 台主机,forks
值为 5,则前 5 台主机同时执行第一个任务,完成后另外 5 台再执行,全部完成后才进入下一个任务。
适用场景建议
- Linux 主机:任务主要在受控端执行,控制节点负载较低,可适当提高
forks
值。 - 网络设备(如路由器、交换机):任务多在控制节点执行,负载较高,不宜提高
forks
值。
使用 serial
控制分批执行
默认情况下,若某台主机任务失败,整个 play 会中断,已成功的任务也不会触发 handlers。
例如,为 webserver
组安装 httpd 并触发重启:
---
- name: web stationhosts: webservertasks:- name: install httpdyum:name: httpdstate: latestnotify:- restart httpdhandlers:- name: restart httpdservice:name: httpdstate: restarted
若其中一台主机安装失败,整个 play 中断,已成功的主机也不会执行 handler。
可通过 serial
参数分批执行,避免全组中断:
---
- name: web stationhosts: webserverserial: 2tasks:- name: install httpdyum:name: httpdstate: latestnotify:- restart httpdhandlers:- name: restart httpdservice:name: httpdstate: restarted
这样每次只对 2 台主机执行 play,即使其中一批失败,也不影响已成功的主机执行 handler。
3. 包含与导入
导入 Playbook
示例:部署 HTTPD 站点
1. 配置 YUM 仓库的 playbook(repo.yml):
---
- name: webstationhosts: node1,node2tasks:- name: repo1yum_repository:name: aadescription: aa1baseurl: http://ansible.example.com/rhel9/BaseOSenabled: yesgpgcheck: yesgpgkey: http://ansible.example.com/rhel9/RPM-GPG-KEY-redhat-release- name: repo2yum_repository:name: ccdescription: cc1baseurl: http://ansible.example.com/rhel9/AppStreamenabled: yesgpgcheck: yesgpgkey: http://ansible.example.com/rhel9/RPM-GPG-KEY-redhat-release
2. 安装 HTTPD 的任务文件(http.yml):
---
- name: install httpyum:name: httpdstate: present
3. 主 playbook(web.yml),导入其它 playbook 和任务( import_playbook: repo.yml ):
---
- name: web stationimport_playbook: repo.yml- name: testhosts: alltasks:- import_tasks: http.yml- name: start httpdservice:name: httpdstate: startedenabled: yes
包含任务
示例:安装并启动 VSFTPD
任务文件(vsftpd.yml):
---
- name: abcyum:name: vsftpdstate: present
主 playbook(a.yml)( - include_tasks: vsftpd.yml ):
---
- name: testhosts: alltasks:- include_tasks: vsftpd.yml- name: start vsftpdservice:name: vsftpdstate: startedenabled: yes