2015-06-04 13 views
12

Sto usando Ansible con i modelli Jinja2, e questo è uno scenario per il quale non riesco a trovare una soluzione nella documentazione di Ansible o cercare su google per gli esempi di Jinja2. Ecco la logica che voglio ottenere in Ansible:Dichiarazione di caso per l'impostazione di var in Ansible/Jinja2

if {{ existing_ansible_var }} == "string1" 
    new_ansible_var = "a" 
else if {{ existing_ansible_var }} == "string2" 
    new_ansible_var = "b" 
<...> 
else 
    new_ansible_var = "" 

probabilmente potrei fare questo combinando diverse tecniche, l'assegnazione variabile da qui: Set variable in jinja, il confronto condizionale qui: http://jinja.pocoo.org/docs/dev/templates/#if-expression, e il filtro inadempiente qui: https://docs.ansible.com/playbooks_filters.html#defaulting-undefined-variables ,

... ma mi sembra che sia eccessivo. C'è un modo più semplice per farlo?

+0

Cosa stai cercando di raggiungere? –

+0

Sto provando a impostare 'new_ansible_var' in base a diverse condizioni, in modo da poter usare' new_ansible_var' in un modello .j2 –

+0

Ho capito, ma perché lo vuoi? Se spieghi qual è il tuo problema reale, potremmo essere in grado di aiutarti a farlo in un modo migliore. –

risposta

18

Se si desidera solo per l'uscita un valore nel modello a seconda del valore di existing_ansible_var è sufficiente utilizzare un dict e alimentarlo con existing_ansible_var.

{{ {"string1": "a", "string2": "b"}[existing_ansible_var] | default("") }} 

È possibile definire una nuova variabile allo stesso modo:

{% set new_ansible_var = {"string1": "a", "string2": "b"}[existing_ansible_var] | default("") -%} 

In caso existing_ansible_var potrebbe non necessariamente essere definito, è necessario prendere questo con un default() che non esiste nella tua dict:

{"string1": "a", "string2": "b"}[existing_ansible_var | default("this key does not exist in the dict")] | default("") 

È così possibile definire nel playbook e più tardi quindi utilizzare new_ansible_var nel modello:

vars: 
    myDict: {"string1": "a", "string2": "b"} 
    new_ansible_var: '{{myDict[existing_ansible_var | default("this key does not exist in the dict")] | default("") }}' 
+0

Questa è un'ottima soluzione! Ora mi chiedo come farlo in Ansible senza usare Jinja ... –

+0

... o se posso usare la stessa sintassi/costrutto in un playbook e poter accedere a 'new_ansible_var' nella stessa cartella di gioco –

+2

Sì, è così anche possibile Ho aggiunto un esempio alla mia risposta sopra. – udondan

0

non è necessario impostare var, perché sto indovinando che si sta tentando di impostare var per alcune condizioni in seguito. Basta fare condizione là come

- name: Later task 
    shell: "command is here" 
    when: {{ existing_ansible_var }} == "string1" 

e ottenere un profitto

3

Qualcosa di simile potrebbe funzionare, ma è brutto. E come @podarok menzionato nella sua risposta, è probabile inutile a seconda esattamente quello che stai cercando di fare:

- name: set default 
    set_fact: new_ansible_var= "" 

- name: set to 'a' 
    set_fact: new_ansible_var= "a" 
    when: "{{ existing_ansible_var }} == string1" 

- name: set to 'b' 
    set_fact: new_ansible_var= "b" 
    when: "{{ existing_ansible_var }} == string2" 

ecc

+0

La riga 2 di questi esempi dovrebbe assomigliare a questa:' set_fact: new_ansible_var = "a" 'per essere in grado di eseguirlo. Ho apportato questo cambiamento e ora quando eseguo il gioco ottengo il seguente errore che è molto inutile: 'COMPITO: [sbc | impostato su 'a'] ******************************************** ********* fatale: [my-machine] => errore durante la valutazione condizionale: exist_ansible_var == stringa1 FATAL: tutti gli host hanno già fallito - interruzione' –

+0

Ho dovuto anche fare il terzo appare come: 'when:" {{existing_ansible_var}} == string1 "' –

Problemi correlati