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.

53
demandé sur Chen A. 2016-01-30 21:44:07

3 réponses

Vous pouvez utiliser default de Jinja:

- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"
109
répondu tedder42 2016-01-31 00:04:10

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' }}"
3
répondu Tommy Nguyen 2017-08-14 09:54:58

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) }}"
1
répondu Jack 2017-05-18 22:24:23