推荐采用 inventory 目录结构而非单文件,将不同环境拆分为独立子目录,配合 group_vars 管理变量,适合需要隔离配置的多环境场景。
核心结论:使用目录组织 inventory 是 Ansible 官方推荐的多环境管理方式,能避免变量冲突并提升可维护性。
- 适用场景:拥有开发、测试、生产等多套独立环境的项目
- 前置准备:规划好目录层级,区分主机列表与变量文件
- 验收标准:通过 ansible-inventory 命令确认主机分组与变量加载无误
推荐目录结构
建议在项目根目录下创建 inventories 文件夹,按环境名称划分子目录。每个环境目录包含 hosts 文件及 group_vars 文件夹。示例结构如下:
project/
├── inventories/
│ ├── prod/
│ │ ├── hosts
│ │ └── group_vars/
│ │ └── all.yml
│ └── dev/
│ ├── hosts
│ └── group_vars/
│ └── all.yml
└── site.yml配置文件编写示例
hosts 文件内容
在 inventories/prod/hosts 中定义主机分组,支持 INI 或 YAML 格式。以下为 INI 格式示例:
[webservers]
web1.prod.example.com
web2.prod.example.com[dbservers]
db1.prod.example.comgroup_vars 变量文件
在 inventories/prod/group_vars/all.yml 中定义该环境通用变量,格式为 YAML:
http_port: 80
admin_user: admin
ntp_server: ntp.prod.example.com执行与验证
执行 playbook 时通过 -i 参数指定环境目录,不要依赖默认路径:
ansible-playbook -i inventories/prod site.yml使用 ansible-inventory 命令查看特定环境的主机列表与变量加载情况,输出为 JSON 格式:
ansible-inventory `--list` -i inventories/prod预期输出片段示例:
{"all": {"hosts": {"web1.prod.example.com": {}},"children": ["webservers","dbservers"]},"webservers": {"hosts": ["web1.prod.example.com","web2.prod.example.com"]}
}检查 groups 变量是否包含预期环境参数,确认没有混入其他环境主机。
注意事项
- 变量优先级:inventory 目录下的 group_vars 变量优先级通常较高,具体规则建议参考官方变量优先级文档,避免在同名变量上产生冲突。
- 敏感信息:不要将密码等敏感信息明文提交到版本控制,建议配合 ansible-vault 加密存储。
- 语法检查:修改 hosts 或变量文件后,先运行 ansible-inventory 验证语法,再执行 playbook。
参考来源
- Ansible Documentation, "Working with Inventory", https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
- Ansible Documentation, "Best Practices", https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html
原文链接:https://www.zjcp.cc/ask/11065.html
