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
В случае, если вам нужно установить переменную по приоритету, аналогично:
- Установите переменную как var_priority_1.
Но если это не определено, то: - Установите переменную как var_priority_2.
Но если он тоже не определен, то: - Установите для переменной значение по умолчанию.
Мне пришлось использовать такое условие при попытке получить значение из переменных инвентаризации хостов, которые иногда должны быть переопределены ролями:
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') }}"