如何让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拆分为两个单独文件,通过后台进程同时启动执行:
拆分文件:
win_install.yml:仅保留Windows的Playubu_install.yml:仅保留Ubuntu的Play
同时启动两个执行进程:
# 后台执行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
相关产品推荐
相关产品推荐

