Ответ
Для совместной работы нескольких команд над одним Ansible-репозиторием важно обеспечить изоляцию, переиспользование кода и ясную структуру. Вот эффективный подход:
1. Структура каталогов:
ansible-repo/
├── inventory/
│ ├── production/ # Инвентарь для Prod
│ │ ├── hosts.yml
│ │ └── group_vars/
│ │ ├── all.yml
│ │ ├── team_a.yml # Переменные команды A в Prod
│ │ └── team_b.yml # Переменные команды B в Prod
│ └── staging/ # Инвентарь для Staging
├── roles/
│ ├── common/ # Общие роли (базовая настройка, мониторинг агенты)
│ │ ├── tasks/main.yml
│ │ └── defaults/main.yml
│ ├── team_a_app/ # Роль команды A для их приложения
│ └── team_b_middleware/ # Роль команды B для их middleware
├── playbooks/
│ ├── site.yml # Главный плейбук, включает остальные
│ ├── team_a_deploy.yml # Плейбук развертывания команды A
│ └── team_b_setup.yml # Плейбук настройки команды B
└── requirements.yml # Зависимости на роли из Galaxy или git
2. Использование тегов (tags) для изоляции: В общих плейбуках команды могут управлять своими задачами с помощью тегов.
# playbooks/site.yml
- hosts: all
roles:
- role: common
tags: always
- hosts: app_servers
roles:
- role: team_a_app
tags: ['team-a', 'deploy']
- hosts: middleware_servers
roles:
- role: team_b_middleware
tags: ['team-b', 'setup']
Команда A может запускать только свои задачи: ansible-playbook -i inventory/production site.yml --tags team-a
3. Динамическое подключение ролей через переменные инвентаря:
В inventory/production/group_vars/team_a.yml:
required_roles:
- common
- team_a_app
В плейбуке:
- hosts: "{{ target_hosts }}"
tasks:
- name: Include roles dynamically
include_role:
name: "{{ item }}"
loop: "{{ required_roles }}"
4. Управление доступом и процессами:
- Git-ветки: Каждая команда может работать в своей feature-ветке (
team-a/fix-logging), мерджа в main через Pull Request. - Code Owners (в
.gitlab-ci.ymlили.github/CODEOWNERS): Автоматически назначать ревьюверов из соответствующей команды для изменений в их ролях (/roles/team_a_app/**). - CI/CD пайплайн: Запускать линтер (
ansible-lint) и тесты (molecule) для ролей при каждом коммите. - Ansible Galaxy / Private Collections: Для очень изолированных или переиспользуемых ролей можно создать внутреннюю коллекцию, которую команды будут подключать как зависимость.
Такой подход позволяет командам работать независимо, минимизировать конфликты, но при этом использовать общие best practices и инфраструктурные роли.