如何并行运行不同Ansible Play,实现多主机组分批次部署?
实现Ansible多主机组并行部署且每组遵循先1台再全量的策略
我明白你的需求:你想让abc-servers和xyz-servers两组同时并行执行各自的部署流程——每组都先部署1台主机验证,成功后再批量部署剩余所有主机,而不是像原来那样串行等待,也不能合并组后打乱每组的部署节奏。
为什么合并主机组的方案行不通?
当你把两个组合并成abc-servers:xyz-servers时,serial规则是作用于整个合并后的主机池的。这就会出现你遇到的问题:只要任意一组的第一台部署成功,Ansible就会直接启动所有剩余主机(包括另一组的全部主机)的部署,完全破坏了你想要的每组独立的"先1台再全量"的逻辑。
解决方案:拆分Playbook+异步并行执行
我们可以把两个组的部署逻辑拆成独立的子Playbook,然后通过主Playbook异步启动这两个子任务,让它们并行运行,同时各自保留原有的serial规则。
步骤1:拆分出两个子Playbook
创建abc_deploy.yml,内容如下:
- hosts: abc-servers serial: - 1 - "100%" roles: - deploy
创建xyz_deploy.yml,内容如下:
- hosts: xyz-servers serial: - 1 - "100%" roles: - deploy
步骤2:编写主Playbook实现并行
创建main_deploy.yml,内容如下:
- name: 异步启动abc组部署任务 hosts: localhost tasks: - name: 执行abc组部署Playbook command: ansible-playbook -i inventory abc_deploy.yml async: 3600 # 设置足够长的超时时间(单位:秒) poll: 0 # 立即返回,后台执行任务 register: abc_deploy_task - name: 异步启动xyz组部署任务 hosts: localhost tasks: - name: 执行xyz组部署Playbook command: ansible-playbook -i inventory xyz_deploy.yml async: 3600 poll: 0 register: xyz_deploy_task - name: 等待两组部署任务全部完成 hosts: localhost tasks: - name: 等待abc组部署完成 async_status: jid: "{{ abc_deploy_task.ansible_job_id }}" register: abc_result until: abc_result.finished retries: 360 # 重试次数(每次间隔10秒,总时长360*10=3600秒) delay: 10 - name: 等待xyz组部署完成 async_status: jid: "{{ xyz_deploy_task.ansible_job_id }}" register: xyz_result until: xyz_result.finished retries: 360 delay: 10
步骤3:执行主Playbook
运行命令:
ansible-playbook -i inventory main_deploy.yml
关键说明
async: 3600和poll: 0的组合会让子Playbook在后台异步执行,主Playbook不会等待它完成,直接继续执行下一个任务,从而实现两组部署的并行。- 最后的
async_status任务会轮询等待两个异步任务完成,确保整个部署流程在两组都成功结束后才标记完成。 - 请根据你的实际部署时长调整
async、retries和delay的数值,避免超时或等待过久。
内容的提问来源于stack exchange,提问作者giraffe
相关产品推荐
相关产品推荐

