Как организовать дистрибуцию ролей в Ansible?

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

Ответ

Я организую дистрибуцию ролей через комбинацию внутренних репозиториев и системы управления зависимостями 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 роли явно указываю поддерживаемые платформы и зависимости.

Такой подход делает роли легко распространяемыми, версионируемыми и позволяет повторно использовать код между разными проектами и командами.