Ansible - 通过对同一变量使用多个值来部署到同一主机
Ansible - Deploy to same host with using mutiple values for same variable
Ansible 版本:2.4.2.0
我正在使用一个目录作为我的清单,其中有 2 个文件 - a 、 b
文件一个
[frontend]
hostname001
[frontend:vars]
envt=frontend
文件 b
[backend]
hostname001
[backend:vars]
envt=backend
变量的值被覆盖,只有后端保留。
剧本样本
- name: Sample play
hosts: '{{ group }}'
connection: local
tasks:
- name: "Do a demo"
debug:
msg: 'The envt is {{envt}}'
当我尝试通过将 group=frontend 作为 extravar 传递来部署前端时,输出如下
确定:[hostname001] => {
"msg": "The envt is backend"
}
我怎样才能确保选择了正确的变量。
问题是无论您如何设置 group
变量,您的主机 hostname001
仍然是这两个组的成员。您将需要使用不同的方法来解决这个问题。
一个选项是简单地将变量移出您的库存,并有几个单独的变量文件,您可以使用 -e
选项。例如,您可以这样调用 ansible-playbook
:
ansible-playbook playbook.yml -e @config1.yml
或:
ansible-playbook playbook.yml -e @config2.yml
或者,也许您可以设置变量 per-play 而不是 per-group。
作为最后一个选项,您可以为每个组中的目标主机指定一个不同的名称。例如,类似于:
[backend]
hostname001-backend ansible_host=hostname001
[backend:vars]
envt=backend
[frontend]
hostname001-frontend ansible_host=hostname001
[frontend:vars]
envt=frontend
使用该清单,我们看到:
$ ansible-playbook playbook.yml -e group=frontend
PLAY [Sample play] ***************************************************************************
TASK [Do a demo] *****************************************************************************
ok: [hostname001-frontend] => {
"msg": "The envt is frontend"
}
PLAY RECAP ***********************************************************************************
hostname001-frontend : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
$ ansible-playbook playbook.yml -e group=backend
PLAY [Sample play] ***************************************************************************
TASK [Do a demo] *****************************************************************************
ok: [hostname001-backend] => {
"msg": "The envt is backend"
}
PLAY RECAP ***********************************************************************************
hostname001-backend : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ansible 版本:2.4.2.0
我正在使用一个目录作为我的清单,其中有 2 个文件 - a 、 b
文件一个
[frontend]
hostname001
[frontend:vars]
envt=frontend
文件 b
[backend]
hostname001
[backend:vars]
envt=backend
变量的值被覆盖,只有后端保留。
剧本样本
- name: Sample play
hosts: '{{ group }}'
connection: local
tasks:
- name: "Do a demo"
debug:
msg: 'The envt is {{envt}}'
当我尝试通过将 group=frontend 作为 extravar 传递来部署前端时,输出如下
确定:[hostname001] => { "msg": "The envt is backend" }
我怎样才能确保选择了正确的变量。
问题是无论您如何设置 group
变量,您的主机 hostname001
仍然是这两个组的成员。您将需要使用不同的方法来解决这个问题。
一个选项是简单地将变量移出您的库存,并有几个单独的变量文件,您可以使用 -e
选项。例如,您可以这样调用 ansible-playbook
:
ansible-playbook playbook.yml -e @config1.yml
或:
ansible-playbook playbook.yml -e @config2.yml
或者,也许您可以设置变量 per-play 而不是 per-group。
作为最后一个选项,您可以为每个组中的目标主机指定一个不同的名称。例如,类似于:
[backend]
hostname001-backend ansible_host=hostname001
[backend:vars]
envt=backend
[frontend]
hostname001-frontend ansible_host=hostname001
[frontend:vars]
envt=frontend
使用该清单,我们看到:
$ ansible-playbook playbook.yml -e group=frontend
PLAY [Sample play] ***************************************************************************
TASK [Do a demo] *****************************************************************************
ok: [hostname001-frontend] => {
"msg": "The envt is frontend"
}
PLAY RECAP ***********************************************************************************
hostname001-frontend : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
$ ansible-playbook playbook.yml -e group=backend
PLAY [Sample play] ***************************************************************************
TASK [Do a demo] *****************************************************************************
ok: [hostname001-backend] => {
"msg": "The envt is backend"
}
PLAY RECAP ***********************************************************************************
hostname001-backend : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0