В чем разница между ролью и коллекцией в Ansible

«В чем разница между ролью и коллекцией в Ansible» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Роль — это автономный, переиспользуемый модуль, который инкапсулирует задачи, обработчики, шаблоны и файлы для конкретной цели (например, установка и настройка Nginx). Роли имеют стандартную структуру директорий (tasks/, handlers/, templates/, vars/, defaults/, files/, meta/). Они предназначены для организации кода внутри одного проекта или для ручного распространения.

Коллекция — это дистрибутивный пакет формата .tar.gz, который может содержать роли, модули, плагины, документацию и playbook'и. Коллекции решают проблему масштабируемого распространения и версионирования контента Ansible. Например, официальный контент от Red Hat (ansible.posix) или сообщества (community.general) поставляется именно в виде коллекций. Коллекции поддерживают зависимости между собой.

Ключевые отличия:

  • Назначение: Роль структурирует задачи для одной цели. Коллекция — это упаковка для распространения множества связанных компонентов (несколько ролей, модулей).
  • Распространение: Роли часто хранятся внутри проекта или вручную копируются. Коллекции устанавливаются через ansible-galaxy collection install <namespace.collection> и имеют четкую систему версий (семантическое версионирование).
  • Структура: Коллекция содержит роли в поддиректории roles/, а также plugins/, docs/ и playbooks/.

Пример структуры:

# Структура роли (внутри проекта или коллекции)
my_role/
├── tasks/
│   └── main.yml
└── handlers/
    └── main.yml

# Структура коллекции (после установки)
~/.ansible/collections/ansible_collections/community/general/
├── plugins/
│   └── modules/
│       └── my_module.py
└── roles/
    └── my_role/  # Роль, упакованная в коллекцию

На практике я использую роли для модульной организации своих playbook'ов, а коллекции — для управления внешними зависимостями и плагинами в проекте.