← Назад к вопросам

В чем разница между playbook, roles и collections в Ansible?

2.3 Middle🔥 221 комментариев
#Ansible и управление конфигурацией

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Playbook, Roles и Collections в Ansible

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

Playbook (Плейбук)

Playbook — это базовый исполняемый файл в Ansible, написанный на YAML. Он описывает желаемое состояние системы через последовательность "плейов" (plays), каждый из которых содержит задачи (tasks), выполняемые на определённой группе хостов.

  • Назначение: Точка входа для запуска автоматизации. Координация высокоуровневого workflow.
  • Уровень: Наивысший, "проектный" или "оркестровочный" уровень.
  • Структура: Содержит минимум: списки хостов, переменные, задачи или импорт ролей.
# site.yml - пример playbook
---
- name: Настройка веб-сервера
  hosts: webservers  # Целевая группа хостов
  become: yes         # Повышение привилегий
  vars:
    http_port: 80
  tasks:              # Список задач (можно вынести в роль)
    - name: Установка nginx
      apt:
        name: nginx
        state: present
  roles:              # Импорт ролей для структурирования
    - common
    - nginx_config

Ключевая характеристика плейбука — он определяет "что" и "где", но не обязательно "как". Логика "как" часто инкапсулируется в роли.

Roles (Роли)

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

  • Назначение: Модульность и повторное использование. Это основная единица организации кода в Ansible.
  • Уровень: Средний, "логический" уровень. Плейбук использует одну или несколько ролей.
  • Структура каталогов:
    nginx_role/
    ├── defaults/     # Переменные по умолчанию (самый низкий приоритет)
    │   └── main.yml
    ├── tasks/        # Основные задачи роли
    │   └── main.yml
    ├── handlers/     # Обработчики (уведомления)
    │   └── main.yml
    ├── templates/    # Шаблоны Jinja2
    ├── files/        # Статические файлы для копирования
    ├── vars/         # Переменные с высоким приоритетом
    │   └── main.yml
    ├── meta/         # Зависимости роли и метаданные
    │   └── main.yml
    └── README.md
    

Пример использования в плейбуке предельно прост: `roles: - nginx_role`. Это делает плейбук чистым и декларативным.

**Главное отличие от плейбука:** Роль — это **пакет логики**, а не сценарий выполнения. Она не знает, на каких хостах будет запущена; это решает плейбук.

### Collections (Коллекции)

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

*   **Назначение:** Распространение, версионирование и зависимость готовых решений. Это эволюция формата "роль" до уровня полноценного пакета.
*   **Уровень:** Наивысший, "дистрибутивный" уровень. Содержит роли и/или модули.
*   **Структура:**
    ```
    community.postgresql/  # Полное имя коллекции (namespace.name)
    ├── plugins/
    │   ├── modules/       # Модули, специфичные для коллекции (postgresql_user и др.)
    │   └── .../
    ├── roles/             # Вложенные роли (например, postgresql)
    │   └── postgresql/
    │       ├── tasks/
    │       └── ...
    ├── playbooks/         # Примеры или готовые плейбуки
    ├── docs/
    ├── galaxy.yml         # Метаданные коллекции
    └── README.md

Коллекции устанавливаются через ansible-galaxy collection install namespace.collection_name и используются с указанием полного квалифицированного имени (FQCN).

- name: Использование модуля из коллекции
  hosts: dbservers
  tasks:
    # Без коллекции (устаревший модуль из ядра Ansible):
    # - postgresql_user: ...
    # С коллекцией (актуальный модуль):
    - name: Создать пользователя БД
      community.postgresql.postgresql_user:  # FQCN
        name: app_user
        password: secret
  roles:
    - role: community.postgresql.postgresql  # Использование роли из коллекции

Итоговая сравнительная таблица

КритерийPlaybookRoleCollection
Основная цельОркестровка, точка входаИнкапсуляция логики, повторное использованиеДистрибуция, версионирование, управление зависимостями
АналогияСценарий или главный скриптФункция или библиотекаПакет (например, PIP или RPM)
Что содержитPlays -> Tasks, импорт ролейTasks, handlers, templates, variablesМножество ролей, модулей, плагинов, плейбуков
Уровень абстракцииВысокий (что и где)Средний (как)Наивысший (пакет решений)
ЗависимостиПрямой импорт ролейОбъявляются в meta/main.ymlОбъявляются в galaxy.yml, могут включать другие коллекции
ИспользованиеЗапуск через ansible-playbookИмпорт в playbook через roles:Установка через ansible-galaxy, использование FQCN

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

В чем разница между playbook, roles и collections в Ansible? | PrepBro