defaults vs vars

Тема дорожной карты · Ansible

Файлы defaults/main.yml и vars/main.yml в role Ansible выполняют разные функции, определенные их позицией в 22-уровневой иерархии приоритета переменных Ansible. Файлы defaults/main.yml находятся на самом низком приоритете (ранг 2), что позволяет пользователям переопределять значения в них с помощью переменных инвентаря, переменных плейбука или аргумента --extra-vars. В то время как файлы vars/main.yml находятся на значительно более высоком приоритете (ранг 16), что затрудняет их переопределение без использования --extra-vars. Таким образом, defaults/main.yml — это правильное место для настраиваемых параметров role с безопасными значениями по умолчанию, а vars/main.yml — для внутренних констант, которые пользователи роля не предполагают менять.

Хорошо спроектированная role должна использовать defaults/main.yml для публичного API (например, nginx_port: 80), позволяя вызывающим плейбукам переопределять значения. В то время как vars/main.yml служит для хранения вычисленных или фиксированных внутренних значений, которые редко или никогда не должны быть изменены.

Как это работает

Файлы defaults/main.yml и vars/main.yml организуют связанные задачи, файлы, шаблоны, handlers, vars и defaults в переиспользуемую директорную структуру (tasks/, handlers/, templates/, files/, vars/, defaults/, meta/). Play включает роли по имени; команда ansible-galaxy init <role> создает структуру. Роли могут декларировать зависимости в meta/main.yml. Collections (Ansible 2.10+) пакетируют роли, модули и плагины как распространяемые пакеты на Galaxy или приватном хабе.

Когда применять

Выносите роль, когда есть логичный кусок, переиспользуемый в 2+ плейбуках (nginx, postgres, prometheus-node-exporter). Используйте готовые роли Galaxy для распространённого — geerlingguy.docker, geerlingguy.postgresql закалены в боях. Запинните версии ролей в requirements.yml. Узкая ответственность роли (одна роль на сервис).

Типичные ошибки

Ловушки defaults vs vars: god-роль, делающая 15 вещей (разделите); не запиннены версии Galaxy-ролей (один ansible-galaxy install -r requirements.yml и поведение меняется); роли с захардкоженными distro-путями ломаются на другом OS (используйте ansible_os_family для ветвления); не используете defaults/ для переопределяемых значений (вызывающие не могут кастомизировать).

Связанные понятия

Полезные ресурсы