Ответ
В Ansible переменные могут быть заданы в множестве мест, и при конфликте используется строгий порядок приоритета (от низшего к высшему). Знание этого порядка критически важно для отладки и предсказуемости плейбуков.
Иерархия приоритетов (снизу вверх — от низшего к высшему):
- Роли: defaults (
defaults/main.yml) — значения по умолчанию, их всегда можно переопределить. - Инвентарь: Переменные, заданные в файле инвентаря.
- Групповые/хост-переменные инвентаря (
group_vars/,host_vars/). - Факты (facts), собранные Ansible с целевого хоста (например,
ansible_os_family). - Playbook variables (
vars:в плейбуке). - Переменные роли (
vars/main.yml) — имеют приоритет надdefaults/той же роли. - Block variables (
vars:внутри блока). - Task variables (
vars:внутри задачи). - Extra Variables (
-eв командной строке) — НАИВЫСШИЙ ПРИОРИТЕТ.
Практический пример: Допустим, мы хотим задать порт для приложения.
# 1. defaults/main.yml в роли `app_role` (низший приоритет)
app_port: 8080
# 2. group_vars/webservers.yml
app_port: 9090
# 3. playbook.yml
vars:
app_port: 7070
roles:
- role: app_role
vars: # 6. Переменные роли при вызове
app_port: 6060
- Если запустить плейбук без дополнительных флагов, будет использовано значение
6060(переменные роли при вызове). - Если запустить с
ansible-playbook playbook.yml -e "app_port=5050", будет использовано5050(extra vars).
Как проверить? Команда ansible-playbook playbook.yml --tags debug_var -e "var_name=app_port" или использование модуля debug в самом плейбуке помогает увидеть итоговое значение.