Ответ 1
Вы можете использовать Jinja default
:
- name: Create user
user:
name: "{{ my_variable | default('default_value') }}"
Я настраиваю создание 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}}"
Но эти переменные находятся внутри действительно большого хеша, и в этом хэше есть хеши, которые не могут быть по умолчанию.
Вы можете использовать Jinja default
:
- name: Create user
user:
name: "{{ my_variable | default('default_value') }}"
Если у вас есть одна игра, которую вы хотите перебрать по элементам, определите этот список в 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) }}"
Не полностью связано, но вы также можете проверить переменную 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' }}"