it-swarm.com.ru

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", когда my_variable не определен.

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

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

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

72
Bernardo Vale

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

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

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

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

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

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
Jack

В случае, если вы используете lookup для установки значения по умолчанию для чтения из среды, вы также установили для второго параметра default значение true:

- set_facts:
    ansible_ssh_user: "{{ lookup('env', 'SSH_USER') | default('foo', true) }}"

Вы также можете объединить несколько определений по умолчанию:

- set_facts:
    ansible_ssh_user: "{{ some_var.split('-')[1] | default(lookup('env','USER'), true) | default('foo') }}"
1
panticz.de