2015-10-28 7 views
7

Diciamo che voglio aggiungere la chiave InterestingVar dict e il valore associato quando esiste la variabile test_var (passata con -e in command line), come posso fare?Come aggiungere una chiave/valore a una parola in un playbook ansible, condizionale

# 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 

ho testato

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

ma ottengo:

"InterestingVar": "__omit_place_holder__caca01e207397883640613b08e8ce3a8fbdd6" 

invece di nulla.

Qualsiasi aiuto sarà molto apprezzato.

Io uso ansible 1.8

risposta

6

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.

+0

Qualche possibilità di avere una soluzione alternativa per utilizzare questa logica in 1.8 non disponibile? –

+0

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

+0

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