Ответ
В Ansible переменные, определённые непосредственно в playbooks (или в блоке vars: плейбука), имеют более высокий приоритет, чем переменные, определённые в файлах defaults/main.yml роли.
Полная иерархия приоритетов переменных в Ansible (от низшего к высшему):
- Роль: defaults (
defaults/main.yml) — самый низкий приоритет, предназначены для значений по умолчанию. - Инвентарь: group_vars/all
- Инвентарь: group_vars/группа
- Инвентарь: host_vars/хост
- Роль: vars (
vars/main.yml) - Плейбук: vars (блок
vars:) - Плейбук: vars_files
- Задача: vars (блок
vars:в задаче) - Задача: set_fact / registered vars
- Аргументы командной строки (
--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).