Ansible高效管理大项目实战技巧

发布于:2025-09-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

管理大项目

1. 引用主机清单

在 playbook 中引用主机时,如果对应的主机清单中未配置该主机,则无法执行。

若主机清单中配置的是主机名称,则在 playbook 的 hosts 字段中必须使用与之完全一致的主机名或 IP 地址,否则也会执行失败。示例如下:

清单文件 /etc/ansible/hosts:

node1
node2

Playbook a.yml:

---
- name: test
  hosts: 172.16.30.10,node2.example.com
  tasks:
    - name: debug1
      debug:
        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.com

PLAY [test] ********************************************************************
skipping: no hosts matched

PLAY RECAP *********************************************************************

因此,在引用主机清单时,必须确保 hosts 字段的内容与清单中配置的完全一致。

常用主机引用方式

  • hosts: node1
  • hosts: node1.example.com
  • hosts: 172.16.30.10
  • hosts: all # 所有受控主机
  • hosts: net # 主机组 net
  • hosts: '*' # 所有主机(通配符)
  • 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 到 node5
  • hosts: 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 station
  hosts: webserver
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: latest
      notify:
        - restart httpd

  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted

若其中一台主机安装失败,整个 play 中断,已成功的主机也不会执行 handler。

可通过 serial 参数分批执行,避免全组中断:

---
- name: web station
  hosts: webserver
  serial: 2
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: latest
      notify:
        - restart httpd

  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted

这样每次只对 2 台主机执行 play,即使其中一批失败,也不影响已成功的主机执行 handler。


3. 包含与导入

导入 Playbook

示例:部署 HTTPD 站点

1. 配置 YUM 仓库的 playbook(repo.yml):

---
- name: webstation
  hosts: node1,node2
  tasks:
    - name: repo1
      yum_repository:
        name: aa
        description: aa1
        baseurl: http://ansible.example.com/rhel9/BaseOS
        enabled: yes
        gpgcheck: yes
        gpgkey: http://ansible.example.com/rhel9/RPM-GPG-KEY-redhat-release

    - name: repo2
      yum_repository:
        name: cc
        description: cc1
        baseurl: http://ansible.example.com/rhel9/AppStream
        enabled: yes
        gpgcheck: yes
        gpgkey: http://ansible.example.com/rhel9/RPM-GPG-KEY-redhat-release

2. 安装 HTTPD 的任务文件(http.yml):

---
- name: install http
  yum:
    name: httpd
    state: present

3. 主 playbook(web.yml),导入其它 playbook 和任务( import_playbook: repo.yml ):

---
- name: web station
  import_playbook: repo.yml

- name: test
  hosts: all
  tasks:
    - import_tasks: http.yml
    - name: start httpd
      service:
        name: httpd
        state: started
        enabled: yes

包含任务

示例:安装并启动 VSFTPD

任务文件(vsftpd.yml):

---
- name: abc
  yum:
    name: vsftpd
    state: present

主 playbook(a.yml)( - include_tasks: vsftpd.yml ):

---
- name: test
  hosts: all
  tasks:
    - include_tasks: vsftpd.yml
    - name: start vsftpd
      service:
        name: vsftpd
        state: started
        enabled: yes

网站公告

今日签到

点亮在社区的每一天
去签到