Ответ
Роль — это автономный, переиспользуемый модуль, который инкапсулирует задачи, обработчики, шаблоны и файлы для конкретной цели (например, установка и настройка 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'ов, а коллекции — для управления внешними зависимостями и плагинами в проекте.