Ответ
Я организую дистрибуцию ролей через комбинацию внутренних репозиториев и системы управления зависимостями ansible-galaxy.
1. Структура и управление:
Роли разрабатываются как независимые, переиспользуемые модули. Каждая роль имеет стандартную структуру, созданную через ansible-galaxy init.
my-infrastructure/
├── requirements.yml # Зависимости на внешние и внутренние роли
├── site.yml # Главный playbook
└── roles/ # Локально разработанные роли (чаще для уникальной логики)
└── our-custom-role/
2. Централизованный репозиторий ролей:
Храню общие, стабильные роли (например, common, nginx, postgresql) в отдельном Git-репозитории (например, gitlab.company.com/ansible/roles). Каждая роль — отдельная директория в этом репозитории.
3. Управление зависимостями через requirements.yml:
В каждом проекте (playbook) определяю, какие роли и их версии нужны.
# requirements.yml
roles:
# Роль из внутреннего Git-репозитория
- src: git@gitlab.company.com:ansible/roles/postgresql.git
version: v2.1.0
name: postgresql
# Роль из Ansible Galaxy
- src: geerlingguy.docker
version: 6.0.0
# Роль из локальной директории (для активной разработки)
- src: ../local-dev-roles/my-experimental-role
name: experimental
4. Установка ролей в CI/CD: Перед запуском playbook в пайплайне устанавливаю все зависимости.
ansible-galaxy install -r requirements.yml -p ./roles --force
# Флаг --force гарантирует свежую установку при каждом запуске
5. Версионирование и теги:
Все внутренние роли тегирую семантическим версионированием (v1.0.0). Это позволяет контролировать обновления и откаты. В meta/main.yml роли явно указываю поддерживаемые платформы и зависимости.
Такой подход делает роли легко распространяемыми, версионируемыми и позволяет повторно использовать код между разными проектами и командами.