L'unica cosa che mi viene in mente è quello di combinare dizionari con un compito set_fact
quando la condizione è soddisfatta. Questo si basa su combine
filter introdotto in Ansible 2.0.
- 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
che emette il seguente poi test_var non è definito:
[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
E questa uscita quando si definisce:
[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
Se non si riesce a utilizzare 2.0+ poi un'altra opzione può essere quello di modificare Ansible's hash behaviour per unire dizionari piuttosto che ignorarli impostando:
hash_behaviour=merge
nel ansible.cfg
.
Con questo si potrebbe poi usare qualcosa di simile:
- hosts: localhost
connection: local
gather_facts: no
vars:
- tags:
Name: xxx
Env: "{{ env }}"
- tags:
InterestingVar: "{{ test_var }}"
tasks:
- name: debug tags
debug: var=tags
Con le Vars definiti nei seguenti file:
[email protected]:~$ cat tags.yml
tags:
Name: xxx
Env: "{{ env }}"
[email protected]:~$ cat optional_tags.yml
tags:
InterestingVar: "{{ test_var }}"
Questo poi si dà l'output desiderato, ma si deve fare assicurarsi di non includere optional_vars.yml
quando non si dispone di test_var
definito:
[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
Si tenga presente che quando si utilizza questo approccio qualsiasi override previsto dei dizionari attraverso l'ereditarietà ora unirà i dizionari, quindi questo potrebbe non essere così utile per nessuno che sovrascrive le cose nei propri inventari.
Qualche possibilità di avere una soluzione alternativa per utilizzare questa logica in 1.8 non disponibile? –
Ho modificato il mio post per dare un approccio leggermente più pulito ma questo è ancora 2.0+ sfortunatamente. Esiste la possibilità di ottenere Ansible per unire i dicts piuttosto che sostituirli senza il filtro 'combine', ma questo potrebbe avere effetti negativi altrove se si prevede che l'ereditarietà sostituisca le cose. Lo aggiungerò alla mia risposta però. – ydaetskcoR
Ho aggiunto una soluzione alternativa 2.0 ma sfortunatamente non è carina e potrebbe avere effetti collaterali peggiori (come menzionato nel mio commento precedente). Se vuoi davvero questa funzionalità, prenderei in considerazione l'aggiornamento a 2.0. – ydaetskcoR