group_vars 是 Ansible 中实现逻辑集群参数中心化管理的核心机制,通过目录结构(如 group_vars/all/、group_vars/web/)按主机组复用变量,支持继承、加密隔离与动态注入。

在 Ansible 中,group_vars 是实现不同逻辑集群(如 prod、staging、web、db)参数中心化管理的核心机制。它让同一组主机复用统一变量,避免硬编码、重复定义,提升可维护性与环境隔离性。
按逻辑集群组织 inventory 和 group_vars 目录结构
Ansible 通过 inventory 文件定义主机组,再通过同名目录或文件在 group_vars/ 下存放对应变量。推荐使用目录形式(更清晰、支持多文件):
- inventory/production
├── hosts
└── group_vars/
└── all/ # 全局变量(所有环境都继承)
├── vars.yml
└── secrets.yml # (建议用 ansible-vault 加密) - inventory/staging
├── hosts
└── group_vars/
├── all/
├── web/
│ └── app_config.yml # web 组专属参数:nginx 端口、应用版本等
└── db/
└── db_config.yml # db 组专属参数:PostgreSQL 版本、备份策略
执行时指定 inventory:ansible-playbook deploy.yml -i inventory/production
Ansible 自动加载 inventory/production/group_vars/ 下匹配主机组的变量(优先级:host_vars > group_vars/组名 > group_vars/all)。
利用组继承关系复用和覆盖变量
逻辑集群常存在层级关系,例如:prod 继承 linux_servers,而 linux_servers 又继承 all。可在 inventory 中用 :children 定义:
[all:vars] ansible_user = "deploy" <p>[linux_servers:children] web db</p><p>[prod:children] linux_servers</p><h1>prod 可额外定义:prod_only_flag: true</h1><p>[staging:children] linux_servers</p><h1>staging 可覆盖:app_debug_mode: true</h1>
对应 group_vars/ 中:
– group_vars/all/vars.yml 定义基础连接参数;
– group_vars/linux_servers/ 定义通用服务配置(如时区、logrotate);
– group_vars/prod/ 只写差异项(如 max_connections: 200),其余自动继承。
敏感参数安全隔离:vault + 分层文件命名
数据库密码、API 密钥等不应明文暴露。做法是:
- 将敏感变量单独拆到
group_vars/(如/secrets.yml group_vars/prod/secrets.yml) - 用
ansible-vault encrypt group_vars/prod/secrets.yml加密 - 运行时加
--ask-vault-pass或配置vault_password_file - 确保
secrets.yml不被误提交:在.gitignore中加入secrets.yml,或统一用*_secrets.yml模式
非敏感参数(如端口、路径)保留在普通 YAML 中,兼顾可读性与安全性。
动态参数注入:结合 inventory 脚本与 group_vars
当集群规模大或节点动态变化(如云环境),可用动态 inventory 脚本(如 aws_ec2.py)生成主机组,再配合 group_vars 注入逻辑属性:
- 脚本输出中为每台 EC2 主机打标签:
"tags": {"env": "prod", "tier": "web"} - Ansible 自动创建组
ec2_tag_env_prod和ec2_tag_tier_web - 在
group_vars/ec2_tag_env_prod/下定义生产环境共性变量 - 在
group_vars/ec2_tag_tier_web/下定义 Web 层部署逻辑(如启用 CDN、健康检查路径)
这样无需手动维护 hosts 文件,变量仍由 group_vars 中心管控,实现“基础设施即代码”下的参数治理。











