$ ls play.d/roles/debug/*
play.d/roles/debug/tasks:
main.yml
play.d/roles/debug/vars:
main.yml
$ cat play.d/roles/debug/tasks/main.yml
- debug: msg="{{ name }}"
- debug: msg="{{ vars[name]['test_var'] }}"
- debug: msg="{{ vars['nested_var']['test_var'] }}"
- debug: msg="{{ test_var }}"
$ cat play.d/roles/debug/vars/main.yml
test_var: "{{ 'value-1' if cpu == 'x64' else 'value-2' }}"
nested_var:
test_var: "{{ 'value-1' if cpu == 'x64' else 'value-2' }}"
$ cat play.d/debug.yml
- hosts: all
gather_facts: yes
roles:
- debug
$ 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
谁做错了,我还是Ansible
?有什么想法吗?
# ansible --version
ansible 1.9.2
答案 0 :(得分:1)
我不确定你试图实现什么,但是你利用一种无证的方式通过vars
哈希来访问变量。
此vars
哈希是一种特殊的方式,Ansible模板引擎不会模板化它,但会按原样返回它的值。
对于Ansible 2.x,它描述了here
因此,如果是{{ vars[name]['test_var'] }}
,它将首先解析name->'nested_var'
,但不会解析vars['nested_var']['test_var']
并将其作为文字字符串返回。
如果您的变量被定义为主机事实(库存 - 主机/组变量,set_fact
设置的动态事实),您可以访问host_vars
magic variable,例如host_vars[inventory_hostname][dynamic_name]['subelement']
动态访问变量。
如果您的变量是播放/角色绑定,就像您的情况一样,我建议使用带有预定义名称的root-hash,例如:
known_name:
nested_var: # this key name is known known in advance
subelement: "{{ 'value-1' if cpu == 'x64' else 'value-2' }}"
您可以在此处按known_name[dynamic_name]['subelement']
访问动态元素。