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

如何让Ansible Playbook中的两个Play并行执行?

问题描述

我有一个包含两个Play的Ansible Playbook,当前它们是串行执行的(先跑完Windows主机的所有任务,再开始Ubuntu主机的任务),希望将这两个Play改为并行执行。

当前Playbook内容:

---
- name: Install windows_hosts
  hosts: win
  tasks:
    # Windows specific tasks

- name: Install ubuntu_hosts
  hosts: ubu
  tasks:
    # Ubuntu specific tasks
  become: true

主机清单文件内容:

win:
  hosts:
    win-host:
      ansible_host: <IP>
  vars:
    ansible_connection: winrm
    ansible_winrm_transport: certificate
    ansible_winrm_user: ansible
    ansible_winrm_cert_pem: <CERT-PATH>
    ansible_winrm_cert_key_pem: <CERT-KEY-PATH>
    ansible_port: <PORT>
    ansible_winrm_scheme: https
    ansible_gather_timeout: 300
    ansible_winrm_read_timeout_sec: 60
ubu:
  hosts:
    ubu-host:
      ansible_host: <IP>
  vars:
    ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
实现Play并行执行的方法

方法1:合并Play+forks参数(推荐轻量场景)

Ansible默认串行执行Play,但可以把两个主机组合并到同一个Play中,配合--forks参数实现跨系统主机并行执行。

修改后的Playbook:

---
- name: Install on all hosts
  hosts: win, ubu
  tasks:
    # Windows专属任务,仅在Windows主机执行
    - name: Run Windows specific tasks
      when: ansible_os_family == 'Windows'
      # 填入原Windows Play的任务内容

    # Ubuntu专属任务,仅在Ubuntu主机执行,且提权
    - name: Run Ubuntu specific tasks
      when: ansible_os_family == 'Debian'
      become: true
      # 填入原Ubuntu Play的任务内容

执行时指定足够的并发数(至少2,对应两台主机):

ansible-playbook your_playbook.yml --forks 2

注意:需用when条件严格区分任务的执行主机,避免跨系统执行错误;become权限控制可以放到任务级别,仅给Ubuntu任务启用。

方法2:拆分Play+后台进程(完全独立并行)

如果需要保留两个Play的独立结构,可以将原Playbook拆分为两个单独文件,通过后台进程同时启动执行:

  1. 拆分文件:

    • win_install.yml:仅保留Windows的Play
    • ubu_install.yml:仅保留Ubuntu的Play
  2. 同时启动两个执行进程:

# 后台执行Windows Play,输出日志到文件
ansible-playbook win_install.yml > win_exec.log 2>&1 &
# 后台执行Ubuntu Play,输出日志到文件
ansible-playbook ubu_install.yml > ubu_exec.log 2>&1 &
# 等待两个进程完成
wait

这种方式让两个Play完全独立运行,适合需要分开日志或单独控制执行的场景。

方法3:Ansible Tower/AWX工作流(企业级方案)

如果使用Ansible Tower或AWX,可以创建并行工作流,将两个Play配置为并行执行节点,实现可视化的并行任务管理、监控和日志统一收集,适合长期自动化运维场景。

注意事项
  • 方法1的--forks数值需根据主机数量调整,确保控制节点能承载对应并发连接
  • 并行执行时需注意控制节点的资源占用,避免同时启动过多任务导致负载过高
  • 如果两个Play之间存在依赖关系(比如一个Play的输出是另一个的输入),则不适合并行执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:05:19