Ansible多数据中心部署:Inventory编排与Playbook配置方案咨询
问题描述
现有开发环境配置
Inventory 文件(dev)
[dev] service1 ansible_host=dev1.com ansible_port=22 ansible_user=ubuntu service2 ansible_host=dev1.com ansible_port=22 ansible_user=ubuntu service3 ansible_host=dev1.com ansible_port=22 ansible_user=ubuntu
部署执行的 Roles
roles: - sync_code - prep_local - build - shutdown_app - setup_host - start_app
当前开发环境设置了 serial: yes,部署时各 Role 按顺序执行。
生产环境需求
生产环境(prod)包含 DC1、DC2 两个数据中心,每个数据中心有多台可承载 service1 的服务器。部署 service1 时要求:
- 每次从 DC1 和 DC2 各选 1 台服务器
- 在这两台服务器上同时按顺序执行所有 Roles
- 完成一组后,再选取下一组各 1 台服务器继续部署
需要解决:如何组织生产环境的 Inventory 文件,以及在 Playbook 中配置主机参数实现该需求。
解决方案
1. 生产环境 Inventory 组织
按数据中心和服务分组,方便后续精准选取主机:
# 数据中心独立分组 [dc1] prod-dc1-01 ansible_host=dc1-prod-01.com ansible_port=22 ansible_user=ubuntu prod-dc1-02 ansible_host=dc1-prod-02.com ansible_port=22 ansible_user=ubuntu prod-dc1-03 ansible_host=dc1-prod-03.com ansible_port=22 ansible_user=ubuntu [dc2] prod-dc2-01 ansible_host=dc2-prod-01.com ansible_port=22 ansible_user=ubuntu prod-dc2-02 ansible_host=dc2-prod-02.com ansible_port=22 ansible_user=ubuntu prod-dc2-03 ansible_host=dc2-prod-03.com ansible_port=22 ansible_user=ubuntu # 合并为 service1 的生产主机组 [prod_service1:children] dc1 dc2
这样分组后,prod_service1 包含所有数据中心的 service1 主机,同时可通过 dc1、dc2 单独定位对应数据中心的机器。
2. Playbook 配置实现分组并行部署
方案一:动态分组配对(精准控制批次,推荐)
通过给主机标记批次号,让同编号的 DC1、DC2 主机分到一组,再按批次执行所有 Roles:
- name: 给主机标记批次 hosts: prod_service1 gather_facts: yes order: sorted # 按主机名排序,保证同编号主机配对 tasks: - name: 按编号生成批次组 group_by: key: "batch_{{ inventory_hostname.split('-')[-1] }}" run_once: false - name: 按批次执行部署 Roles hosts: batch_* serial: 1 # 每个批次的2台主机同时执行所有步骤 roles: - sync_code - prep_local - build - shutdown_app - setup_host - start_app
说明:
- 主机名最后一位数字作为批次号,比如
prod-dc1-01和prod-dc2-01会被分到batch_01 - 第二个 Play 针对每个批次执行,确保同批次的两台主机并行完成所有 Roles 后,再处理下一批
方案二:串行选主机+自由策略(无需严格编号配对)
如果不需要严格按编号配对,只要每次从两个数据中心各选1台,可使用以下配置:
- name: 部署 prod 环境的 service1 hosts: prod_service1 strategy: free serial: - 1 # 先选1台(优先DC1,取决于Inventory顺序) - 1 # 再选1台(DC2) roles: - sync_code - prep_local - build - shutdown_app - setup_host - start_app
说明:
strategy: free允许主机完成当前任务后直接执行下一个,不用等待同批次其他主机serial: [1,1]会每次选取两台不同数据中心的主机,并行执行所有 Roles
关键注意点
- 主机命名最好带规律编号,方便精准配对分组
- 若要求每批必须是 DC1、DC2 各1台,方案一的动态分组更可靠
serial参数控制每次处理的主机数量,结合分组可实现精准批次控制
内容的提问来源于stack exchange,提问作者Diocese0721
相关产品推荐
相关产品推荐

