如何组织数据中心和环境的Ansible库存?

时间:2017-03-22 20:09:57

标签: ansible ansible-inventory

如果我们有2个数据中心,东西方。

然后我们有3个环境DEV,QA,PROD。

每个数据中心和环境都有自己的Consul集群。

现在我想从库存中引用Consul集群,例如:

consul_servers: "{{ groups['consul'] | to_json }}"

如何组织我的库存和group_vars只能为该数据中心和环境生成适当的Consul群集主机?

我的想法是每个数据中心和环境都有一个库存文件。

例如:

  • 西dev.ini
  • 西qa.ini
  • 西prod.ini
  • 东dev.ini
  • 东qa.ini
  • 东prod.ini

这似乎是合理的,但现在我如何解决group_vars中仅限环境或仅限数据中心的变量?我会让他们成为儿童团体吗?

1 个答案:

答案 0 :(得分:1)

其中一种方法是使用符号链接。在单独的文件中定义所有公共环境和数据中心变量,然后将所有必需的组合作为子文件夹,group_vars/all包含指向相应var文件的链接。

以下是两个数据中心east/west和两个环境dev/prod的示例:

virt_inv/
├── dc_east.yml
├── dc_west.yml
├── east-prod
│   ├── group_vars
│   │   └── all
│   │       ├── dc.yml -> ../../../dc_east.yml
│   │       └── env.yml -> ../../../env_prod.yml
│   └── hosts
├── env_dev.yml
├── env_prod.yml
└── west-dev
    ├── group_vars
    │   └── all
    │       ├── dc.yml -> ../../../dc_west.yml
    │       └── env.yml -> ../../../env_dev.yml
    └── hosts

我这里仅定义了east-prodwest-dev组合,但您可以以类似的方式制作其他组合。

这是演示内容:

$ find virt_inv -type f -print -exec cat {} \;
virt_inv/dc_east.yml
datacenter: east-02
virt_inv/dc_west.yml
datacenter: west-01
virt_inv/east-prod/hosts
[servers]
host4
host5
virt_inv/env_dev.yml
env: developer
virt_inv/env_prod.yml
env: production
virt_inv/west-dev/hosts
[servers]
host1
host2

结果:

$ ansible all -i virt_inv/east-prod/hosts -m debug -a 'msg={{datacenter}}-{{env}}'
host5 | SUCCESS => {
    "msg": "east-02-production"
}
host4 | SUCCESS => {
    "msg": "east-02-production"
}

$ ansible all -i virt_inv/west-dev/hosts -m debug -a 'msg={{datacenter}}-{{env}}'
host2 | SUCCESS => {
    "msg": "west-01-developer"
}
host1 | SUCCESS => {
    "msg": "west-01-developer"
}