Ansible Playbook 核心配置实操指南:主机清单引用、并行执行与模块化组织

发布于:2025-09-08 ⋅ 阅读:(24) ⋅ 点赞:(0)

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,避免崩溃。

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(含hoststasks),实现多流程串联。

  • 示例

    导入剧本

    ---
    - name: bbbbb
      hosts: node1
      tasks:
    
        - name: debug3
          debug:
            msg: abcdefghijklmn
    
    

    剧本

    ---
    - name: web station
      hosts: node1
      tasks:
        - name: debug1
          debug:
            msg: 123456
    
        - name: debug2
          debug:
            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: debug4
  debug:
    msg: 1qaz2wsx

剧本

---
- name: web station
  hosts: node1
  tasks:
    - name: debug1
      debug:
        msg: 123456


    - include_tasks: ccc.yml

    - name: debug2
      debug:
        msg: 654321

运行效果

TASK [debug1] ******************************************************************************
ok: [node1] => {
    "msg": 123456
}

TASK [include_tasks] ***********************************************************************
included: /home/student/ansible/ccc.yml for node1

TASK [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条件动态加载 |


网站公告

今日签到

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