Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Удален файл env.example (не использовался в проекте) - Обновлена документация в README.md и docs/getting-started.md - Удалены упоминания о .env файлах из инструкций - Обновлены инструкции по настройке проекта через переменные окружения Проект использует настройки через Makefile и переменные окружения, а не через .env файлы.
2164 lines
68 KiB
Markdown
2164 lines
68 KiB
Markdown
# AnsibleLab - Универсальная система тестирования Ansible ролей
|
||
|
||
**Автор:** Сергей Антропов
|
||
**Сайт:** https://devops.org.ru
|
||
**Версия:** 2.0.0
|
||
|
||
## 🚀 Описание
|
||
|
||
AnsibleLab - это универсальная система для тестирования Ansible ролей с использованием Docker, Molecule и различных preset'ов конфигурации. Система поддерживает multi-arch сборку, CI/CD интеграцию и работу с различными операционными системами.
|
||
|
||
## 📚 Документация
|
||
|
||
### 🚀 Быстрый старт
|
||
- **[docs/getting-started.md](docs/getting-started.md)** - Установка, настройка и первое тестирование
|
||
|
||
### 🛠️ Разработка
|
||
- **[docs/creating-roles.md](docs/creating-roles.md)** - Создание и разработка ролей
|
||
- **[docs/site-yml-guide.md](docs/site-yml-guide.md)** - Руководство по файлу site.yml
|
||
- **[docs/molecule-guide.md](docs/molecule-guide.md)** - Подробное руководство по Molecule
|
||
- **[docs/all-images-preset.md](docs/all-images-preset.md)** - Пресет all-images для тестирования всех образов
|
||
- **[docs/deploy-yml-customization.md](docs/deploy-yml-customization.md)** - Полное руководство по кастомизации deploy.yml
|
||
- **[dockerfiles/README.md](dockerfiles/README.md)** - Подробная документация по Docker образам
|
||
|
||
### 🏗️ CI/CD
|
||
- **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD для GitHub Actions, Azure DevOps, Jenkins, GitLab CI
|
||
|
||
### 📊 Мониторинг
|
||
- **[docs/monitoring.md](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 коллекции
|
||
├── ansible.cfg # Конфигурация Ansible
|
||
└── Dockerfile # Основной Docker образ
|
||
```
|
||
|
||
## 📋 Важные изменения
|
||
|
||
### Перемещение deploy.yml
|
||
**Файл `deploy.yml` перенесен из корня проекта в папку `roles/`** для лучшей организации структуры проекта. Теперь все playbook'и находятся в одном месте.
|
||
|
||
**Новое расположение:** `roles/deploy.yml`
|
||
**Старое расположение:** `deploy.yml` (в корне)
|
||
|
||
Все пути в проекте автоматически обновлены. Если вы используете старые скрипты или документацию, обновите пути с `deploy.yml` на `roles/deploy.yml`.
|
||
|
||
## 🚀 Быстрый старт
|
||
|
||
> 📖 **Подробное руководство:** [docs/getting-started.md](docs/getting-started.md)
|
||
|
||
### 1. Клонирование и настройка
|
||
|
||
```bash
|
||
git clone https://github.com/your-username/AnsibleLab.git
|
||
cd AnsibleLab
|
||
```
|
||
|
||
### 2. Настройка Docker
|
||
|
||
```bash
|
||
# Настройка multi-arch builder
|
||
make docker setup-builder
|
||
|
||
# Сборка всех образов (multi-arch)
|
||
make docker build
|
||
|
||
# Проверка собранных образов
|
||
make docker info
|
||
```
|
||
|
||
### 3. Управление ролями
|
||
|
||
```bash
|
||
# Просмотр всех ролей
|
||
make role list
|
||
|
||
# Создание новой роли (интерактивно)
|
||
make role create
|
||
|
||
# Удаление роли (интерактивно)
|
||
make role delete
|
||
```
|
||
|
||
### 4. Тестирование ролей
|
||
|
||
```bash
|
||
# Просмотр доступных 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:
|
||
|
||
```bash
|
||
# Просмотр всех доступных 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 | Любое количество | Пользовательские сценарии |
|
||
|
||
### Тестирование с собственными образами
|
||
|
||
```bash
|
||
# Проверка наличия собственных образов
|
||
make custom-images check
|
||
|
||
# Тестирование с собственными образами
|
||
make custom-images test minimal
|
||
make custom-images test full
|
||
make custom-images test performance
|
||
```
|
||
|
||
## 🐳 Docker образы
|
||
|
||
> 📖 **Подробная документация:** [dockerfiles/README.md](dockerfiles/README.md)
|
||
|
||
### Multi-Arch поддержка
|
||
|
||
Система поддерживает сборку для множества архитектур:
|
||
|
||
```bash
|
||
# Настройка 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 |
|
||
|
||
### Управление образами
|
||
|
||
```bash
|
||
# Информация об образах
|
||
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
|
||
|
||
```bash
|
||
# Инициализация 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 контейнеры)
|
||
|
||
```bash
|
||
# Тестирование с разными 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 правами)
|
||
|
||
**Пример динамического инвентори для тестирования:**
|
||
```ini
|
||
# Автоматически создается из 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
|
||
```
|
||
|
||
### Развертывание (Реальные серверы)
|
||
|
||
```bash
|
||
# Развертывание на реальные серверы
|
||
make role deploy # развертывание ролей
|
||
```
|
||
|
||
**Инвентори для продакшн развертывания:**
|
||
- **Источник:** Статический файл `inventory/hosts.ini`
|
||
- **Расположение:** `inventory/hosts.ini`
|
||
- **Содержимое:** Реальные серверы с SSH подключением
|
||
- **Сеть:** Интернет или внутренняя сеть
|
||
- **Пользователь:** `devops` (настраивается в `ansible.cfg`)
|
||
|
||
**Пример продакшн инвентори:**
|
||
```ini
|
||
# 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`:**
|
||
```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 ключей:**
|
||
```bash
|
||
# Генерация 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. Тестирование подключения:**
|
||
```bash
|
||
# Проверка подключения к серверам
|
||
ansible all -i inventory/hosts.ini -m ping
|
||
|
||
# Проверка конкретной группы
|
||
ansible web_servers -i inventory/hosts.ini -m ping
|
||
```
|
||
|
||
### Особенности развертывания
|
||
|
||
**Dry-run проверка:**
|
||
```bash
|
||
# Проверка без изменений
|
||
make role deploy
|
||
# Выполняется: ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check
|
||
```
|
||
|
||
**Подтверждение развертывания:**
|
||
```bash
|
||
# Интерактивное подтверждение
|
||
make role deploy
|
||
# Запрашивается подтверждение: "Продолжить развертывание? (y/N):"
|
||
```
|
||
|
||
**Логирование и мониторинг:**
|
||
```bash
|
||
# Подробные логи
|
||
ANSIBLE_STDOUT_CALLBACK=yaml make role deploy
|
||
|
||
# Сохранение логов
|
||
make role deploy 2>&1 | tee deployment.log
|
||
```
|
||
|
||
## 🔧 Вспомогательные команды
|
||
|
||
### Управление ролями
|
||
|
||
```bash
|
||
# Просмотр всех ролей
|
||
make role list
|
||
|
||
# Создание новой роли (интерактивно)
|
||
make role create
|
||
|
||
# Удаление роли (интерактивно)
|
||
make role delete
|
||
|
||
# Проверка синтаксиса ролей
|
||
make role lint
|
||
```
|
||
|
||
### Docker команды
|
||
|
||
```bash
|
||
# Очистка Docker ресурсов
|
||
make docker clean
|
||
|
||
# Полная очистка Docker (ОСТОРОЖНО!)
|
||
make docker purge
|
||
|
||
# Обновление всех образов
|
||
make docker update
|
||
```
|
||
|
||
### Другие команды
|
||
|
||
```bash
|
||
# Создание секретов
|
||
make vault create
|
||
|
||
# Полная справка
|
||
make help
|
||
```
|
||
|
||
## 🏗️ CI/CD интеграция
|
||
|
||
> 📖 **Подробное руководство:** [docs/cicd-setup.md](docs/cicd-setup.md)
|
||
|
||
### GitHub Actions
|
||
|
||
```yaml
|
||
# .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
|
||
|
||
```yaml
|
||
# 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
|
||
|
||
```groovy
|
||
// 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
|
||
|
||
```yaml
|
||
# .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/`:**
|
||
1. **Автоматически включается** в lint проверку
|
||
2. **Автоматически включается** в тестирование
|
||
3. **Автоматически включается** в развертывание
|
||
4. **CI/CD пайплайны** автоматически тестируют новую роль
|
||
|
||
**Настройка уведомлений:**
|
||
```yaml
|
||
# .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. Автоматическое обнаружение новых ролей:**
|
||
```yaml
|
||
# .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'ов:**
|
||
```bash
|
||
#!/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:**
|
||
```yaml
|
||
# .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. Настройка уведомлений о новых ролях:**
|
||
```yaml
|
||
# .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. Автоматическое создание документации для новых ролей:**
|
||
```bash
|
||
#!/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:**
|
||
```yaml
|
||
# .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. Автоматическое создание скриптов:**
|
||
```bash
|
||
#!/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](docs/monitoring.md)
|
||
|
||
### Диагностика Docker
|
||
|
||
```bash
|
||
# Диагностика buildx проблем
|
||
make docker diagnose
|
||
|
||
# Проверка builder'а
|
||
make docker setup-builder
|
||
|
||
# Сброс builder'а при проблемах
|
||
make docker reset-builder
|
||
```
|
||
|
||
### Логи и отчеты
|
||
|
||
```bash
|
||
# Просмотр логов контейнера
|
||
docker logs ansible-controller
|
||
|
||
# Вход в контейнер для отладки
|
||
docker exec -it ansible-controller bash
|
||
```
|
||
|
||
## 🛠️ Разработка
|
||
|
||
> 📖 **Подробное руководство:** [docs/creating-roles.md](docs/creating-roles.md)
|
||
|
||
### Создание новых preset'ов
|
||
|
||
1. Создайте файл `molecule/presets/my-preset.yml`:
|
||
|
||
```yaml
|
||
#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]
|
||
```
|
||
|
||
2. Используйте preset:
|
||
|
||
```bash
|
||
make role test my-preset
|
||
```
|
||
|
||
### Создание новых ролей
|
||
|
||
#### 1. Создание структуры роли
|
||
|
||
```bash
|
||
# Создание директории роли
|
||
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`** - основные задачи:
|
||
```yaml
|
||
---
|
||
# Основные задачи для роли 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`** - переменные по умолчанию:
|
||
```yaml
|
||
---
|
||
# Переменные по умолчанию для роли 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`** - обработчики:
|
||
```yaml
|
||
---
|
||
# Обработчики для роли 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`** - метаданные роли:
|
||
```yaml
|
||
---
|
||
# Метаданные роли 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`** - документация роли:
|
||
```markdown
|
||
# Роль 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
|
||
```
|
||
|
||
**Как это работает:**
|
||
1. **Lint проверка:** `ansible-lint roles/` автоматически находит все роли в директории `roles/`
|
||
2. **Тестирование:** `molecule/default/site.yml` автоматически включает все роли из `roles/`
|
||
3. **Развертывание:** `roles/deploy.yml` автоматически включает все роли из `roles/`
|
||
|
||
**Ручная проверка конкретной роли:**
|
||
```bash
|
||
# Lint проверка конкретной роли
|
||
ansible-lint roles/my-role/
|
||
|
||
# Тестирование конкретной роли
|
||
cd roles/my-role
|
||
molecule test
|
||
```
|
||
|
||
**Автоматическое включение ролей в playbook'и:**
|
||
|
||
**В `molecule/default/site.yml` (для тестирования):**
|
||
```yaml
|
||
---
|
||
# Автоматически включает все роли из директории roles/
|
||
# Автор: Сергей Антропов
|
||
# Сайт: https://devops.org.ru
|
||
|
||
- name: Тестирование всех ролей
|
||
hosts: all
|
||
roles:
|
||
- ping # Автоматически включается
|
||
- my-role # Автоматически включается
|
||
# Добавьте сюда новые роли по мере их создания
|
||
```
|
||
|
||
**В `roles/deploy.yml` (для продакшн развертывания):**
|
||
```yaml
|
||
---
|
||
# Автоматически включает все роли из директории roles/
|
||
# Автор: Сергей Антропов
|
||
# Сайт: https://devops.org.ru
|
||
|
||
- name: Развертывание всех ролей
|
||
hosts: all
|
||
roles:
|
||
- ping # Автоматически включается
|
||
- my-role # Автоматически включается
|
||
# Добавьте сюда новые роли по мере их создания
|
||
```
|
||
|
||
#### 4. Интеграция с основным playbook
|
||
|
||
**Обновление `molecule/default/site.yml`:**
|
||
```yaml
|
||
---
|
||
# Основной 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`:**
|
||
```yaml
|
||
---
|
||
# 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 файлах):**
|
||
```yaml
|
||
# 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):**
|
||
```yaml
|
||
# 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
|
||
```
|
||
|
||
**Переменные для конкретных групп:**
|
||
```yaml
|
||
# 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;
|
||
}
|
||
}
|
||
```
|
||
|
||
**Переменные для конкретных хостов:**
|
||
```yaml
|
||
# inventory/host_vars/web1.example.com.yml
|
||
---
|
||
# Переменные для конкретного хоста
|
||
my_role_hostname: web1
|
||
my_role_domain: example.com
|
||
my_role_ssl_enabled: true
|
||
```
|
||
|
||
#### 6. Тестирование новой роли
|
||
|
||
```bash
|
||
# 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. Полный цикл разработки роли
|
||
|
||
```bash
|
||
# 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 команду для автоматического обновления:**
|
||
```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'и обновлены"
|
||
```
|
||
|
||
**Использование:**
|
||
```bash
|
||
# Автоматическое обновление playbook'ов
|
||
make update-playbooks
|
||
|
||
# Проверка обновленных playbook'ов
|
||
make role test
|
||
```
|
||
|
||
#### 9. Автоматическое создание документации
|
||
|
||
**Добавьте в Makefile команду для создания документации:**
|
||
```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 "✅ Документация сгенерирована"
|
||
```
|
||
|
||
**Использование:**
|
||
```bash
|
||
# Автоматическое создание документации
|
||
make generate-docs
|
||
|
||
# Проверка созданной документации
|
||
ls -la roles/*/README.md
|
||
```
|
||
|
||
#### 10. Полный цикл с автоматизацией
|
||
|
||
```bash
|
||
# 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` и могут быть переопределены через переменные окружения:
|
||
|
||
```bash
|
||
# Основные настройки
|
||
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 конфигурация
|
||
|
||
```ini
|
||
# ansible.cfg
|
||
[defaults]
|
||
inventory = inventory/hosts.ini
|
||
remote_user = devops
|
||
host_key_checking = False
|
||
enable_plugins = yaml, ini
|
||
roles_path = roles/
|
||
interpreter_python = auto
|
||
|
||
# Настройки для тестирования
|
||
[test]
|
||
inventory = molecule/default/inventory/hosts.ini
|
||
remote_user = ansible
|
||
host_key_checking = False
|
||
|
||
# Настройки для продакшн
|
||
[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`** - общие переменные:
|
||
```yaml
|
||
---
|
||
# Общие переменные для всех серверов
|
||
# Автор: Сергей Антропов
|
||
# Сайт: 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 серверов:
|
||
```yaml
|
||
---
|
||
# Переменные для 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`** - переменные для конкретного хоста:
|
||
```yaml
|
||
---
|
||
# Переменные для 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`** - зашифрованные секреты:
|
||
```yaml
|
||
---
|
||
# Зашифрованные секреты
|
||
# Автор: Сергей Антропов
|
||
# Сайт: 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`:**
|
||
```yaml
|
||
---
|
||
# Основные задачи для роли 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`:**
|
||
```jinja2
|
||
# Конфигурация 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
|
||
|
||
1. **Builder не создается:**
|
||
```bash
|
||
make docker diagnose
|
||
make docker reset-builder
|
||
```
|
||
|
||
2. **Образы не собираются:**
|
||
```bash
|
||
make docker clean
|
||
make docker setup-builder
|
||
make docker build
|
||
```
|
||
|
||
3. **Проблемы с multi-arch:**
|
||
```bash
|
||
make docker clean-builder
|
||
make docker setup-builder
|
||
```
|
||
|
||
### Проблемы с тестированием
|
||
|
||
1. **Preset не найден:**
|
||
```bash
|
||
make presets list
|
||
# Проверьте наличие файла molecule/presets/your-preset.yml
|
||
```
|
||
|
||
2. **Контейнеры не создаются:**
|
||
```bash
|
||
make docker clean
|
||
make role test
|
||
```
|
||
|
||
3. **Проблемы с systemd:**
|
||
```bash
|
||
# Проверьте, что образы поддерживают systemd
|
||
make custom-images check
|
||
```
|
||
|
||
## 📈 Производительность
|
||
|
||
### Оптимизация сборки
|
||
|
||
```bash
|
||
# Использование кеша Docker
|
||
make docker build
|
||
|
||
# Очистка кеша при проблемах
|
||
make docker rebuild
|
||
```
|
||
|
||
### Оптимизация тестирования
|
||
|
||
```bash
|
||
# Использование minimal preset для быстрого тестирования
|
||
make role test minimal
|
||
|
||
# Использование performance preset для нагрузочного тестирования
|
||
make role test performance
|
||
```
|
||
|
||
## 🤝 Вклад в проект
|
||
|
||
1. Fork репозитория
|
||
2. Создайте feature branch (`git checkout -b feature/amazing-feature`)
|
||
3. Commit изменения (`git commit -m 'Add amazing feature'`)
|
||
4. Push в branch (`git push origin feature/amazing-feature`)
|
||
5. Создайте Pull Request
|
||
|
||
## 📄 Лицензия
|
||
|
||
MIT License - см. файл [LICENSE](LICENSE)
|
||
|
||
## 📞 Поддержка
|
||
|
||
При возникновении проблем:
|
||
|
||
1. Проверьте наличие Docker и Docker Compose
|
||
2. Убедитесь, что все preset файлы существуют
|
||
3. Используйте `make help` для справки
|
||
4. Проверьте логи: `make docker shell` и `docker logs ansible-controller`
|
||
5. Выполните диагностику: `make docker diagnose`
|
||
|
||
## 🎯 Результат
|
||
|
||
Система тестирования теперь работает корректно:
|
||
|
||
1. ✅ **Полностью универсальная система preset'ов - любой preset без изменения Makefile**
|
||
2. ✅ **Multi-arch поддержка для всех образов (amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6)**
|
||
3. ✅ **Динамическое определение preset'ов через `filter-out` и `cut`**
|
||
4. ✅ **Проверка существования preset'ов с подробной справкой**
|
||
5. ✅ **Унифицированные имена контейнеров**
|
||
6. ✅ **Надежные fallback значения**
|
||
7. ✅ **Поддержка неограниченного количества custom preset'ов**
|
||
8. ✅ **Автономная preset система сама управляет контейнерами**
|
||
9. ✅ **Подробная документация и справка**
|
||
10. ✅ **CI/CD интеграция с GitHub Actions, Azure DevOps, Jenkins, GitLab CI**
|
||
11. ✅ **Ansible Vault интеграция с автоматическим управлением секретами**
|
||
12. ✅ **Собственные Docker образы для различных ОС**
|
||
13. ✅ **Systemd поддержка в контейнерах**
|
||
14. ✅ **DinD/DOoD поддержка для Docker функциональности**
|
||
15. ✅ **Интерактивное управление ролями** - создание, удаление, просмотр ролей
|
||
16. ✅ **Автоматическое обновление playbook'ов** при добавлении новых ролей
|
||
17. ✅ **Комплексное тестирование всех образов** одновременно (all-images preset)
|
||
18. ✅ **Подробная документация по кастомизации deploy.yml** с примерами
|
||
|
||
## 📚 Навигация по документации
|
||
|
||
### 🚀 Для начинающих
|
||
1. **[docs/getting-started.md](docs/getting-started.md)** - Установка и первое тестирование
|
||
2. **[dockerfiles/README.md](dockerfiles/README.md)** - Изучение Docker образов
|
||
3. **[docs/creating-roles.md](docs/creating-roles.md)** - Создание первой роли
|
||
|
||
### 🛠️ Для разработчиков
|
||
1. **[docs/creating-roles.md](docs/creating-roles.md)** - Полное руководство по созданию ролей
|
||
2. **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD
|
||
3. **[docs/monitoring.md](docs/monitoring.md)** - Мониторинг и диагностика
|
||
|
||
### 🏗️ Для DevOps
|
||
1. **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD для всех платформ
|
||
2. **[docs/monitoring.md](docs/monitoring.md)** - Мониторинг и troubleshooting
|
||
3. **[dockerfiles/README.md](dockerfiles/README.md)** - Управление Docker образами
|
||
|
||
### 📖 Дополнительные ресурсы
|
||
- **Makefile** - Все доступные команды
|
||
- **ansible.cfg** - Конфигурация Ansible
|
||
- **requirements.yml** - Ansible коллекции
|
||
- **molecule/presets/** - Готовые preset'ы для тестирования
|
||
|
||
---
|
||
|
||
**Автор:** Сергей Антропов
|
||
**Сайт:** https://devops.org.ru |