Какие переменные в приоритете: те, что в файле default или в playbooks?

«Какие переменные в приоритете: те, что в файле default или в playbooks?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Ansible переменные, определённые непосредственно в playbooks (или в блоке vars: плейбука), имеют более высокий приоритет, чем переменные, определённые в файлах defaults/main.yml роли.

Полная иерархия приоритетов переменных в Ansible (от низшего к высшему):

  1. Роль: defaults (defaults/main.yml) — самый низкий приоритет, предназначены для значений по умолчанию.
  2. Инвентарь: group_vars/all
  3. Инвентарь: group_vars/группа
  4. Инвентарь: host_vars/хост
  5. Роль: vars (vars/main.yml)
  6. Плейбук: vars (блок vars:)
  7. Плейбук: vars_files
  8. Задача: vars (блок vars: в задаче)
  9. Задача: set_fact / registered vars
  10. Аргументы командной строки (--extra-vars или -e) — самый высокий приоритет.

Практический пример:

# roles/myapp/defaults/main.yml
app_port: 8080
app_env: "development"

# playbook.yml
- hosts: webservers
  vars:
    app_port: 9090  # Это значение переопределит значение из defaults!
  roles:
    - role: myapp

При выполнении этого плейбука для хостов в группе webservers переменная app_port будет иметь значение 9090, а app_env останется "development" (так как не была переопределена).

Зачем это нужно: Это позволяет создавать гибкие и переиспользуемые роли. Роль задаёт безопасные значения по умолчанию в defaults/, а конкретный плейбук или инвентарь может их переопределить для нужного окружения (dev, staging, prod).