在嵌套的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' }}"