如何指定Ansible库存中服务器组的Play执行顺序以实现零停机部署?
实现Ansible按指定顺序的零停机部署
你的问题根源在于:当指定hosts: GROUP-A, GROUP-B时,Ansible会自动对主机列表去重,实际只会按server-1、server-2的顺序各执行一次Play,无法实现同一主机上先跑GROUP-A再跑GROUP-B的重复执行逻辑。以下是两种可行的解决方案:
方案1:拆分独立Play(适合少量服务器)
直接为每个组+主机的组合创建单独的Play,严格控制执行顺序:
# 完整Playbook示例 - name: 部署GROUP-A到server-1 hosts: server-1 become: false gather_facts: true tasks: # 替换为GROUP-A的实际部署任务 - name: 执行GROUP-A部署操作 debug: msg="完成GROUP-A在server-1上的部署" - name: 部署GROUP-B到server-1 hosts: server-1 become: false gather_facts: true tasks: # 替换为GROUP-B的实际部署任务 - name: 执行GROUP-B部署操作 debug: msg="完成GROUP-B在server-1上的部署" - name: 部署GROUP-A到server-2 hosts: server-2 become: false gather_facts: true tasks: - name: 执行GROUP-A部署操作 debug: msg="完成GROUP-A在server-2上的部署" - name: 部署GROUP-B到server-2 hosts: server-2 become: false gather_facts: true tasks: - name: 执行GROUP-B部署操作 debug: msg="完成GROUP-B在server-2上的部署"
方案2:复用任务+Serial控制(适合大量服务器)
如果服务器数量较多,可将分组任务拆分到独立文件,通过serial:1保证单主机串行执行,每个主机上先完成GROUP-A任务再执行GROUP-B任务:
- 创建
group_a_tasks.yml(存放GROUP-A的部署任务):
- name: GROUP-A部署步骤1 debug: msg="GROUP-A在{{ inventory_hostname }}上执行步骤1" - name: GROUP-A部署步骤2 debug: msg="GROUP-A在{{ inventory_hostname }}上执行步骤2"
- 创建
group_b_tasks.yml(存放GROUP-B的部署任务):
- name: GROUP-B部署步骤1 debug: msg="GROUP-B在{{ inventory_hostname }}上执行步骤1" - name: GROUP-B部署步骤2 debug: msg="GROUP-B在{{ inventory_hostname }}上执行步骤2"
- 主Playbook文件:
- name: 按顺序完成所有主机的分组部署 hosts: server-1,server-2 # 也可直接用all,根据库存调整范围 become: false gather_facts: true serial: 1 # 一次仅处理一台主机 tasks: - name: 执行GROUP-A的部署任务 include_tasks: group_a_tasks.yml when: inventory_hostname in groups['GROUP-A'] - name: 执行GROUP-B的部署任务 include_tasks: group_b_tasks.yml when: inventory_hostname in groups['GROUP-B']
此方案的执行顺序完全符合你的需求:
- server-1 → GROUP-A任务 → GROUP-B任务
- server-2 → GROUP-A任务 → GROUP-B任务
内容的提问来源于stack exchange,提问作者Sunny Mohite
相关产品推荐
相关产品推荐

