2015-10-28 8 views
7

変数test_varが存在する場合(-e in command lineが渡された場合)、InterestingVar dictキーとそれに関連する値を追加したいとします。不可能なプレイブックのdictにキー/値を追加する方法

# ansible-playbook ./add_to_dict_on_condition.yml -i 127.0.0.1, -e env=test -e test_var=123 
- hosts: localhost 
    gather_facts: no 
    vars: 
    - tags: 
     InterestingVar: "{{test_var}}" # How to omit this line if test_var == '' ? 
     Name: xxx 
     Env: "{{ env }}" 

    tasks: 
    - debug: var=tags 

私は

InterestingVar: "{{test_var|default(omit)}} 

をテストしたが、私は得る:

"InterestingVar": "__omit_place_holder__caca01e207397883640613b08e8ce3a8fbdd6" 

代わりに何もないの。

ご協力いただきますようお願い申し上げます。

私は、私は考えることができる唯一のことは、あなたの条件が満たされたときset_factタスクで辞書を組み合わせることであるansible 1.8

答えて

6

を使用しています。これは、Ansible 2.0で導入されたcombine filterに依存しています。

次test_varが定義されていない出力
- hosts: localhost 
    connection: local 
    gather_facts: no 
    vars: 
    - tags: 
     Name: xxx 
     Env: "{{ env }}" 
    - optional_tags: 
     InterestingVar: "{{ test_var }}" 

    tasks: 
    - name: combine tags 
     set_fact: 
     tags: "{{ tags | combine(optional_tags) }}" 
     when: test_var is defined 

    - name: debug tags 
     debug: var=tags 

[email protected]:~$ ansible-playbook -i "localhost," conditional_key.yml -e "env=test" 

PLAY *************************************************************************** 

TASK [combine tags] ************************************************************ 
skipping: [localhost] 

TASK [debug tags] ************************************************************** 
ok: [localhost] => { 
    "changed": false, 
    "tags": { 
     "Env": "test", 
     "Name": "xxx" 
    } 
} 

PLAY RECAP ********************************************************************* 
localhost     : ok=1 changed=0 unreachable=0 failed=0 

そして、この出力が定義されている場合:

[email protected]:~$ ansible-playbook -i "localhost," conditional_key.yml -e "env=test" -e "test_var=123" 

PLAY *************************************************************************** 

TASK [combine tags] ************************************************************ 
ok: [localhost] 

TASK [debug tags] ************************************************************** 
ok: [localhost] => { 
    "changed": false, 
    "tags": { 
     "Env": "test", 
     "InterestingVar": "123", 
     "Name": "xxx" 
    } 
} 

PLAY RECAP ********************************************************************* 
localhost     : ok=2 changed=0 unreachable=0 failed=0 

あなたはその後、別のオプションを2.0+を使用することができない場合Ansible's hash behaviourを変更して、辞書をマージするのではなく、次のように設定して変更することがあります。

hash_behaviour=merge 

ansible.cfgです。次のファイルで定義されているあなたのVARSで

- hosts: localhost 
    connection: local 
    gather_facts: no 
    vars: 
    - tags: 
     Name: xxx 
     Env: "{{ env }}" 
    - tags: 
     InterestingVar: "{{ test_var }}" 

    tasks: 
    - name: debug tags 
     debug: var=tags 

:これにより

あなたは、このようなものを使用することができ

[email protected]:~$ cat tags.yml 
tags: 
    Name: xxx 
    Env: "{{ env }}" 
[email protected]:~$ cat optional_tags.yml 
tags: 
    InterestingVar: "{{ test_var }}" 

これは、その後、あなたが欲しいの出力を与えるのが、あなたは確認する必要がありますtest_varが定義されていない場合は、optional_vars.ymlを含まないようにしてください。

[email protected]:~$ ansible-playbook -i "localhost," conditional_key.yml -e "env=test" -e "test_var=123" [email protected] [email protected]_tags.yml 

PLAY [localhost] ************************************************************** 

TASK: [debug tags] ************************************************************ 
ok: [localhost] => { 
    "var": { 
     "tags": { 
      "Env": "test", 
      "InterestingVar": "123", 
      "Name": "xxx" 
     } 
    } 
} 

PLAY RECAP ******************************************************************** 
localhost     : ok=1 changed=0 unreachable=0 failed=0 

このアプローチを使用すると、継承による辞書の予期されたオーバーライドが代わりに辞書をマージするようになるため、インベントリ内の項目をオーバーライドするすべての人に役立つわけではないことに注意してください。

+0

潜在的な1.8でこのロジックを使用する回避策はありますか? –

+0

私は少し清潔なアプローチを与えるために私の投稿を編集しましたが、これはまだ2.0 +残念ながらです。あなたが 'combine'フィルタなしでそれらを置き換えるのではなく、DictsをマージすることをAnabilitiesに与えるオプションがあります。しかし、継承が物事をオーバーライドすることを期待している場合、これは他のところで悪影響を及ぼす可能性があります。私は私の答えにそれを追加します。 – ydaetskcoR

+0

私は以前の2.0の回避策を追加しましたが、残念なことにかなり残念なことではなく、悪化した副作用があります(私の上記のコメントに記載されています)。本当にこの機能が必要な場合は、2.0にアップグレードすることを検討したいと思います。 – ydaetskcoR

関連する問題