В чем разница между директориями vars и defaults в Ansible?

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

Ответ

Это директории внутри роли Ansible для определения переменных, и их главное отличие — приоритет.

  • defaults/main.yml — переменные с самым низким приоритетом. Это значения "по умолчанию", которые задуманы для легкого переопределения извне (например, из inventory, group_vars, или через --extra-vars).

    # defaults/main.yml для роли 'webserver'
    http_port: 80
    service_name: "nginx"
  • vars/main.yml — переменные с высоким приоритетом. Они переопределяют значения из defaults. Здесь размещают "внутренние" константы роли, которые не должны меняться при обычном использовании.

    # vars/main.yml
    package_name: "nginx-{{ ansible_distribution_release }}"
    config_template: "nginx.conf.j2"

Практическое правило, которое я использую:

  1. В defaults кладу настройки, которые пользователь роли захочет изменить (порты, версии пакетов, пути).
  2. В vars кладу логику работы самой роли, имена внутренних файлов, зависимости — всё, что должно оставаться неизменным для корректной работы роли.

Порядок приоритетов (по возрастанию): role_defaults -> inventory vars -> group_vars -> host_vars -> role_vars -> --extra-vars.