を使用しています。これは、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
このアプローチを使用すると、継承による辞書の予期されたオーバーライドが代わりに辞書をマージするようになるため、インベントリ内の項目をオーバーライドするすべての人に役立つわけではないことに注意してください。
潜在的な1.8でこのロジックを使用する回避策はありますか? –
私は少し清潔なアプローチを与えるために私の投稿を編集しましたが、これはまだ2.0 +残念ながらです。あなたが 'combine'フィルタなしでそれらを置き換えるのではなく、DictsをマージすることをAnabilitiesに与えるオプションがあります。しかし、継承が物事をオーバーライドすることを期待している場合、これは他のところで悪影響を及ぼす可能性があります。私は私の答えにそれを追加します。 – ydaetskcoR
私は以前の2.0の回避策を追加しましたが、残念なことにかなり残念なことではなく、悪化した副作用があります(私の上記のコメントに記載されています)。本当にこの機能が必要な場合は、2.0にアップグレードすることを検討したいと思います。 – ydaetskcoR