如何用数据中心和环境组织 Ansible 清单?
How to organize Ansible inventory with datacenter and environment?
如果我们有 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 中的仅环境变量或仅数据中心变量?我要把它们设为儿童组吗?
其中一种方法是使用符号链接。在单独的文件中定义所有常见的环境和数据中心变量,然后将所有必需的组合作为子文件夹,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-prod
和 west-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"
}
如果我们有 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 中的仅环境变量或仅数据中心变量?我要把它们设为儿童组吗?
其中一种方法是使用符号链接。在单独的文件中定义所有常见的环境和数据中心变量,然后将所有必需的组合作为子文件夹,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-prod
和 west-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"
}