Ansible-utiliser par défaut si une variable n'est pas définie
Je personnalise la création de linux users
dans mon rôle. J'ai besoin de laisser les utilisateurs de mon rôle de le personnaliser home_directory
, group_name
, name
, password
.
Je me demandais s'il y avait un moyen plus flexible de faire face aux valeurs par défaut.
Je sais que le code ci-dessous est possible:
- 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
Mais comme je l'ai mentionné, il y a beaucoup de variables optionnelles et cela crée beaucoup de possibilités.
Y a-t-il quelque chose comme le code ci-dessus?
user:
name: "default_name", "{{my_variable}}"
Le code doit définir name="default_name"
quand my_variable
n'est pas défini.
Je pourrais définir toutes les variables sur defaults/main.yml
et créer l'utilisateur comme ceci:
- name: Create user
user:
name: "{{my_variable}}"
Mais ces variables sont à l'intérieur d'un très gros hachage et il y a des hachages à l'intérieur de ce hachage qui ne peuvent pas être par défaut.
3 réponses
Vous pouvez utiliser default
de Jinja:
- name: Create user
user:
name: "{{ my_variable | default('default_value') }}"
Pas totalement lié, mais vous pouvez également vérifier à la fois undefined
et empty
(par exemple my_variable:
) variable. (Remarque: fonctionne uniquement avec ansible version > 1.9, voir: link )
- name: Create user
user:
name: "{{ ((my_variable == None) | ternary('default_value', my_variable)) \
if my_variable is defined else 'default_value' }}"
Si vous avez un seul jeu que vous voulez boucler sur les éléments, définissez cette liste dans group_vars / all ou ailleurs qui a du sens:
all_items:
- first
- second
- third
- fourth
Alors votre tâche peut ressembler à ceci:
- name: List items or default list
debug:
var: item
with_items: "{{ varlist | default(all_items) }}"
Passer dans varlist comme un tableau JSON:
ansible-playbook <playbook_name> --extra-vars='{"varlist": [first,third]}'
Avant que, vous souhaitez peut-être également une tâche qui vérifie que chaque élément de varlist est aussi dans 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) }}"