如何在Ansible中实现多组主机并行执行任务(组内串行)
当然支持啦!Ansible原生就有完美适配你需求的配置方式,完全能实现「组内串行执行、组间并行推进」的高效执行模式,下面给你详细拆解两种常用的实现思路:
方式一:静态分组 + Serial + Forks 参数(最直接)
这是最常用的方案,完全依赖Ansible原生参数就能实现,步骤如下:
提前定义好主机组:确保你的Inventory里已经按需求把主机分成了10个左右的组,比如
app_group1、app_group2...app_group10,每组包含2-8台主机。编写Playbook:在Play中指定所有目标组,同时设置
serial: 1确保组内串行(每次只执行组内一台主机的任务):
- name: 统一执行通用任务,组内串行、组间并行 hosts: app_group1:app_group2:app_group3:app_group4:app_group5:app_group6:app_group7:app_group8:app_group9:app_group10 serial: 1 tasks: - name: 引入你需要运行的通用角色 ansible.builtin.include_role: name: your_common_role # 或者直接写具体任务 # - name: 执行具体命令 # ansible.builtin.command: your_command
- 运行时设置Forks参数:执行Playbook时,把
--forks值设置为你的组数量(比如10),这样Ansible会同时启动10个并行进程,每个进程处理一个组的一台主机。当某个组的一台主机任务完成后,会自动拉起该组的下一台主机继续执行,而其他组的进程会同时推进自己的任务,完美实现你要的效果。
ansible-playbook -i inventory.yml your_playbook.yml --forks=10
方式二:动态分组 + 异步任务(适配动态场景)
如果你的主机组是动态生成的(比如根据主机标签自动分组),可以结合group_by模块先完成动态分组,再用异步任务机制实现并行:
- 动态分组:先通过
group_by按主机属性分组,比如按主机类型标签host_type分组:
- name: 动态分组主机 hosts: all tasks: - name: 按主机类型创建动态组 ansible.builtin.group_by: key: "host_type_{{ hostvars[inventory_hostname]['host_type'] }}"
- 异步执行组内任务:针对每个动态组,使用
async和poll参数让组内任务串行,组间任务并行:
- name: 针对每个动态组串行执行任务 hosts: host_type_* serial: 1 tasks: - name: 异步执行通用任务(组内串行) ansible.builtin.include_role: name: your_common_role async: 3600 # 任务超时时间 poll: 0 # 立即返回,不等待完成 - name: 等待所有异步任务完成 ansible.builtin.async_status: jid: "{{ item.ansible_job_id }}" register: job_result until: job_result.finished retries: 100 delay: 10 loop: "{{ ansible_play_batch | map('extract', hostvars, 'ansible_job_id') | list }}"
这种方式更灵活,适合主机组不固定的场景,但配置稍复杂一些。
内容的提问来源于stack exchange,提问作者pelagic
相关产品推荐
相关产品推荐

