Чем отличаются роли от плейбуков
В Ansible плейбуки и роли — это два уровня организации автоматизации: плейбук описывает конкретный сценарий выполнения задач на хостах, а роль — переиспользуемый модуль, инкапсулирующий функциональность (задачи, переменные, шаблоны). Плейбук может вызывать роли, но не наоборот: роли не являются самостоятельными сценариями, они встраиваются в плейбуки.
Как это работает
Плейбук — это YAML-файл, который определяет, какие хосты и какие задачи автоматизации задействованы. Он состоит из одной или нескольких «пьес» (plays), каждая из которых указывает группу хостов и список задач. Плейбук — это точка входа для запуска Ansible: именно его вы передаёте в команду ansible-playbook.
Роль — это структурированный каталог с предопределёнными подкаталогами, который группирует код для конкретной функции (например, установка nginx, настройка брандмауэра). Роль не запускается сама по себе — её подключают в плейбук через ключ roles или в задаче через include_role.
Пример
Простой плейбук без ролей:
- name: Update web servers
hosts: webservers
tasks:
- name: Ensure nginx is at the latest version
ansible.builtin.yum:
name: nginx
state: latestТот же функционал, но с ролью nginx:
- name: Apply nginx role
hosts: webservers
roles:
- nginxСтандартная структура роли:
nginx/
├── tasks/ # главные задачи роли
├── handlers/ # обработчики (запускаются по уведомлению)
├── defaults/ # значения переменных по умолчанию
├── vars/ # переменные роли (имеют приоритет над defaults)
├── files/ # статические файлы для копирования
├── templates/ # шаблоны Jinja2 для генерации конфигов
└── meta/ # метаданные, зависимости от других ролейПодводные камни
- Приоритет переменных: переменные из
vars/роли переопределяютdefaults/, но могут быть переопределены в плейбуке или инвентори. Это часто приводит к неожиданному поведению, если не учитывать порядок приоритетов. - Избыточное использование ролей: если роль слишком узкая или наоборот слишком широкая, она теряет смысл. Роль должна быть атомарной и переиспользуемой.
- Зависимости ролей: в
meta/main.ymlможно указать зависимости, но их чрезмерное использование усложняет отладку и увеличивает время выполнения. - Порядок выполнения: роли выполняются до задач плейбука, если они указаны в секции
roles. Это важно учитывать, когда нужно, чтобы некоторые задачи выполнились раньше.
Когда использовать
- Плейбук — для конкретного сценария: развернуть стек на группе хостов, выполнить разовую операцию (например, обновление пакетов). Плейбук — это «рецепт» для конкретной ситуации.
- Роль — для повторяющейся функциональности: установка и настройка nginx, PostgreSQL, мониторинга. Роль — это «библиотека», которую можно переиспользовать в разных плейбуках и проектах.
Коротко
- Плейбук — сценарий выполнения, роль — переиспользуемый модуль.
- Роль подключается в плейбук через
rolesилиinclude_role. - Роль имеет строгую структуру каталогов:
tasks,handlers,defaults,vars,files,templates,meta. - Плейбуки специфичны для проекта, роли универсальны и переносимы.