Ответ
В Ansible переменные для ролей определяются с учётом приоритета (от низшего к высшему):
defaults/main.yml— значения по умолчанию, которые легко переопределить.vars/main.yml— основные переменные роли, имеют более высокий приоритет.- Внутри задач (
tasks/main.yml) через блокvars:— переменные для конкретной задачи. - В
meta/main.yml— для зависимостей и переменных, связанных с ролью. - В шаблонах (
templates/) и файлах (files/) через Jinja2.
Пример структуры роли:
# defaults/main.yml - задаём безопасные значения по умолчанию
app_port: 8080
db_connection_pool: 10
backup_retention_days: 7
# vars/main.yml - фиксируем критичные для роли значения
service_user: "_app" # Специальный системный пользователь
config_path: "/etc/myapp"
# tasks/main.yml - используем переменные
- name: Configure application
template:
src: config.j2
dest: "{{ config_path }}/app.conf"
vars:
# Локальная переменная только для этой задачи
tmp_debug_mode: "{{ 'yes' if debug_enabled else 'no' }}"
Практика в DevOps:
defaults/используем для параметров, которые могут меняться в разных окружениях (dev/stage/prod).vars/— для жёстко зафиксированных значений (пути, имена системных пользователей).- Inventory переменные (в
group_vars/,host_vars/) имеют приоритет выше, чемvars/роли, что позволяет гибко настраивать окружения.