Зачем в роли Ansible нужны две папки для переменных: `defaults` и `vars`?

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

Ответ

Эти папки определяют приоритет переменных, что является ключевым механизмом гибкости и переопределения в Ansible.

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

  1. Роль: defaults/main.yml — значения по умолчанию. Имеют самый низкий приоритет.
  2. Инвентарь: group_vars/, host_vars/.
  3. Роль: vars/main.ymlфактические переменные роли. Переопределяют defaults и инвентарь.
  4. Playbook-переменные (vars:).
  5. Факты, обнаруженные Ansible (gather_facts).
  6. --extra-vars (ключ -e) — наивысший приоритет.

Практическое применение:

  • defaults/main.yml: Используется для параметров, которые ожидаемо будут меняться под разные окружения (порт, версия пакета, путь установки).
    # defaults/main.yml
    app_port: 8080
    app_version: "1.0.0"
  • vars/main.yml: Используется для фиксированных, внутренних для роли значений, которые не должны меняться извне (например, имя системного юнита или внутренний путь конфигурации).
    # vars/main.yml
    service_name: "my_application"
    config_template: "config.j2"

Пример: Если в defaults указан port: 80, а в group_vars/production.ymlport: 443, то в production будет использован порт 443. Переменные из vars/main.yml роли переопределят оба этих значения, если не задать --extra-vars "port=8080".