2016-10-03 6 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変数で評価されていない

# 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テンプレートエンジンテンプレートではありませんが、それをそのまま返します。
不可能な2.xについてはhereと記載されています。
{{ vars[name]['test_var'] }}の場合は最初にname->'nested_var'が解決されますが、vars['nested_var']['test_var']が解決されずリテラル文字列として返されます。あなたの変数は、ホストの事実(在庫-ホスト/グループ変数、set_factによって設定されたダイナミックな事実)として定義されている場合

、あなたは動的変数にアクセスするhost_vars[inventory_hostname][dynamic_name]['subelement']ようhost_varsmagic variableにアクセスすることができます。あなたはknown_name[dynamic_name]['subelement']でダイナミック要素にアクセスすることができます。ここ

known_name: 
    nested_var: # this key name is known known in advance 
    subelement: "{{ 'value-1' if cpu == 'x64' else 'value-2' }}" 

:あなたの変数は再生/役割は、あなたのケースでのように、バインドされている場合は

、私は次のように、事前に定義された名前を持つルートハッシュを使用することをお勧めすることができます。

+0

'root-hash'トリックは私の問題をすべて解決しました。ありがとう。 –

関連する問題