- Удалена папка dockerfiles/debian - Обновлены все presets/*.yml файлы с новыми образами - Обновлена документация в соответствии с новыми возможностями - Добавлены новые версии Ubuntu (20.04, 22.04, 24.04) - Добавлены новые версии CentOS (7, 8, 9) - Добавлены новые версии Debian (9, 10, 11, 12) - Обновлены family в hosts секциях - Обновлена документация по поддержке платформ
AnsibleLab - Универсальная система тестирования Ansible ролей
Автор: Сергей Антропов
Сайт: https://devops.org.ru
Версия: 2.0.0
🚀 Описание
AnsibleLab - это универсальная система для тестирования Ansible ролей с использованием Docker, Molecule и различных preset'ов конфигурации. Система поддерживает multi-arch сборку, CI/CD интеграцию и работу с различными операционными системами.
📚 Документация
🚀 Быстрый старт
- docs/getting-started.md - Установка, настройка и первое тестирование
🛠️ Разработка
- docs/creating-roles.md - Создание и разработка ролей
- docs/linting-guide.md - Руководство по линтингу ролей
- docs/site-yml-guide.md - Руководство по файлу site.yml
- docs/molecule-guide.md - Подробное руководство по Molecule
- docs/all-images-preset.md - Пресет all-images для тестирования всех образов
- docs/deploy-yml-customization.md - Полное руководство по кастомизации deploy.yml
- dockerfiles/README.md - Подробная документация по Docker образам
🏗️ CI/CD
- docs/cicd-setup.md - Настройка CI/CD для GitHub Actions, Azure DevOps, Jenkins, GitLab CI
📊 Мониторинг
- docs/monitoring.md - Мониторинг, диагностика и troubleshooting
✨ Ключевые возможности
🐳 Multi-Arch Docker поддержка
- Поддерживаемые архитектуры: amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6
- Автоматическая сборка для всех архитектур одновременно
- Docker Hub интеграция с автоматической публикацией
- Собственные образы для различных ОС (Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux, ALT Linux, Astra Linux, RED OS)
🧪 Универсальная система тестирования
- Preset система - любой preset без изменения Makefile
- Molecule интеграция с поддержкой Docker
- Автоматическое создание тестовых окружений
- Поддержка systemd в контейнерах
- DinD/DOoD поддержка для Docker функциональности
- Интерактивное управление ролями - создание, удаление, просмотр ролей
- Автоматическое обновление playbook'ов при добавлении новых ролей
- Комплексное тестирование всех образов одновременно (all-images preset)
🔐 Безопасность и секреты
- Ansible Vault интеграция
- Автоматическое шифрование/расшифровка секретов
- Сканирование на наличие незашифрованных секретов
- Управление паролями и ключами
🚀 CI/CD интеграция
- GitHub Actions готовые workflow'ы
- Azure DevOps pipeline конфигурации
- Jenkins pipeline скрипты
- GitLab CI интеграция
- Автоматическое тестирование при push/PR
📁 Структура проекта
AnsibleLab/
├── molecule/ # Molecule конфигурация
│ ├── default/ # Основная конфигурация
│ │ ├── create.yml # Создание тестовых контейнеров
│ │ ├── converge.yml # Запуск тестов
│ │ ├── destroy.yml # Удаление контейнеров
│ │ ├── site.yml # Основной playbook
│ │ └── molecule.yml # Конфигурация Molecule
│ └── presets/ # Preset'ы конфигурации
│ ├── default.yml # Стандартный preset (2 хоста)
│ ├── minimal.yml # Минимальный preset (1 хост)
│ ├── standard.yml # Расширенный preset (3 хоста)
│ ├── performance.yml # Performance preset (5 хостов)
│ ├── security.yml # Security preset (3 хоста)
│ └── etcd-patroni.yml # etcd-patroni preset
├── roles/ # Ansible роли
│ ├── ping/ # Пример роли ping
│ └── deploy.yml # 🚀 Playbook для продакшн развертывания
│ # (перенесен из корня для лучшей организации)
├── dockerfiles/ # Docker образы для разных ОС
│ ├── ansible-controller/ # Ansible контроллер
│ ├── ubuntu/ # Ubuntu образ
│ ├── debian/ # Debian образ
│ ├── rhel/ # RHEL образ
│ ├── centos/ # CentOS образ
│ ├── alma/ # AlmaLinux образ
│ ├── rocky/ # Rocky Linux образ
│ ├── alt-linux/ # ALT Linux образ
│ ├── astra-linux/ # Astra Linux образ
│ ├── redos/ # RED OS образ
│ └── README.md # 📖 [Подробная документация](dockerfiles/README.md)
├── cicd/ # CI/CD конфигурации
│ ├── github/ # GitHub Actions
│ ├── azure-devops/ # Azure DevOps
│ ├── jenkins/ # Jenkins
│ └── gitlab/ # GitLab CI
├── vault/ # Зашифрованные секреты
├── inventory/ # Инвентори файлы
├── scripts/ # Скрипты автоматизации
├── docs/ # 📖 Документация
│ ├── getting-started.md # 🚀 Быстрый старт
│ ├── creating-roles.md # 🛠️ Создание ролей
│ ├── cicd-setup.md # 🏗️ Настройка CI/CD
│ ├── monitoring.md # 📊 Мониторинг и диагностика
│ ├── site-yml-guide.md # 📋 Руководство по site.yml
│ └── molecule-guide.md # 🧪 Подробное руководство по Molecule
├── Makefile # Основные команды
├── requirements.yml # Ansible коллекции
└── Dockerfile # Основной Docker образ
📋 Важные изменения
Перемещение deploy.yml
Файл deploy.yml перенесен из корня проекта в папку roles/ для лучшей организации структуры проекта. Теперь все playbook'и находятся в одном месте.
Новое расположение: roles/deploy.yml
Старое расположение: deploy.yml (в корне)
Все пути в проекте автоматически обновлены. Если вы используете старые скрипты или документацию, обновите пути с deploy.yml на roles/deploy.yml.
🚀 Быстрый старт
📖 Подробное руководство: docs/getting-started.md
1. Клонирование и настройка
git clone https://github.com/your-username/AnsibleLab.git
cd AnsibleLab
2. Настройка Docker
# Настройка multi-arch builder
make docker setup-builder
# Сборка всех образов (multi-arch)
make docker build
# Проверка собранных образов
make docker info
3. Управление ролями
# Просмотр всех ролей
make role list
# Создание новой роли (интерактивно)
make role create
# Удаление роли (интерактивно)
make role delete
4. Тестирование ролей
# Просмотр доступных preset'ов
make presets list
# Тестирование с default preset
make role test
# Тестирование с minimal preset
make role test minimal
# Тестирование всех образов (9 контейнеров)
make role test all-images
# Тестирование с custom preset
make role test my-custom-preset
🧪 Тестирование
Preset система
Система поддерживает неограниченное количество preset'ов без изменения Makefile:
# Просмотр всех доступных preset'ов
make presets list
# Информация о конкретном preset'е
make presets info PRESET=etcd-patroni
# Тестирование с preset'ом
make presets test PRESET=performance
Доступные preset'ы
| Preset | Описание | Хосты | Использование |
|---|---|---|---|
default |
Стандартный preset | 2 хоста (Debian + RHEL) | Базовое тестирование |
minimal |
Минимальный preset | 1 хост (Debian) | Быстрое тестирование |
all-images |
Все образы | 9 хостов (все ОС) | Комплексное тестирование |
standard |
Расширенный preset | 3 хоста (Debian + RHEL + Debian) | Полное тестирование |
performance |
Performance preset | 5 хостов (Debian + RHEL) | Нагрузочное тестирование |
security |
Security preset | 3 хоста (Debian + RHEL) | Тестирование безопасности |
etcd-patroni |
etcd-patroni preset | 3 хоста (Debian + RHEL) | Тестирование кластеров |
[custom] |
Любой custom preset | Любое количество | Пользовательские сценарии |
Тестирование с собственными образами
# Проверка наличия собственных образов
make custom-images check
# Тестирование с собственными образами
make custom-images test minimal
make custom-images test full
make custom-images test performance
🐳 Docker образы
📖 Подробная документация: dockerfiles/README.md
Multi-Arch поддержка
Система поддерживает сборку для множества архитектур:
# Настройка builder'а
make docker setup-builder
# Сборка всех образов
make docker build
# Сборка отдельного образа
make docker build-image IMAGE=ubuntu
# Полная пересборка с очисткой кеша
make docker rebuild
Доступные образы
| Образ | Базовый образ | Описание |
|---|---|---|
ansible-controller |
ubuntu:22.04 |
Ansible контроллер с коллекциями |
ubuntu |
ubuntu:22.04 |
Ubuntu с systemd |
debian |
debian:bookworm |
Debian с systemd |
rhel |
registry.access.redhat.com/ubi8/ubi |
RHEL с systemd |
centos |
quay.io/centos/centos:stream9 |
CentOS Stream с systemd |
alma |
almalinux:8 |
AlmaLinux с systemd |
rocky |
rockylinux:8 |
Rocky Linux с systemd |
alt-linux |
altlinux/p9 |
ALT Linux с systemd |
astra-linux |
astralinux/astra-1.7 |
Astra Linux с systemd |
redos |
redos/redos:9 |
RED OS с systemd |
Управление образами
# Информация об образах
make docker info
# Отправка в Docker Hub
make docker push
# Загрузка из Docker Hub
make docker pull
# Очистка локальных образов
make docker clean
# Диагностика проблем
make docker diagnose
# Сброс builder'а
make docker reset-builder
🔐 Управление секретами
Ansible Vault
# Инициализация vault
make vault init
# Создание файла секретов
make vault create
# Редактирование секретов
make vault edit
# Просмотр секретов
make vault show
# Удаление файла секретов
make vault delete
# Шифрование файла
make vault encrypt
# Расшифровка файла
make vault decrypt
# Смена пароля
make vault rekey
# Проверка vault файлов
make vault check
# Поиск потенциальных секретов
make vault scan
🚀 Развертывание
Тестирование (Docker контейнеры)
# Тестирование с разными preset'ами
make role test # default preset
make role test minimal # minimal preset
make role test standard # standard preset
make role test performance # performance preset
make role test security # security preset
make role test my-custom-preset # любой custom preset
Инвентори для тестирования:
- Источник: Динамически создается из preset файлов (
molecule/presets/*.yml) - Расположение:
${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini - Содержимое: Временные контейнеры (u1, u2, u3, docker1, dood1)
- Сеть: Docker сеть
labnet - Пользователь:
ansible(с sudo правами)
Пример динамического инвентори для тестирования:
# Автоматически создается из preset файла
[test]
u1 ansible_host=172.20.0.2 ansible_user=ansible ansible_ssh_private_key_file=/tmp/ssh_key
u2 ansible_host=172.20.0.3 ansible_user=ansible ansible_ssh_private_key_file=/tmp/ssh_key
[web]
u1
u2
[docker]
docker1 ansible_host=172.20.0.4 ansible_user=ansible ansible_ssh_private_key_file=/tmp/ssh_key
[dood]
dood1 ansible_host=172.20.0.5 ansible_user=ansible ansible_ssh_private_key_file=/tmp/ssh_key
Развертывание (Реальные серверы)
# Развертывание на реальные серверы
make role deploy # развертывание ролей
Инвентори для продакшн развертывания:
- Источник: Статический файл
inventory/hosts.ini - Расположение:
inventory/hosts.ini - Содержимое: Реальные серверы с SSH подключением
- Сеть: Интернет или внутренняя сеть
- Пользователь:
devops(настраивается в Makefile)
Пример продакшн инвентори:
# inventory/hosts.ini - Реальные серверы
[web_servers]
web1.example.com ansible_host=192.168.1.10 ansible_user=devops
web2.example.com ansible_host=192.168.1.11 ansible_user=devops
[db_servers]
db1.example.com ansible_host=192.168.1.20 ansible_user=devops
db2.example.com ansible_host=192.168.1.21 ansible_user=devops
[monitoring]
mon1.example.com ansible_host=192.168.1.30 ansible_user=devops
[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
Различия между тестовым и продакшн инвентори
| Параметр | Тестовый инвентори | Продакшн инвентори |
|---|---|---|
| Источник | Динамически из preset файлов | Статический файл inventory/hosts.ini |
| Расположение | ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini |
inventory/hosts.ini |
| Хосты | Временные Docker контейнеры | Реальные серверы |
| Сеть | Docker сеть labnet |
Интернет/внутренняя сеть |
| Пользователь | ansible (в контейнере) |
devops (на реальных серверах) |
| SSH ключи | Автоматически генерируются | Используются существующие |
| Время жизни | Временные (удаляются после тестов) | Постоянные |
| Подключение | Docker exec | SSH |
Настройка продакшн инвентори
1. Создание файла inventory/hosts.ini:
# Продакшн серверы
[web_servers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11
[db_servers]
db1.example.com ansible_host=192.168.1.20
db2.example.com ansible_host=192.168.1.21
[monitoring]
mon1.example.com ansible_host=192.168.1.30
# Группы для развертывания
[production:children]
web_servers
db_servers
monitoring
# Общие переменные
[all:vars]
ansible_user=devops
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
2. Настройка SSH ключей:
# Генерация SSH ключа (если нет)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
# Копирование ключа на серверы
ssh-copy-id devops@web1.example.com
ssh-copy-id devops@web2.example.com
ssh-copy-id devops@db1.example.com
3. Тестирование подключения:
# Проверка подключения к серверам
ansible all -i inventory/hosts.ini -m ping
# Проверка конкретной группы
ansible web_servers -i inventory/hosts.ini -m ping
Особенности развертывания
Dry-run проверка:
# Проверка без изменений
make role deploy
# Выполняется: ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check
Подтверждение развертывания:
# Интерактивное подтверждение
make role deploy
# Запрашивается подтверждение: "Продолжить развертывание? (y/N):"
Логирование и мониторинг:
# Подробные логи
ANSIBLE_STDOUT_CALLBACK=yaml make role deploy
# Сохранение логов
make role deploy 2>&1 | tee deployment.log
🔧 Вспомогательные команды
Управление ролями
# Просмотр всех ролей
make role list
# Создание новой роли (интерактивно)
make role create
# Удаление роли (интерактивно)
make role delete
# Проверка синтаксиса ролей
make role lint # проверить все роли
make role lint devops # проверить конкретную роль
make role lint ping # проверить другую роль
Docker команды
# Очистка Docker ресурсов
make docker clean
# Полная очистка Docker (ОСТОРОЖНО!)
make docker purge
# Обновление всех образов
make docker update
Другие команды
# Создание секретов
make vault create
# Полная справка
make help
🏗️ CI/CD интеграция
📖 Подробное руководство: docs/cicd-setup.md
GitHub Actions
# .github/workflows/ansible-test.yml
name: Ansible Testing
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run lint
run: make role lint
test:
runs-on: ubuntu-latest
needs: lint
strategy:
matrix:
preset: [minimal, default, performance]
steps:
- uses: actions/checkout@v4
- name: Setup Docker
run: |
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Run tests
run: make role test ${{ matrix.preset }}
deploy-check:
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Check deployment
run: make role deploy
env:
ANSIBLE_HOST_KEY_CHECKING: false
Azure DevOps
# azure-pipelines.yml
trigger:
- main
- develop
pool:
vmImage: 'ubuntu-latest'
variables:
ANSIBLE_FORCE_COLOR: 'true'
DOCKER_TLS_CERTDIR: ''
stages:
- stage: Lint
displayName: 'Lint Stage'
jobs:
- job: LintJob
displayName: 'Run Lint'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
- script: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
make role lint
displayName: 'Run Ansible Lint'
- stage: Test
displayName: 'Test Stage'
dependsOn: Lint
jobs:
- job: TestJob
displayName: 'Run Tests'
strategy:
matrix:
minimal:
preset: minimal
default:
preset: default
performance:
preset: performance
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
- script: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
make role test $(preset)
displayName: 'Run Molecule Tests'
env:
PRESET: $(preset)
- stage: Deploy
displayName: 'Deploy Stage'
dependsOn: Test
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- job: DeployJob
displayName: 'Check Deployment'
steps:
- script: make role deploy
displayName: 'Check Deployment'
env:
ANSIBLE_HOST_KEY_CHECKING: false
Jenkins
// Jenkinsfile
pipeline {
agent any
environment {
ANSIBLE_FORCE_COLOR = 'true'
DOCKER_TLS_CERTDIR = ''
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install Dependencies') {
steps {
sh '''
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
'''
}
}
stage('Lint') {
steps {
sh 'make role lint'
}
}
stage('Test') {
parallel {
stage('Test Minimal') {
steps {
sh 'make role test minimal'
}
}
stage('Test Default') {
steps {
sh 'make role test default'
}
}
stage('Test Performance') {
steps {
sh 'make role test performance'
}
}
}
}
stage('Deploy Check') {
when {
branch 'main'
}
steps {
sh 'make role deploy'
}
}
}
post {
always {
archiveArtifacts artifacts: 'molecule/**/.molecule/**/*', allowEmptyArchive: true
}
success {
echo 'Pipeline completed successfully!'
}
failure {
echo 'Pipeline failed!'
}
}
}
GitLab CI
# .gitlab-ci.yml
stages:
- lint
- test
- deploy
variables:
ANSIBLE_FORCE_COLOR: "true"
DOCKER_TLS_CERTDIR: ""
lint:
stage: lint
image: python:3.11
before_script:
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role lint
test:
stage: test
image: docker:latest
services:
- docker:dind
variables:
DOCKER_TLS_CERTDIR: ""
before_script:
- apk add --no-cache make python3 py3-pip
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role test $PRESET
parallel:
matrix:
- PRESET: [minimal, default, performance]
deploy:
stage: deploy
image: python:3.11
only:
- main
before_script:
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role deploy
variables:
ANSIBLE_HOST_KEY_CHECKING: "false"
Автоматическое тестирование новых ролей
При создании новой роли в директории roles/:
- Автоматически включается в lint проверку
- Автоматически включается в тестирование
- Автоматически включается в развертывание
- CI/CD пайплайны автоматически тестируют новую роль
Настройка уведомлений:
# .github/workflows/ansible-test.yml
name: Ansible Testing
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: make role test
- name: Notify on success
if: success()
run: echo "✅ All tests passed for new role"
- name: Notify on failure
if: failure()
run: echo "❌ Tests failed for new role"
Настройка автоматического тестирования новых ролей
1. Автоматическое обнаружение новых ролей:
# .github/workflows/ansible-test.yml
name: Ansible Testing
on: [push, pull_request]
jobs:
detect-roles:
runs-on: ubuntu-latest
outputs:
roles: ${{ steps.detect.outputs.roles }}
steps:
- uses: actions/checkout@v4
- name: Detect new roles
id: detect
run: |
echo "roles=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' ')" >> $GITHUB_OUTPUT
test-roles:
runs-on: ubuntu-latest
needs: detect-roles
strategy:
matrix:
role: ${{ fromJson(format('["{0}"]', needs.detect-roles.outputs.roles)) }}
steps:
- uses: actions/checkout@v4
- name: Test role ${{ matrix.role }}
run: |
make role lint
make role test
echo "✅ Role ${{ matrix.role }} tested successfully"
2. Автоматическое обновление playbook'ов:
#!/bin/bash
# scripts/update-playbooks.sh
# Автоматическое обновление playbook'ов при добавлении новых ролей
echo "🔍 Обнаружение новых ролей..."
# Получаем список всех ролей
ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||')
echo "📋 Найденные роли: $ROLES"
# Обновляем molecule/default/site.yml
echo "📝 Обновление molecule/default/site.yml..."
cat > molecule/default/site.yml << EOF
---
# Основной playbook для тестирования
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Тестирование всех ролей
hosts: all
roles:
EOF
for role in $ROLES; do
echo " - $role" >> molecule/default/site.yml
done
# Обновляем roles/deploy.yml
echo "📝 Обновление roles/deploy.yml..."
cat > roles/deploy.yml << EOF
---
# Playbook для развертывания на продакшн серверах
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Развертывание всех ролей
hosts: all
roles:
EOF
for role in $ROLES; do
echo " - $role" >> roles/deploy.yml
done
echo "✅ Playbook'и обновлены"
3. Автоматическое тестирование в CI/CD:
# .github/workflows/ansible-test.yml
name: Ansible Testing
on: [push, pull_request]
jobs:
update-playbooks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Update playbooks
run: |
chmod +x scripts/update-playbooks.sh
./scripts/update-playbooks.sh
- name: Commit changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add molecule/default/site.yml roles/deploy.yml
git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
git push
test:
runs-on: ubuntu-latest
needs: update-playbooks
steps:
- uses: actions/checkout@v4
- name: Run tests
run: make role test
4. Настройка уведомлений о новых ролях:
# .github/workflows/ansible-test.yml
name: Ansible Testing
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: make role test
- name: Notify on success
if: success()
run: |
echo "✅ All tests passed for new role"
# Отправка уведомления в Slack/Teams
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"✅ Ansible role tests passed"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
- name: Notify on failure
if: failure()
run: |
echo "❌ Tests failed for new role"
# Отправка уведомления в Slack/Teams
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Ansible role tests failed"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
5. Автоматическое создание документации для новых ролей:
#!/bin/bash
# scripts/generate-role-docs.sh
# Автоматическое создание документации для новых ролей
echo "📚 Генерация документации для ролей..."
# Получаем список всех ролей
ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||')
for role in $ROLES; do
echo "📝 Генерация документации для роли: $role"
# Создаем README.md для роли если его нет
if [ ! -f "roles/$role/README.md" ]; then
cat > "roles/$role/README.md" << EOF
# Роль $role
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Роль для настройки и конфигурации $role сервиса.
## Требования
- Ansible >= 2.9
- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux
## Переменные
| Переменная | Тип | По умолчанию | Описание |
|------------|-----|--------------|----------|
| \`${role}_enabled\` | boolean | \`true\` | Включить роль |
| \`${role}_packages\` | list | \`[]\` | Пакеты для установки |
## Примеры использования
\`\`\`yaml
- name: Настройка $role
hosts: all
roles:
- $role
\`\`\`
## Tags
- \`$role\` - выполнение всех задач роли
- \`install\` - установка пакетов
- \`config\` - настройка конфигурации
EOF
fi
done
echo "✅ Документация сгенерирована"
6. Автоматическое тестирование новых ролей в CI/CD:
# .github/workflows/ansible-test.yml
name: Ansible Testing
on: [push, pull_request]
jobs:
detect-roles:
runs-on: ubuntu-latest
outputs:
roles: ${{ steps.detect.outputs.roles }}
steps:
- uses: actions/checkout@v4
- name: Detect new roles
id: detect
run: |
echo "roles=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' ')" >> $GITHUB_OUTPUT
update-playbooks:
runs-on: ubuntu-latest
needs: detect-roles
steps:
- uses: actions/checkout@v4
- name: Update playbooks
run: |
chmod +x scripts/update-playbooks.sh
./scripts/update-playbooks.sh
- name: Commit changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add molecule/default/site.yml roles/deploy.yml
git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
git push
lint:
runs-on: ubuntu-latest
needs: update-playbooks
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run lint
run: make role lint
test:
runs-on: ubuntu-latest
needs: [update-playbooks, lint]
strategy:
matrix:
preset: [minimal, default, performance]
steps:
- uses: actions/checkout@v4
- name: Setup Docker
run: |
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Run tests
run: make role test ${{ matrix.preset }}
deploy-check:
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Check deployment
run: make role deploy
env:
ANSIBLE_HOST_KEY_CHECKING: false
notify:
runs-on: ubuntu-latest
needs: [lint, test, deploy-check]
if: always()
steps:
- name: Notify on success
if: needs.lint.result == 'success' && needs.test.result == 'success'
run: |
echo "✅ All tests passed for new roles"
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
- name: Notify on failure
if: needs.lint.result == 'failure' || needs.test.result == 'failure'
run: |
echo "❌ Tests failed for new roles"
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
7. Автоматическое создание скриптов:
#!/bin/bash
# scripts/create-role-scripts.sh
# Автоматическое создание скриптов для новых ролей
echo "🔧 Создание скриптов для новых ролей..."
# Создаем директорию scripts если её нет
mkdir -p scripts
# Создаем скрипт для обновления playbook'ов
cat > scripts/update-playbooks.sh << 'EOF'
#!/bin/bash
# Автоматическое обновление playbook'ов при добавлении новых ролей
echo "🔍 Обнаружение новых ролей..."
# Получаем список всех ролей
ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||')
echo "📋 Найденные роли: $ROLES"
# Обновляем molecule/default/site.yml
echo "📝 Обновление molecule/default/site.yml..."
cat > molecule/default/site.yml << EOL
---
# Основной playbook для тестирования
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Тестирование всех ролей
hosts: all
roles:
EOL
for role in $ROLES; do
echo " - $role" >> molecule/default/site.yml
done
# Обновляем roles/deploy.yml
echo "📝 Обновление roles/deploy.yml..."
cat > roles/deploy.yml << EOL
---
# Playbook для развертывания на продакшн серверах
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Развертывание всех ролей
hosts: all
roles:
EOL
for role in $ROLES; do
echo " - $role" >> roles/deploy.yml
done
echo "✅ Playbook'и обновлены"
EOF
# Создаем скрипт для генерации документации
cat > scripts/generate-role-docs.sh << 'EOF'
#!/bin/bash
# Автоматическое создание документации для новых ролей
echo "📚 Генерация документации для ролей..."
# Получаем список всех ролей
ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||')
for role in $ROLES; do
echo "📝 Генерация документации для роли: $role"
# Создаем README.md для роли если его нет
if [ ! -f "roles/$role/README.md" ]; then
cat > "roles/$role/README.md" << EOL
# Роль $role
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Роль для настройки и конфигурации $role сервиса.
## Требования
- Ansible >= 2.9
- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux
## Переменные
| Переменная | Тип | По умолчанию | Описание |
|------------|-----|--------------|----------|
| \`${role}_enabled\` | boolean | \`true\` | Включить роль |
| \`${role}_packages\` | list | \`[]\` | Пакеты для установки |
## Примеры использования
\`\`\`yaml
- name: Настройка $role
hosts: all
roles:
- $role
\`\`\`
## Tags
- \`$role\` - выполнение всех задач роли
- \`install\` - установка пакетов
- \`config\` - настройка конфигурации
EOL
fi
done
echo "✅ Документация сгенерирована"
EOF
# Делаем скрипты исполняемыми
chmod +x scripts/update-playbooks.sh
chmod +x scripts/generate-role-docs.sh
echo "✅ Скрипты созданы"
📊 Мониторинг и диагностика
📖 Подробное руководство: docs/monitoring.md
Диагностика Docker
# Диагностика buildx проблем
make docker diagnose
# Проверка builder'а
make docker setup-builder
# Сброс builder'а при проблемах
make docker reset-builder
Логи и отчеты
# Просмотр логов контейнера
docker logs ansible-controller
# Вход в контейнер для отладки
docker exec -it ansible-controller bash
🛠️ Разработка
📖 Подробное руководство: docs/creating-roles.md
Создание новых preset'ов
- Создайте файл
molecule/presets/my-preset.yml:
#description: Мой кастомный preset
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
images:
ubuntu: "inecs/ansible-lab:ubuntu-latest"
rhel: "inecs/ansible-lab:rhel-latest"
hosts:
- name: web1
family: ubuntu
groups: [web, frontend]
- name: db1
family: rhel
groups: [database, backend]
- Используйте preset:
make role test my-preset
Создание новых ролей
1. Создание структуры роли
# Создание директории роли
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
# Создание основных файлов
touch roles/my-role/{tasks,handlers,meta}/main.yml
touch roles/my-role/defaults/main.yml
touch roles/my-role/vars/main.yml
touch roles/my-role/README.md
2. Структура файлов роли
roles/my-role/tasks/main.yml - основные задачи:
---
# Основные задачи для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Установка пакетов
package:
name: "{{ my_role_packages }}"
state: present
when: my_role_install_packages | default(true)
tags:
- my-role
- install
- name: Настройка конфигурации
template:
src: my-role.conf.j2
dest: /etc/my-role/my-role.conf
owner: root
group: root
mode: '0644'
notify: restart my-role
tags:
- my-role
- config
roles/my-role/defaults/main.yml - переменные по умолчанию:
---
# Переменные по умолчанию для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Основные настройки
my_role_enabled: true
my_role_install_packages: true
my_role_packages:
- nginx
- curl
# Конфигурация
my_role_config_file: /etc/my-role/my-role.conf
my_role_log_level: info
roles/my-role/handlers/main.yml - обработчики:
---
# Обработчики для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: restart my-role
service:
name: "{{ my_role_service_name | default('my-role') }}"
state: restarted
when: my_role_enabled | default(true)
roles/my-role/meta/main.yml - метаданные роли:
---
# Метаданные роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
galaxy_info:
author: Сергей Антропов
description: Моя кастомная роль для AnsibleTemplate
company: https://devops.org.ru
license: MIT
min_ansible_version: "2.9"
platforms:
- name: Ubuntu
versions:
- focal
- jammy
- name: Debian
versions:
- bullseye
- bookworm
- name: EL
versions:
- 7
- 8
- 9
galaxy_tags:
- system
- configuration
- my-role
dependencies: []
roles/my-role/README.md - документация роли:
# Роль My-Role
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Роль для настройки и конфигурации my-role сервиса.
## Требования
- Ansible >= 2.9
- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux
## Переменные
| Переменная | Тип | По умолчанию | Описание |
|------------|-----|--------------|----------|
| `my_role_enabled` | boolean | `true` | Включить роль |
| `my_role_packages` | list | `['nginx', 'curl']` | Пакеты для установки |
| `my_role_log_level` | string | `info` | Уровень логирования |
## Примеры использования
```yaml
- name: Настройка my-role
hosts: all
roles:
- my-role
Tags
my-role- выполнение всех задач ролиinstall- установка пакетовconfig- настройка конфигурации
#### 3. Регистрация роли для проверок
**Автоматическая регистрация:** Роль автоматически будет проверена при выполнении:
```bash
# Lint проверка всех ролей в директории roles/
make role lint
# Тестирование всех ролей
make role test
Как это работает:
- Lint проверка:
ansible-lint roles/автоматически находит все роли в директорииroles/ - Тестирование:
molecule/default/site.ymlавтоматически включает все роли изroles/ - Развертывание:
roles/deploy.ymlавтоматически включает все роли изroles/
Ручная проверка конкретной роли:
# Lint проверка конкретной роли
ansible-lint roles/my-role/
# Тестирование конкретной роли
cd roles/my-role
molecule test
Автоматическое включение ролей в playbook'и:
В molecule/default/site.yml (для тестирования):
---
# Автоматически включает все роли из директории roles/
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Тестирование всех ролей
hosts: all
roles:
- ping # Автоматически включается
- my-role # Автоматически включается
# Добавьте сюда новые роли по мере их создания
В roles/deploy.yml (для продакшн развертывания):
---
# Автоматически включает все роли из директории roles/
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Развертывание всех ролей
hosts: all
roles:
- ping # Автоматически включается
- my-role # Автоматически включается
# Добавьте сюда новые роли по мере их создания
4. Интеграция с основным playbook
Обновление molecule/default/site.yml:
---
# Основной playbook для тестирования
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Тестирование роли ping
hosts: all
roles:
- ping
- name: Тестирование роли my-role
hosts: all
roles:
- my-role
vars:
my_role_enabled: true
my_role_packages:
- nginx
- curl
Обновление roles/deploy.yml:
---
# Playbook для развертывания на продакшн серверах
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Развертывание роли ping
hosts: all
roles:
- ping
- name: Развертывание роли my-role
hosts: all
roles:
- my-role
vars:
my_role_enabled: true
my_role_packages:
- nginx
- curl
5. Настройка переменных для разных окружений
Переменные для тестирования (в preset файлах):
# molecule/presets/my-custom-preset.yml
---
#description: Кастомный preset для тестирования my-role
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# Переменные для тестирования
my_role_enabled: true
my_role_packages:
- nginx
- curl
my_role_log_level: debug
my_role_test_mode: true
hosts:
- name: u1
family: debian
groups: [test]
Переменные для продакшн (в group_vars):
# inventory/group_vars/all.yml
---
# Общие переменные для всех серверов
my_role_enabled: true
my_role_packages:
- nginx
- curl
- htop
my_role_log_level: info
my_role_test_mode: false
# Продакшн настройки
my_role_production: true
my_role_backup_enabled: true
Переменные для конкретных групп:
# inventory/group_vars/web_servers.yml
---
# Переменные для web серверов
my_role_web_config: true
my_role_nginx_config: |
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
Переменные для конкретных хостов:
# inventory/host_vars/web1.example.com.yml
---
# Переменные для конкретного хоста
my_role_hostname: web1
my_role_domain: example.com
my_role_ssl_enabled: true
6. Тестирование новой роли
# 1. Lint проверка
make role lint
# 2. Тестирование с default preset
make role test
# 3. Тестирование с custom preset
make role test my-custom-preset
# 4. Тестирование на реальных серверах (dry-run)
make role deploy
7. Полный цикл разработки роли
# 1. Создание роли
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
touch roles/my-role/{tasks,handlers,meta}/main.yml
touch roles/my-role/defaults/main.yml
touch roles/my-role/vars/main.yml
touch roles/my-role/README.md
# 2. Разработка роли
# ... редактирование файлов роли ...
# 3. Lint проверка
make role lint
# 4. Тестирование в Docker
make role test minimal
# 5. Тестирование с custom preset
make role test my-custom-preset
# 6. Тестирование на реальных серверах (dry-run)
make role deploy
# 7. Развертывание на продакшн
make role deploy
# Подтвердить развертывание: y
8. Автоматическое обновление playbook'ов
Добавьте в Makefile команду для автоматического обновления:
# Автоматическое обновление playbook'ов
update-playbooks:
@echo "🔍 Обнаружение новых ролей..."
@ROLES=$$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' '); \
echo "📋 Найденные роли: $$ROLES"; \
echo "📝 Обновление molecule/default/site.yml..."; \
echo "---" > molecule/default/site.yml; \
echo "# Основной playbook для тестирования" >> molecule/default/site.yml; \
echo "# Автор: Сергей Антропов" >> molecule/default/site.yml; \
echo "# Сайт: https://devops.org.ru" >> molecule/default/site.yml; \
echo "" >> molecule/default/site.yml; \
echo "- name: Тестирование всех ролей" >> molecule/default/site.yml; \
echo " hosts: all" >> molecule/default/site.yml; \
echo " roles:" >> molecule/default/site.yml; \
for role in $$ROLES; do \
echo " - $$role" >> molecule/default/site.yml; \
done; \
echo "📝 Обновление roles/deploy.yml..."; \
echo "---" > roles/deploy.yml; \
echo "# Playbook для развертывания на продакшн серверах" >> roles/deploy.yml; \
echo "# Автор: Сергей Антропов" >> roles/deploy.yml; \
echo "# Сайт: https://devops.org.ru" >> roles/deploy.yml; \
echo "" >> roles/deploy.yml; \
echo "- name: Развертывание всех ролей" >> roles/deploy.yml; \
echo " hosts: all" >> roles/deploy.yml; \
echo " roles:" >> roles/deploy.yml; \
for role in $$ROLES; do \
echo " - $$role" >> roles/deploy.yml; \
done; \
echo "✅ Playbook'и обновлены"
Использование:
# Автоматическое обновление playbook'ов
make update-playbooks
# Проверка обновленных playbook'ов
make role test
9. Автоматическое создание документации
Добавьте в Makefile команду для создания документации:
# Автоматическое создание документации для ролей
generate-docs:
@echo "📚 Генерация документации для ролей..."
@ROLES=$$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||'); \
for role in $$ROLES; do \
echo "📝 Генерация документации для роли: $$role"; \
if [ ! -f "roles/$$role/README.md" ]; then \
echo "# Роль $$role" > "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "**Автор:** Сергей Антропов" >> "roles/$$role/README.md"; \
echo "**Сайт:** https://devops.org.ru" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "## Описание" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "Роль для настройки и конфигурации $$role сервиса." >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "## Требования" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "- Ansible >= 2.9" >> "roles/$$role/README.md"; \
echo "- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "## Переменные" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "| Переменная | Тип | По умолчанию | Описание |" >> "roles/$$role/README.md"; \
echo "|------------|-----|--------------|----------|" >> "roles/$$role/README.md"; \
echo "| \`$${role}_enabled\` | boolean | \`true\` | Включить роль |" >> "roles/$$role/README.md"; \
echo "| \`$${role}_packages\` | list | \`[]\` | Пакеты для установки |" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "## Примеры использования" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "\`\`\`yaml" >> "roles/$$role/README.md"; \
echo "- name: Настройка $$role" >> "roles/$$role/README.md"; \
echo " hosts: all" >> "roles/$$role/README.md"; \
echo " roles:" >> "roles/$$role/README.md"; \
echo " - $$role" >> "roles/$$role/README.md"; \
echo "\`\`\`" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "## Tags" >> "roles/$$role/README.md"; \
echo "" >> "roles/$$role/README.md"; \
echo "- \`$$role\` - выполнение всех задач роли" >> "roles/$$role/README.md"; \
echo "- \`install\` - установка пакетов" >> "roles/$$role/README.md"; \
echo "- \`config\` - настройка конфигурации" >> "roles/$$role/README.md"; \
fi; \
done; \
echo "✅ Документация сгенерирована"
Использование:
# Автоматическое создание документации
make generate-docs
# Проверка созданной документации
ls -la roles/*/README.md
10. Полный цикл с автоматизацией
# 1. Создание роли
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
touch roles/my-role/{tasks,handlers,meta}/main.yml
touch roles/my-role/defaults/main.yml
touch roles/my-role/vars/main.yml
# 2. Автоматическое создание документации
make generate-docs
# 3. Автоматическое обновление playbook'ов
make update-playbooks
# 4. Lint проверка
make role lint
# 5. Тестирование в Docker
make role test minimal
# 6. Тестирование с custom preset
make role test my-custom-preset
# 7. Тестирование на реальных серверах (dry-run)
make role deploy
# 8. Развертывание на продакшн
make role deploy
# Подтвердить развертывание: y
🔧 Конфигурация
Настройки проекта
Все настройки проекта находятся в Makefile и могут быть переопределены через переменные окружения:
# Основные настройки
export PROJECT_NAME=ansible-template
export VERSION=2.0.0
export AUTHOR="Сергей Антропов"
export SITE="https://devops.org.ru"
# Docker настройки
export DOCKER_IMAGE=inecs/ansible-lab:ansible-controller-latest
export DOCKER_REGISTRY=inecs/ansible-lab
export DOCKER_VERSION=latest
# Multi-arch настройки
export DOCKER_PLATFORMS=linux/amd64,linux/arm64
export DOCKER_BUILDX_BUILDER=multiarch-builder
Ansible конфигурация
# Переменные окружения для Ansible
export ANSIBLE_FORCE_COLOR=1
export ANSIBLE_STDOUT_CALLBACK=yaml
export ANSIBLE_HOST_KEY_CHECKING=False
export ANSIBLE_INVENTORY=inventory/hosts.ini
export ANSIBLE_REMOTE_USER=devops
export ANSIBLE_ROLES_PATH=roles/
export ANSIBLE_INTERPRETER_PYTHON=auto
# Настройки для продакшн
[production]
inventory = inventory/hosts.ini
remote_user = devops
host_key_checking = False
Настройка переменных для разных окружений
Структура переменных:
inventory/
├── hosts.ini # Основной инвентори
├── group_vars/ # Переменные для групп
│ ├── all.yml # Общие переменные
│ ├── web_servers.yml # Переменные для web серверов
│ ├── db_servers.yml # Переменные для db серверов
│ └── monitoring.yml # Переменные для мониторинга
├── host_vars/ # Переменные для конкретных хостов
│ ├── web1.example.com.yml # Переменные для web1
│ ├── web2.example.com.yml # Переменные для web2
│ └── db1.example.com.yml # Переменные для db1
└── vault/ # Зашифрованные переменные
├── secrets.yml # Секреты
└── passwords.yml # Пароли
Примеры переменных:
inventory/group_vars/all.yml - общие переменные:
---
# Общие переменные для всех серверов
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Основные настройки
ansible_user: devops
ansible_ssh_private_key_file: ~/.ssh/id_rsa
ansible_ssh_common_args: '-o StrictHostKeyChecking=no'
# Переменные для ролей
ping_host: yandex.ru
ping_count: 5
# Продакшн настройки
production_mode: true
backup_enabled: true
monitoring_enabled: true
inventory/group_vars/web_servers.yml - переменные для web серверов:
---
# Переменные для web серверов
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Web настройки
nginx_enabled: true
nginx_ssl_enabled: true
nginx_domains:
- example.com
- www.example.com
# Переменные для ролей
my_role_web_config: true
my_role_nginx_config: |
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
inventory/host_vars/web1.example.com.yml - переменные для конкретного хоста:
---
# Переменные для web1.example.com
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Хост-специфичные настройки
hostname: web1
domain: example.com
ssl_certificate: /etc/ssl/certs/web1.crt
ssl_private_key: /etc/ssl/private/web1.key
# Переменные для ролей
my_role_hostname: web1
my_role_domain: example.com
my_role_ssl_enabled: true
inventory/vault/secrets.yml - зашифрованные секреты:
---
# Зашифрованные секреты
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Секреты для ролей
my_role_api_key: "{{ vault_my_role_api_key }}"
my_role_database_password: "{{ vault_my_role_database_password }}"
my_role_ssl_certificate: "{{ vault_my_role_ssl_certificate }}"
Использование переменных в ролях
В roles/my-role/tasks/main.yml:
---
# Основные задачи для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Установка пакетов
package:
name: "{{ my_role_packages }}"
state: present
when: my_role_enabled | default(true)
tags:
- my-role
- install
- name: Настройка конфигурации
template:
src: my-role.conf.j2
dest: "{{ my_role_config_file | default('/etc/my-role/my-role.conf') }}"
owner: root
group: root
mode: '0644'
notify: restart my-role
tags:
- my-role
- config
- name: Настройка SSL сертификата
copy:
content: "{{ my_role_ssl_certificate }}"
dest: /etc/ssl/certs/my-role.crt
owner: root
group: root
mode: '0644'
when: my_role_ssl_enabled | default(false)
tags:
- my-role
- ssl
В roles/my-role/templates/my-role.conf.j2:
# Конфигурация my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
[main]
enabled = {{ my_role_enabled | default(true) }}
log_level = {{ my_role_log_level | default('info') }}
hostname = {{ my_role_hostname | default(ansible_hostname) }}
domain = {{ my_role_domain | default('localhost') }}
{% if my_role_ssl_enabled | default(false) %}
[ssl]
enabled = true
certificate = /etc/ssl/certs/my-role.crt
private_key = /etc/ssl/private/my-role.key
{% endif %}
{% if my_role_web_config | default(false) %}
[web]
enabled = true
{% raw %}
{{ my_role_nginx_config }}
{% endraw %}
{% endif %}
🐛 Troubleshooting
Проблемы с Docker
-
Builder не создается:
make docker diagnose make docker reset-builder -
Образы не собираются:
make docker clean make docker setup-builder make docker build -
Проблемы с multi-arch:
make docker clean-builder make docker setup-builder
Проблемы с тестированием
-
Preset не найден:
make presets list # Проверьте наличие файла molecule/presets/your-preset.yml -
Контейнеры не создаются:
make docker clean make role test -
Проблемы с systemd:
# Проверьте, что образы поддерживают systemd make custom-images check
📈 Производительность
Оптимизация сборки
# Использование кеша Docker
make docker build
# Очистка кеша при проблемах
make docker rebuild
Оптимизация тестирования
# Использование minimal preset для быстрого тестирования
make role test minimal
# Использование performance preset для нагрузочного тестирования
make role test performance
🤝 Вклад в проект
- Fork репозитория
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Commit изменения (
git commit -m 'Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Создайте Pull Request
📄 Лицензия
MIT License - см. файл LICENSE
📞 Поддержка
При возникновении проблем:
- Проверьте наличие Docker и Docker Compose
- Убедитесь, что все preset файлы существуют
- Используйте
make helpдля справки - Проверьте логи:
make docker shellиdocker logs ansible-controller - Выполните диагностику:
make docker diagnose
🎯 Результат
Система тестирования теперь работает корректно:
- ✅ Полностью универсальная система preset'ов - любой preset без изменения Makefile
- ✅ Multi-arch поддержка для всех образов (amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6)
- ✅ Динамическое определение preset'ов через
filter-outиcut - ✅ Проверка существования preset'ов с подробной справкой
- ✅ Унифицированные имена контейнеров
- ✅ Надежные fallback значения
- ✅ Поддержка неограниченного количества custom preset'ов
- ✅ Автономная preset система сама управляет контейнерами
- ✅ Подробная документация и справка
- ✅ CI/CD интеграция с GitHub Actions, Azure DevOps, Jenkins, GitLab CI
- ✅ Ansible Vault интеграция с автоматическим управлением секретами
- ✅ Собственные Docker образы для различных ОС
- ✅ Systemd поддержка в контейнерах
- ✅ DinD/DOoD поддержка для Docker функциональности
- ✅ Интерактивное управление ролями - создание, удаление, просмотр ролей
- ✅ Автоматическое обновление playbook'ов при добавлении новых ролей
- ✅ Комплексное тестирование всех образов одновременно (all-images preset)
- ✅ Подробная документация по кастомизации deploy.yml с примерами
📚 Навигация по документации
🚀 Для начинающих
- docs/getting-started.md - Установка и первое тестирование
- dockerfiles/README.md - Изучение Docker образов
- docs/creating-roles.md - Создание первой роли
🛠️ Для разработчиков
- docs/creating-roles.md - Полное руководство по созданию ролей
- docs/cicd-setup.md - Настройка CI/CD
- docs/monitoring.md - Мониторинг и диагностика
🏗️ Для DevOps
- docs/cicd-setup.md - Настройка CI/CD для всех платформ
- docs/monitoring.md - Мониторинг и troubleshooting
- dockerfiles/README.md - Управление Docker образами
📖 Дополнительные ресурсы
- Makefile - Все доступные команды
- .ansible-lint - Конфигурация линтера
- requirements.yml - Ansible коллекции
- molecule/presets/ - Готовые preset'ы для тестирования
Автор: Сергей Антропов
Сайт: https://devops.org.ru