2016-10-03 3 views
0
$ 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 

ответ

1

Я не уверен, что вы пытаетесь достичь, но вы использовать недокументированный способ доступа к переменным через vars хэш.
И этот vars хэш особенный, так что Ansible template engine не будет шаблон, но верните его значение как есть.
Для Ansible 2.x описано here.
Так что в случае {{ vars[name]['test_var'] }} он сначала разрешит name->'nested_var', но затем не разрешит vars['nested_var']['test_var'] и вернет его как литеральную строку.

Если переменные определены как факты хозяевах (инвентарный-хост/группы переменных, динамические факты, установленные set_fact), вы можете получить доступ к host_varsmagic variable как host_vars[inventory_hostname][dynamic_name]['subelement'] доступ к переменной динамически.

Если переменные играют/роль связана, как в вашем случае, я могу предложить использовать корневой хэш с предопределенным именем, например:

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'].

+0

'root-hash' трюк решил мою проблему в целом, спасибо. –

Смежные вопросы