Встречается на 33% собеседований по DevOps

Чем отличаются роли от плейбуков

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

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

Плейбук — это YAML-файл, который определяет, какие хосты и какие задачи автоматизации задействованы. Он состоит из одной или нескольких «пьес» (plays), каждая из которых указывает группу хостов и список задач. Плейбук — это точка входа для запуска Ansible: именно его вы передаёте в команду ansible-playbook.

Роль — это структурированный каталог с предопределёнными подкаталогами, который группирует код для конкретной функции (например, установка nginx, настройка брандмауэра). Роль не запускается сама по себе — её подключают в плейбук через ключ roles или в задаче через include_role.

Пример

Простой плейбук без ролей:

yaml
- name: Update web servers
  hosts: webservers
  tasks:
    - name: Ensure nginx is at the latest version
      ansible.builtin.yum:
        name: nginx
        state: latest

Тот же функционал, но с ролью nginx:

yaml
- name: Apply nginx role
  hosts: webservers
  roles:
    - nginx

Стандартная структура роли:

text
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.
  • Плейбуки специфичны для проекта, роли универсальны и переносимы.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы