Ответ
Размещение роли в Git — стандартная практика для управления версиями, совместной работы и повторного использования. Вот рабочий процесс, который я использую.
1. Создание структуры роли:
# Создаем каркас роли с помощью ansible-galaxy
ansible-galaxy init my_awesome_role
cd my_awesome_role
# Получаем стандартную структуру:
# my_awesome_role/
# ├── defaults/ # Значения переменных по умолчанию
# ├── files/ # Статические файлы для копирования
# ├── handlers/ # Обработчики (handlers)
# ├── meta/ # Зависимости и информация о роли
# ├── tasks/ # Основные задачи
# ├── templates/ # Шаблоны (Jinja2)
# ├── tests/ # Тесты
# └── vars/ # Переменные с высоким приоритетом
2. Настройка Git-репозитория:
# Инициализация репозитория
git init
# Создание .gitignore для исключения временных файлов Ansible
cat > .gitignore << EOF
*.retry
*.swp
.DS_Store
__pycache__/
*.pyc
# Исключаем каталог, куда скачиваются роли при тестировании
roles/
EOF
# Добавление файлов и первый коммит
git add .
git commit -m "Initial commit: Ansible role my_awesome_role"
3. Создание метаданных (meta/main.yml):
Это ключевой файл для публикации роли в Ansible Galaxy и указания зависимостей.
---
galaxy_info:
author: "Your Name"
description: "Role to install and configure Nginx"
license: "MIT"
min_ansible_version: "2.9"
platforms:
- name: Ubuntu
versions:
- 20.04
- 22.04
galaxy_tags:
- web
- nginx
dependencies: [] # Список зависимостей от других ролей
# dependencies:
# - { role: geerlingguy.java, java_packages: 'openjdk-11-jdk' }
4. Работа с тестами (tests/):
Я добавляю минимальный тестовый плейбук и инвентарь, чтобы можно было проверить роль локально с помощью Molecule или ansible-playbook.
tests/test.yml:
---
- hosts: localhost
connection: local
roles:
- ../ # Указывает на корень нашей роли
5. Публикация в удаленный репозиторий (GitHub/GitLab):
git remote add origin git@github.com:your-username/ansible-role-my_awesome_role.git
git branch -M main
git push -u origin main
6. Использование роли из Git в других проектах:
В requirements.yml вашего playbook-проекта укажите:
---
# Из конкретной ветки или тега
- src: git+https://github.com/your-username/ansible-role-my_awesome_role.git
version: main # или v1.0.0
name: my_awesome_role
# Из внутреннего GitLab (с приватным токеном)
- src: git+https://gitlab.example.com/group/ansible-role-common.git
scm: git
version: master
name: common_role
Установите роли:
ansible-galaxy install -r requirements.yml -p roles/
Дополнительные практики:
- Версионирование: Используйте семантическое версионирование (SemVer) и создавайте Git tags (
v1.0.0). - CI/CD для роли: Настройте pipeline в GitLab CI/GitHub Actions для запуска линтеров (
ansible-lint) и тестов (Molecule) при каждом пуше. - Публикация в Ansible Galaxy: Если роль представляет общий интерес, можно опубликовать ее в Galaxy, добавив
.travis.ymlили используя GitHub Actions для автоматической публикации при создании тега.