You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个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

方案说明

  1. 合并主机组:将VMs和Server合并为同一个Play的目标主机,通过when条件区分不同组的任务
  2. 串行控制:对VMs组的任务设置throttle: 1,确保同一时间只有一台VMs主机执行任务
  3. 异步启动:两个任务都设置async: 300(任务最大运行时间)和poll: 0(立即返回,不阻塞后续任务),让两组任务同时后台启动
  4. 等待任务完成:通过async_status模块轮询任务状态,直到所有异步任务执行完毕

这样既保证了VMs组的串行执行,又让Server组的并行任务与VMs组同时启动,且无需拆分Playbook。

内容的提问来源于stack exchange,提问作者kutscher_tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:27:26