Ansible多环境配置核心是分层隔离、变量外置、角色封装、清单驱动;按环境分目录管理inventory,用group_vars正交叠加维度,角色解耦环境逻辑,敏感配置按环境加密。

Ansible 处理多维度环境配置,关键不在于堆砌变量或硬编码判断,而在于把“环境差异”变成可组合、可复用、可验证的结构。核心思路是:分层隔离 + 变量外置 + 角色封装 + 清单驱动。
多环境配置必须分目录管理 inventory
不同环境(dev/staging/prod)的主机清单、网络策略、访问权限、密钥来源都不同,混在一个文件里极易出错。推荐按环境拆分为独立子目录:
inventories/
├── development/
│ ├── hosts
│ └── group_vars/
│ └── all.yml # 开发通用配置(如 debug=true)
├── staging/
│ ├── hosts
│ └── group_vars/
│ ├── all.yml
│ └── app.yml # 预发环境特有参数(如 feature_flags: [“canary”])
└── production/
├── hosts
└── group_vars/
├── all.yml
└── db.yml # 生产数据库连接池、SSL强制等每个 hosts 文件只定义机器 IP 和基础连接参数;所有配置项(包括敏感值)统一放在对应 group_vars/ 下。这样执行时只需指定路径:ansible-playbook -i inventories/production site.yml
用 group_vars 实现配置维度正交叠加
环境不是单一标签,而是多个正交维度的组合:比如「地域」+「用途」+「安全等级」。Ansible 允许你为同一台主机同时归属多个组,并自动合并变量(优先级:host_vars > group_vars > playbook vars)。
例如一台机器既是 prod 又是 us-west 还属于 payment-service 组:
# inventories/production/hosts [payment-service] pay01 ansible_host=10.20.30.101 [us-west] pay01 [prod] pay01
再分别定义:
-
inventories/production/group_vars/prod.yml→env: prod,log_level: warn -
inventories/production/group_vars/us-west.yml→region: us-west-2,dns_suffix: aws -
inventories/production/group_vars/payment-service.yml→max_connections: 200,pci_compliant: true
Ansible 自动合并后,pay01 就拥有了全部三组变量,无需重复声明或条件判断。
角色(Roles)按职责解耦,避免环境逻辑侵入任务层
不要在 tasks/main.yml 里写 when: env == 'prod'。这种写法会让角色失去复用性,也增加测试难度。
正确做法是:角色只关心“做什么”,不关心“在哪做”。把环境差异收口到变量层:
# roles/app/defaults/main.yml
app_config:
timeout: "{{ default_timeout | default(30) }}"
cache_ttl: "{{ cache_ttl_seconds | default(600) }}"
# playbooks/deploy-app.yml
- name: Deploy application
hosts: app_servers
roles:
- app然后在 inventories/staging/group_vars/app.yml 中覆盖:
cache_ttl_seconds: 60 default_timeout: 5
生产环境则设为:
cache_ttl_seconds: 3600 default_timeout: 120
角色代码完全不变,部署行为却已适配环境——这才是真正的灵活。
敏感配置必须加密,且与环境绑定
数据库密码、API密钥等不能明文写在 group_vars 里。Ansible Vault 支持按文件加密,建议按环境单独加密:
ansible-vault encrypt inventories/production/group_vars/db.yml ansible-vault encrypt inventories/staging/group_vars/db.yml
执行时加 --ask-vault-pass 或用 vault_password_file 统一管理。这样既保证安全,又保留各环境独立维护密钥的能力。
不复杂但容易忽略

















