在嵌套的ansible变量中不计算表达式
通过这个非常简单的设置,我希望在嵌套的ansible变量中不计算表达式,ansible,Ansible,通过这个非常简单的设置,我希望Ansible应该计算内联条件,而不管它们的位置如何(顶级或嵌套)。然而,嵌套变量似乎变成了表达式的文字字符串: $ cat inv.d/inv [all:vars] cpu = 'x64' [test-srv] 52.19.xxx.xxx 谁做错了,我还是Ansible?有什么想法吗 # ansible-playbook -i inv.d/inv play.d/debug.yml -e name=nested_var -l test-srv PLAY [al
Ansible
应该计算内联条件,而不管它们的位置如何(顶级或嵌套)。然而,嵌套变量似乎变成了表达式的文字字符串:
$ cat inv.d/inv
[all:vars]
cpu = 'x64'
[test-srv]
52.19.xxx.xxx
谁做错了,我还是Ansible?有什么想法吗
# ansible-playbook -i inv.d/inv play.d/debug.yml -e name=nested_var -l test-srv
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [52.19.xxx.xxx]
TASK: [debug | debug msg="{{ name }}"] ****************************************
ok: [52.19.xxx.xxx] => {
"msg": "nested_var"
}
TASK: [debug | debug msg="{{ vars[name]['test_var'] }}"] **********************
ok: [52.19.xxx.xxx] => {
"msg": "{{'value-1' if cpu == 'x64' else 'value-2'}}"
}
TASK: [debug | debug msg="{{ vars['nested_var']['test_var'] }}"] **************
ok: [52.19.xxx.xxx] => {
"msg": "{{'value-1' if cpu == 'x64' else 'value-2'}}"
}
TASK: [debug | debug msg="{{ 'value-1' if cpu == 'x64' else 'value-2' }}"] ****
ok: [52.19.xxx.xxx] => {
"msg": "value-1"
}
PLAY RECAP ********************************************************************
52.19.xxx.xxx : ok=5 changed=0 unreachable=0 failed=0
我不确定您试图实现什么,但您利用了一种未经记录的方式,通过
vars
hash访问变量。这个
vars
散列非常特殊,Ansible template engine不会对其进行模板化,而是按原样返回其值。对于Ansible 2.x,已对其进行了描述。
因此,在
{{vars[name]['test\u var']}
的情况下,它将首先解析name->'nested\u var'
,但不会解析vars['nested\u var']['test\u var']
并将其作为文本字符串返回
如果您的变量定义为主机事实(清单主机/组变量,由set\u fact
设置的动态事实),您可以访问host\u vars
像host\u vars[inventory\u hostname][dynamic\u name]['subelement']
那样动态访问变量
如果您的变量是play/role绑定的,比如在您的例子中,我建议使用具有预定义名称的根哈希,比如:
# ansible --version
ansible 1.9.2
在这里,您可以通过
known\u name[dynamic\u name]['subelement']
访问动态元素。我不确定您想实现什么,但您利用了一种未经记录的方式,通过vars
哈希访问变量。这个
vars
散列非常特殊,Ansible template engine不会对其进行模板化,而是按原样返回其值。对于Ansible 2.x,已对其进行了描述。
因此,在
{{vars[name]['test\u var']}
的情况下,它将首先解析name->'nested\u var'
,但不会解析vars['nested\u var']['test\u var']
并将其作为文本字符串返回
如果您的变量定义为主机事实(清单主机/组变量,由set\u fact
设置的动态事实),您可以访问host\u vars
像host\u vars[inventory\u hostname][dynamic\u name]['subelement']
那样动态访问变量
如果您的变量是play/role绑定的,比如在您的例子中,我建议使用具有预定义名称的根哈希,比如:
# ansible --version
ansible 1.9.2
在这里,您可以通过known\u name[dynamic\u name]['subelement']
访问动态元素
$ cat inv.d/inv
[all:vars]
cpu = 'x64'
[test-srv]
52.19.xxx.xxx
# ansible-playbook -i inv.d/inv play.d/debug.yml -e name=nested_var -l test-srv
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [52.19.xxx.xxx]
TASK: [debug | debug msg="{{ name }}"] ****************************************
ok: [52.19.xxx.xxx] => {
"msg": "nested_var"
}
TASK: [debug | debug msg="{{ vars[name]['test_var'] }}"] **********************
ok: [52.19.xxx.xxx] => {
"msg": "{{'value-1' if cpu == 'x64' else 'value-2'}}"
}
TASK: [debug | debug msg="{{ vars['nested_var']['test_var'] }}"] **************
ok: [52.19.xxx.xxx] => {
"msg": "{{'value-1' if cpu == 'x64' else 'value-2'}}"
}
TASK: [debug | debug msg="{{ 'value-1' if cpu == 'x64' else 'value-2' }}"] ****
ok: [52.19.xxx.xxx] => {
"msg": "value-1"
}
PLAY RECAP ********************************************************************
52.19.xxx.xxx : ok=5 changed=0 unreachable=0 failed=0
# ansible --version
ansible 1.9.2
known_name:
nested_var: # this key name is known known in advance
subelement: "{{ 'value-1' if cpu == 'x64' else 'value-2' }}"