2016-01-30 13 views
30

Sto personalizzando la creazione di linux users all'interno del mio ruolo. Devo personalizzare gli utenti del mio ruolo home_directory, group_name, name, password.Ansible - Usa predefinito se una variabile non è definita

Mi chiedevo se c'è un modo più flessibile per far fronte ai valori predefiniti.

So che il codice di cui sopra è possibile:

- name: Create default 
    user: 
    name: "default_name" 
    when: my_variable is not defined 

- name: Create custom 
    user: 
    name: "{{my_variable}}" 
    when: my_variable is defined 

Ma, come ho già detto, ci sono un sacco di variabili facoltative e questo crea un sacco di possibilità.

C'è qualcosa come il codice sopra?

user: 
    name: "default_name", "{{my_variable}}" 

Il codice deve impostare name="default_name" quando my_variable non è definito.

ho potuto impostare tutte le variabili su defaults/main.yml e creare l'utente in quel modo:

- name: Create user 
    user: 
    name: "{{my_variable}}" 

Ma queste variabili sono all'interno di una molto grande hash e ci sono alcune hash all'interno di tale hash che non può essere un difetto.

+0

correlati: https://stackoverflow.com/questions/19614027/jinja2-template-variable-if-none-object-set-a -default-value/19616065 –

risposta

58

È possibile utilizzare di Jinja default:

- name: Create user 
    user: 
    name: "{{ my_variable | default('default_value') }}" 
+0

Meraviglioso, grazie mille! –

+3

E se la variabile di default dipende da un'altra variabile. Per esempio 'default ('/ home /' {{anothervar}})', c'è un modo per concatenare quei valori? –

+2

Basta rimuovere il valore 'around the 'default_value' e userebbe una variabile chiamata default_value – dagonza

1

Se si dispone di un singolo gioco che si desidera ciclo nel corso degli elementi, definire l'elenco in group_vars/tutto o in qualche altra parte che abbia un senso:

all_items: 
    - first 
    - second 
    - third 
    - fourth 

Allora il tuo compito può apparire così:

- name: List items or default list 
    debug: 
     var: item 
    with_items: "{{ varlist | default(all_items) }}" 

Passo in lista-variabili come un array JSON:

ansible-playbook <playbook_name> --extra-vars='{"varlist": [first,third]}' 

Prima di questo, si potrebbe anche voler un compito che controlla che ogni elemento lista-variabili è anche in all_items:

- name: Ensure passed variables are in all_items 
    fail: 
     msg: "{{ item }} not in all_items list" 
    when: item not in all_items 
    with_items: "{{ varlist | default(all_items) }}" 
2

Non totalmente correlata, ma puoi anche verificare sia la variabile undefined AND empty (ad esempio my_variable:). (NOTA: funziona solo con la versione ansible> 1.9, vedi: link)

- name: Create user 
    user: 
    name: "{{ ((my_variable == None) | ternary('default_value', my_variable)) \ 
    if my_variable is defined else 'default_value' }}" 
Problemi correlati