如何在单个Ansible Playbook中混合串行与并行执行任务?
解决方案
要实现VMs组串行执行任务、Server组并行执行任务且两者同时启动的需求,可利用Ansible的异步任务(async)结合throttle控制,在单个Playbook中完成:
调整后的Playbook
--- - hosts: VMs,Server gather_facts: false tasks: # VMs组串行异步执行apt update - name: 执行VMs主机的apt update(串行异步) apt: update_cache: yes when: inventory_hostname in groups['VMs'] throttle: 1 async: 300 # 设置任务超时时间,可根据实际场景调整 poll: 0 register: vms_async_jobs # Server组并行执行apt update - name: 执行Server主机的apt update(并行异步) apt: update_cache: yes when: inventory_hostname in groups['Server'] async: 300 poll: 0 register: server_async_jobs # 等待VMs组的异步任务全部完成 - name: 等待VMs的apt update任务结束 async_status: jid: "{{ item.ansible_job_id }}" loop: "{{ vms_async_jobs.results }}" when: item.ansible_job_id is defined register: vms_job_status until: vms_job_status.finished retries: 30 delay: 10 # 等待Server组的异步任务全部完成 - name: 等待Server的apt update任务结束 async_status: jid: "{{ item.ansible_job_id }}" loop: "{{ server_async_jobs.results }}" when: item.ansible_job_id is defined register: server_job_status until: server_job_status.finished retries: 30 delay: 10
方案说明
- 合并主机组:将VMs和Server合并为同一个Play的目标主机,通过
when条件区分不同组的任务 - 串行控制:对VMs组的任务设置
throttle: 1,确保同一时间只有一台VMs主机执行任务 - 异步启动:两个任务都设置
async: 300(任务最大运行时间)和poll: 0(立即返回,不阻塞后续任务),让两组任务同时后台启动 - 等待任务完成:通过
async_status模块轮询任务状态,直到所有异步任务执行完毕
这样既保证了VMs组的串行执行,又让Server组的并行任务与VMs组同时启动,且无需拆分Playbook。
内容的提问来源于stack exchange,提问作者kutscher_tom
相关产品推荐
相关产品推荐

