Как размещать Ansible Role в Git?

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

Ответ

Размещение роли в 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 для автоматической публикации при создании тега.