225 lines
11 KiB
Markdown
225 lines
11 KiB
Markdown
# AnsibleTemplate - Универсальная система тестирования Ansible ролей
|
||
|
||
**Автор:** Сергей Антропов
|
||
**Сайт:** https://devops.org.ru
|
||
|
||
## 🚀 Описание
|
||
|
||
AnsibleTemplate - это универсальная система для тестирования Ansible ролей с использованием Docker и различных preset'ов конфигурации.
|
||
|
||
## 🔧 Исправленные проблемы
|
||
|
||
### 1. **Проблема с preset'ами в Makefile**
|
||
- ✅ **Исправлено**: Полностью универсальная система - любой preset без изменения Makefile
|
||
- ✅ **Добавлено**: Динамическое определение preset'ов через `filter-out` и `cut`
|
||
- ✅ **Улучшено**: Динамическая загрузка preset'ов через `include_vars` в Ansible
|
||
- ✅ **Добавлено**: Fallback значения и подробная справка при ошибках
|
||
|
||
### 2. **Дублирование файлов preset'ов**
|
||
- ✅ **Исправлено**: Создан уникальный `default.yml` preset с 2 хостами (Debian + RHEL)
|
||
- ✅ **Сохранено**: `minimal.yml` для быстрого тестирования с 1 хостом
|
||
- ✅ **Улучшено**: Различные конфигурации для разных сценариев тестирования
|
||
|
||
### 3. **Проблемы с именами контейнеров**
|
||
- ✅ **Исправлено**: Унифицированы имена контейнеров (`ansible-controller`)
|
||
- ✅ **Обновлено**: Все файлы теперь используют одинаковые имена контейнеров
|
||
|
||
### 4. **Проблемы с путями**
|
||
- ✅ **Исправлено**: Пути в `create.yml` и `destroy.yml` теперь используют `preset.yml`
|
||
- ✅ **Добавлено**: Fallback значения для случаев отсутствия preset файлов
|
||
- ✅ **Улучшено**: Более надежная работа с переменными
|
||
|
||
### 5. **Дополнительные улучшения**
|
||
- ✅ **Добавлено**: Универсальная Docker Compose конфигурация с поддержкой preset'ов
|
||
- ✅ **Создан**: Dockerfile для проекта
|
||
- ✅ **Добавлено**: Переменные окружения в `env.example`
|
||
- ✅ **Улучшено**: Расширенная справка и команды Docker
|
||
- ✅ **Добавлено**: Команды для работы с preset'ами через Docker Compose
|
||
|
||
## 📁 Структура проекта
|
||
|
||
```
|
||
AnsibleTemplate/
|
||
├── molecule/
|
||
│ ├── default/ # Molecule конфигурация
|
||
│ │ ├── create.yml # Создание тестовых контейнеров
|
||
│ │ ├── converge.yml # Запуск тестов
|
||
│ │ ├── destroy.yml # Удаление контейнеров
|
||
│ │ └── site.yml # Основной playbook
|
||
│ └── presets/ # Preset'ы конфигурации
|
||
│ ├── default.yml # Стандартный preset (2 хоста)
|
||
│ ├── minimal.yml # Минимальный preset (1 хост)
|
||
│ ├── standard.yml # Расширенный preset (3 хоста)
|
||
│ └── docker.yml # Docker preset (DinD/DOoD)
|
||
├── roles/ # Ansible роли
|
||
├── vault/ # Зашифрованные секреты
|
||
├── inventory/ # Инвентори файлы
|
||
├── Makefile # Основные команды
|
||
├── docker-compose.yml # Docker Compose конфигурация
|
||
├── Dockerfile # Docker образ
|
||
└── env.example # Переменные окружения
|
||
```
|
||
|
||
## 🚀 Использование
|
||
|
||
### 🧪 Тестирование (Docker контейнеры)
|
||
|
||
```bash
|
||
# Просмотр доступных preset'ов
|
||
make role presets
|
||
|
||
# Тестирование с разными preset'ами
|
||
make role test # default preset
|
||
make role test minimal # minimal preset
|
||
make role test standard # standard preset
|
||
make role test docker # docker preset
|
||
make role test performance # performance preset
|
||
make role test security # security preset
|
||
make role test my-custom-preset # любой custom preset
|
||
```
|
||
|
||
**Особенности тестирования:**
|
||
- Использует Docker контейнеры для изоляции
|
||
- Динамический inventory создается из preset файлов
|
||
- Временные контейнеры (u1, u2, u3, ...)
|
||
- Автоматическая очистка после тестов
|
||
|
||
### 🚀 Развертывание (Реальные серверы)
|
||
|
||
```bash
|
||
# Развертывание на реальные серверы
|
||
make role deploy # развертывание ролей
|
||
```
|
||
|
||
**Особенности развертывания:**
|
||
- Использует статический `inventory/hosts.ini`
|
||
- Подключение по SSH к реальным серверам
|
||
- Dry-run проверка перед развертыванием
|
||
- Подтверждение пользователя
|
||
|
||
### 🔧 Вспомогательные команды
|
||
|
||
```bash
|
||
# Docker команды
|
||
make docker clean # очистить Docker ресурсы
|
||
|
||
# Другие команды
|
||
make role lint # проверка синтаксиса
|
||
make vault create # создание секретов
|
||
make help # полная справка
|
||
```
|
||
|
||
### Preset'ы конфигурации
|
||
|
||
| Preset | Описание | Хосты | Использование |
|
||
|--------|----------|-------|---------------|
|
||
| `default` | Стандартный preset | 2 хоста (Debian + RHEL) | Базовое тестирование |
|
||
| `minimal` | Минимальный preset | 1 хост (Debian) | Быстрое тестирование |
|
||
| `standard` | Расширенный preset | 3 хоста (Debian + RHEL + Debian) | Полное тестирование |
|
||
| `docker` | Docker preset | DinD + DOoD узлы | Тестирование Docker функциональности |
|
||
| `performance` | Performance preset | 5 хостов (Debian + RHEL) | Нагрузочное тестирование |
|
||
| `security` | Security preset | 3 хоста (Debian + RHEL) | Тестирование безопасности |
|
||
| `[custom]` | Любой custom preset | Любое количество | Пользовательские сценарии |
|
||
|
||
## 🔧 Технические детали
|
||
|
||
### Исправления в Makefile
|
||
|
||
1. **Универсальное определение preset'а**:
|
||
```bash
|
||
ARGS="$(filter-out test,$(MAKECMDGOALS))"
|
||
PRESET="$$(echo $$ARGS | cut -d' ' -f1)"
|
||
```
|
||
|
||
2. **Проверка существования preset'ов с подробной справкой**:
|
||
```bash
|
||
if [ ! -f "molecule/presets/$$PRESET.yml" ]; then
|
||
echo "❌ Ошибка: Пресет '$PRESET' не найден!"
|
||
# Показать доступные preset'ы и примеры использования
|
||
fi
|
||
```
|
||
|
||
3. **Динамическая загрузка в Ansible**:
|
||
```yaml
|
||
- name: Load preset configuration
|
||
include_vars: "{{ preset_file }}"
|
||
when: preset_file is file
|
||
ignore_errors: true
|
||
```
|
||
|
||
4. **Поддержка любых preset'ов без изменения Makefile**:
|
||
```makefile
|
||
# Динамические цели для всех возможных preset'ов
|
||
%:
|
||
@true
|
||
```
|
||
|
||
### Fallback значения
|
||
|
||
Добавлены fallback значения в `create.yml` и `destroy.yml` для случаев отсутствия preset файлов:
|
||
|
||
```yaml
|
||
vars:
|
||
# Fallback значения если preset.yml не найден
|
||
docker_network: labnet
|
||
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||
# ... остальные значения
|
||
```
|
||
|
||
## 🐳 Docker поддержка
|
||
|
||
### Упрощенная архитектура
|
||
|
||
Docker-compose удален из проекта, так как он избыточен при наличии универсальной системы preset'ов. Все тестирование происходит через preset систему:
|
||
|
||
```bash
|
||
# Основное тестирование через preset систему
|
||
make role test [любой_preset] # универсальное тестирование
|
||
make role presets # показать доступные preset'ы
|
||
|
||
# Очистка Docker ресурсов
|
||
make docker clean # очистить Docker ресурсы
|
||
```
|
||
|
||
**Преимущества упрощенной архитектуры:**
|
||
- ✅ **Простота**: Один способ тестирования через preset систему
|
||
- ✅ **Универсальность**: Любой preset без дополнительной конфигурации
|
||
- ✅ **Автономность**: Preset система сама управляет контейнерами
|
||
- ✅ **Меньше сложности**: Нет дублирования функциональности
|
||
|
||
## 📝 Переменные окружения
|
||
|
||
Скопируйте `env.example` в `.env` и настройте под свои нужды:
|
||
|
||
```bash
|
||
cp env.example .env
|
||
```
|
||
|
||
## 🎯 Результат
|
||
|
||
Теперь система тестирования работает корректно:
|
||
|
||
1. ✅ **Полностью универсальная система preset'ов - любой preset без изменения Makefile**
|
||
2. ✅ **Динамическое определение preset'ов через `filter-out` и `cut`**
|
||
3. ✅ **Проверка существования preset'ов с подробной справкой**
|
||
4. ✅ **Унифицированные имена контейнеров**
|
||
5. ✅ **Надежные fallback значения**
|
||
6. ✅ **Упрощенная архитектура без docker-compose**
|
||
7. ✅ **Поддержка неограниченного количества custom preset'ов**
|
||
8. ✅ **Автономная preset система сама управляет контейнерами**
|
||
9. ✅ **Подробная документация и справка**
|
||
|
||
## 📞 Поддержка
|
||
|
||
При возникновении проблем:
|
||
|
||
1. Проверьте наличие Docker и Docker Compose
|
||
2. Убедитесь, что все preset файлы существуют
|
||
3. Используйте `make help` для справки
|
||
4. Проверьте логи: `make docker shell` и `docker logs ansible-controller`
|
||
|
||
---
|
||
|
||
**Автор:** Сергей Антропов
|
||
**Сайт:** https://devops.org.ru
|