Подтвердить что ты не робот

Ansible - использовать значение по умолчанию, если переменная не определена

Я настраиваю создание linux users внутри моей роли. Мне нужно, чтобы пользователи моей роли настраивали home_directory, group_name, name, password.

Мне было интересно, есть ли более гибкий способ справиться со значениями по умолчанию.

Я знаю, что приведенный выше код возможен:

- 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

Но, как я уже упоминал, существует множество необязательных переменных, и это создает много возможностей.

Есть ли что-то вроде кода выше?

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

Код name="default_name" должен установить name="default_name", если my_variable не определен.

Я мог бы установить все переменные на defaults/main.yml и создать такого пользователя:

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

Но эти переменные находятся внутри действительно большого хеша, и в этом хэше есть хеши, которые не могут быть по умолчанию.

4b9b3361

Ответ 1

Вы можете использовать Jinja default:

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

Ответ 2

Если у вас есть одна игра, которую вы хотите перебрать по элементам, определите этот список в group_vars/все или где-то еще, что имеет смысл:

all_items:
  - first
  - second
  - third
  - fourth

Тогда ваша задача может выглядеть так:

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

Передать в varlist как массив JSON:

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

До этого вам также может понадобиться задача, которая проверяет, что каждый элемент в varlist также находится в 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) }}"

Ответ 3

Не полностью связано, но вы также можете проверить переменную undefined AND empty (например, my_variable:). (ПРИМЕЧАНИЕ: работает только с доступной версией > 1.9, см. ссылка)

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