我在使用变量变量方式从我的playbook访问extra-vars时遇到问题。 例如,我创建了一个包含内容的group_vars / mygroup.yml文件:
MYVAR=AAAA
然后我调用命令并传递extra-vars: ansible-playbook -i test playbook.yml --extra-vars“MYVAR = BBB”
我需要从存在变量列表中获取MYVAR的实际值。我试着这样做:
- debug: var=hostvars[inventory_hostname]['MYVAR']
......我得到了
TASK: [test | debug var=AAA] *******************************
ok: [192.168.1.21] => {
"var": {
"AAA": "BBB"
}
}
TASK: [test | debug var=hostvars[inventory_hostname]['AAA']] ***
ok: [192.168.1.21] => {
"var": {
"hostvars[inventory_hostname]['AAA']": "AAA" // ← THIS IS THE PROBLEM
}
}
如何获得从cli传递的AAA的实际值? 请不要直接使用名称来使用AAA,因为这是更复杂逻辑的一部分,当我有一个已注册变量列表而我不能使用它们的名字时。
hostvars[inventory_hostname][**item**] ← variable of variable
提前谢谢。
更新:或也许Ansible已经支持这样的事情了?:
VARNAME: APP_ENV
APP_ENV: blabla
debug: var=${VARNAME} // blabla expected
更新2:问题解释github gist。
答案 0 :(得分:1)
TLDR; - debug: msg="{{ AAA|default(hostvars[inventory_hostname]['AAA']) }}"
在定义时使用变量AAA
,否则使用hostvar(groupvar)AAA
#./main.yml
---
- hosts: all
gather_facts: false
tasks:
- debug: msg="{{ foo }}"
- debug: msg="{{ hostvars[inventory_hostname]['foo'] }}"
- debug: msg="{{ foo|default(hostvars[inventory_hostname]['foo']) }}"
#./inventory
[one]
localhost ansible_connection=local
#./group_vars/one
---
foo: "bar"
ansible-playbook -i inventory -e "foo=whatever" main.yml
PLAY [all] ********************************************************************
TASK: [debug msg="{{ foo }}"] *************************************************
ok: [localhost] => {
"msg": "whatever"
}
TASK: [debug msg="{{ hostvars[inventory_hostname]['foo'] }}"] *****************
ok: [localhost] => {
"msg": "bar"
}
TASK: [debug msg="{{ foo|default(hostvars[inventory_hostname]['foo']) }}"] ****
ok: [localhost] => {
"msg": "whatever"
}
PLAY RECAP ********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
答案 1 :(得分:0)
命令行额外定义不是hostvars的一部分。
您可以通过{{ MYVAR }}
- debug: msg="{{ MYVAR }}"
答案 2 :(得分:0)
现在,在ansible 2.0发布后,the problem from gist example消失了:
ansible-playbook -i localhost.ini test.yml --extra-vars="AAA=BBB"
TASK [debug] *****************
ok: [localhost] => (item=AAA) => {
"item": "AAA",
"msg": "BBB"
}
所以,就像@chrism said一样,这是一个错误。