Ansible: Установить переменную, только если undefined

Я хотел бы установить переменную-переменную для некоторого значения по умолчанию, но только если переменная undefined. В противном случае я бы хотел оставить его неизменным.

Я пробовал эти два подхода, и оба они производят рекурсивный цикл:

namespace: "{{namespace|default(default_namespace)}}"
namespace: "{% if namespace is defined %}{{namespace}}{% else %}{{default_namespace}}{% endif %}"

Ответ 1

Похоже, вы ошибаетесь.

Взгляните на документацию Ansible, касающуюся приоритета переменных. Это встроенная функция Ansible - использовать переменную по умолчанию, если переменная не определена.

В Ansible 2.x приоритет переменной начинается следующим образом:

роль по умолчанию

инвентарь

Поэтому, если вы хотите определить значение по умолчанию для переменной, вы должны установить его в role/defaults/main.yml. Ansible будет использовать это значение, только если переменная не определена где-либо еще.

Другой вариант - использовать фильтр Jinja2. С помощью фильтра Jinja вы можете установить значение по умолчанию для такой переменной:

{{ some_variable | default(5) }}

Ответ 2

- set_fact: namespace="default_namespace"
  when: namespace is undefined

Ответ 3

В случае, если вам нужно установить переменную по приоритету, аналогично:

  1. Установите переменную как var_priority_1.
    Но если это не определено, то:
  2. Установите переменную как var_priority_2.
    Но если он тоже не определен, то:
  3. Установите для переменной значение по умолчанию.

Мне пришлось использовать такое условие при попытке получить значение из переменных инвентаризации хостов, которые иногда должны быть переопределены ролями:

shell: |
    ...
    shell_var={{ role_var if role_var is defined else hostvars[item].host_var | default('defalut_value') }}
    ...
  with_items: "{{ groups[hosts_group_iterator] }}"

Ответ 4

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