Ansible 如何配置 inventory 文件实现多环境分组管理?

文章导读
推荐采用 inventory 目录结构而非单文件,将不同环境拆分为独立子目录,配合 group_vars 管理变量,适合需要隔离配置的多环境场景。
📋 目录
  1. 推荐目录结构
  2. 配置文件编写示例
  3. 执行与验证
  4. 注意事项
  5. 参考来源
A A

推荐采用 inventory 目录结构而非单文件,将不同环境拆分为独立子目录,配合 group_vars 管理变量,适合需要隔离配置的多环境场景。

核心结论:使用目录组织 inventory 是 Ansible 官方推荐的多环境管理方式,能避免变量冲突并提升可维护性。

  • 适用场景:拥有开发、测试、生产等多套独立环境的项目
  • 前置准备:规划好目录层级,区分主机列表与变量文件
  • 验收标准:通过 ansible-inventory 命令确认主机分组与变量加载无误

推荐目录结构

建议在项目根目录下创建 inventories 文件夹,按环境名称划分子目录。每个环境目录包含 hosts 文件及 group_vars 文件夹。示例结构如下:

Ansible 如何配置 inventory 文件实现多环境分组管理?
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.com

group_vars 变量文件

在 inventories/prod/group_vars/all.yml 中定义该环境通用变量,格式为 YAML:

Ansible 如何配置 inventory 文件实现多环境分组管理?
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 文件实现多环境分组管理?
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