Расскажи про приоритет переменных в Ansible

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

Ответ

В Ansible переменные могут быть заданы в множестве мест, и при конфликте используется строгий порядок приоритета (от низшего к высшему). Знание этого порядка критически важно для отладки и предсказуемости плейбуков.

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

  1. Роли: defaults (defaults/main.yml) — значения по умолчанию, их всегда можно переопределить.
  2. Инвентарь: Переменные, заданные в файле инвентаря.
  3. Групповые/хост-переменные инвентаря (group_vars/, host_vars/).
  4. Факты (facts), собранные Ansible с целевого хоста (например, ansible_os_family).
  5. Playbook variables (vars: в плейбуке).
  6. Переменные роли (vars/main.yml) — имеют приоритет над defaults/ той же роли.
  7. Block variables (vars: внутри блока).
  8. Task variables (vars: внутри задачи).
  9. 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 в самом плейбуке помогает увидеть итоговое значение.