Какой у вас опыт с приоритетами переменных в Ansible?

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

Ответ

Понимание приоритетов переменных в Ansible критически важно для предсказуемости конфигурации. Я сталкивался с этим при создании сложных ролей и инвентарей. Порядок приоритета (от низшего к высшему):

  1. Роли: defaults/main.yml (значения по умолчанию).
  2. Инвентарь: Переменные, определенные в файле инвентаря.
  3. Групповые/хост-переменные: Файлы в group_vars/ и host_vars/.
  4. Плейбук: Блок vars: внутри плейбука.
  5. Роли: Блок vars: внутри роли и vars/main.yml.
  6. Факты (facts): Собранные автоматически или через set_fact в ходе выполнения.
  7. Extra vars: Переменные, переданные через -e в командной строке (наивысший приоритет).

Практический пример из моего опыта: У нас была роль nginx. В defaults/main.yml был порт 80. Для стейджинга в group_vars/staging.yml мы переопределяли его на 8080. Однако для конкретного хаотического теста нужно было запустить на порту 9000, что делалось через ansible-playbook -e "nginx_port=9000".

# defaults/main.yml в роли nginx
nginx_port: 80

# group_vars/staging.yml
nginx_port: 8080

# Запуск: ansible-playbook -e "nginx_port=9000" site.yml
# Итоговое значение для хоста в группе staging: 9000

Важные нюансы:

  • Переменные, определенные через include_vars, имеют приоритет, основанный на времени выполнения (как факты).
  • set_fact перезаписывает переменные, определенные ранее в том же плейбуке. Я всегда четко документирую источники ключевых переменных в проекте.