Compare commits
30 Commits
8071fba25f
...
lab
| Author | SHA1 | Date | |
|---|---|---|---|
| 3550678b0c | |||
| f12bbc626d | |||
| 2d8d770b3f | |||
| 4f9b3029cc | |||
| 8dd066f752 | |||
| 102003bb32 | |||
| c59edae00d | |||
| a9fcee13ef | |||
| 1909746098 | |||
| f45ae8b64e | |||
| 3fe419f38e | |||
| c8dbc5356f | |||
| 82c532fcf1 | |||
| eb61afb35a | |||
| a88c85d164 | |||
| 2ee52d22ef | |||
| f48ed43bcc | |||
| b1f681fb30 | |||
| 0eb717ad82 | |||
| 111efd7d92 | |||
| d6bc3f1f31 | |||
| a875a874e9 | |||
| e6287769d6 | |||
| 51c76fb859 | |||
| dc255d006a | |||
| 26a09cd637 | |||
| df97e9d3d4 | |||
| 09ca55539f | |||
| 9c55c8f615 | |||
| f2a0f46813 |
@@ -5,3 +5,7 @@ skip_list:
|
|||||||
- yaml[line-length]
|
- yaml[line-length]
|
||||||
- var-naming[no-role-prefix]
|
- var-naming[no-role-prefix]
|
||||||
- 'ignore-errors'
|
- 'ignore-errors'
|
||||||
|
|
||||||
|
exclude_paths:
|
||||||
|
- molecule/universal/
|
||||||
|
- files/playbooks/
|
||||||
33
.gitignore
vendored
33
.gitignore
vendored
@@ -171,3 +171,36 @@ cython_debug/
|
|||||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
|
# ---> Ansible Template Project Specific
|
||||||
|
# Vault password files
|
||||||
|
.vault
|
||||||
|
vault/.vault
|
||||||
|
vault-password.txt
|
||||||
|
|
||||||
|
# IDE directories
|
||||||
|
.cursor/
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
# Project specific
|
||||||
|
.env
|
||||||
|
*.log
|
||||||
|
*.tmp
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
.docker/
|
||||||
|
|
||||||
|
# Reports and snapshots (keep structure but ignore content)
|
||||||
|
reports/*.html
|
||||||
|
reports/*.json
|
||||||
|
snapshots/*.tar.gz
|
||||||
|
snapshots/*.zip
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
*.retry
|
||||||
|
*.backup
|
||||||
|
*.bak
|
||||||
|
|
||||||
|
|||||||
178
README.md
178
README.md
@@ -11,16 +11,18 @@
|
|||||||
|
|
||||||
### 🎯 Основные возможности
|
### 🎯 Основные возможности
|
||||||
|
|
||||||
- **Динамическое создание инфраструктуры** - автоматическое развертывание Docker контейнеров и Kind кластеров
|
- **🎯 Интерактивный интерфейс** - полноценный TUI с whiptail для удобного управления
|
||||||
- **Поддержка различных ОС** - тестирование ролей на Debian и RHEL-подобных системах
|
- **🚀 Автоматическая инициализация** - настройка проекта при первом запуске
|
||||||
- **Docker-in-Docker (DinD)** - изолированные Docker-среды внутри контейнеров
|
- **🧪 Универсальная лаборатория** - автоматическое развертывание Docker контейнеров и Kind кластеров
|
||||||
- **Docker-outside-of-Docker (DOoD)** - использование Docker-демона хоста из контейнера
|
- **☸️ Kubernetes поддержка** - полноценные Kind кластеры с аддонами
|
||||||
- **Kubernetes кластеры** - полноценные Kind кластеры с аддонами
|
- **📋 21 готовый пресет** - от простых до экстремально сложных сценариев
|
||||||
- **Service Mesh** - Istio с Kiali для визуализации
|
- **🎭 Управление ролями** - интерактивное создание и тестирование Ansible ролей
|
||||||
- **Мониторинг** - Prometheus, Grafana, Jaeger для полной наблюдаемости
|
- **🔐 Безопасность vault** - автоматическое управление секретами
|
||||||
- **21 готовый пресет** - от простых до экстремально сложных сценариев
|
- **📊 Красивые отчеты** - HTML отчеты о результатах тестирования
|
||||||
- **HTML отчеты** - красивые отчеты о результатах тестирования
|
- **🔧 CI/CD команды** - автоматизированное тестирование, линтинг и развертывание
|
||||||
- **Снапшоты** - сохранение и восстановление состояния лаборатории
|
- **📸 Снапшоты** - сохранение и восстановление состояния лаборатории
|
||||||
|
- **🌐 Service Mesh** - Istio с Kiali для визуализации
|
||||||
|
- **📈 Мониторинг** - Prometheus, Grafana для полной наблюдаемости
|
||||||
|
|
||||||
## 🚀 Быстрый старт
|
## 🚀 Быстрый старт
|
||||||
|
|
||||||
@@ -38,10 +40,15 @@
|
|||||||
git clone https://github.com/your-username/ansible-template.git
|
git clone https://github.com/your-username/ansible-template.git
|
||||||
cd ansible-template
|
cd ansible-template
|
||||||
|
|
||||||
# Создать необходимые файлы
|
# Запустить проект (автоматическая инициализация)
|
||||||
echo "your-vault-password" > vault-password.txt
|
make
|
||||||
mkdir -p roles
|
# При первом запуске автоматически запустится интерактивная настройка:
|
||||||
mkdir -p files/playbooks
|
# - Название проекта, версия, автор, сайт
|
||||||
|
# - Настройки Docker (образ, сеть)
|
||||||
|
# - Настройки лаборатории (сценарий, пресет)
|
||||||
|
# - Настройки Kubernetes (контекст, версии Istio/Kind)
|
||||||
|
# - Пути к папкам и файлам
|
||||||
|
# После настройки откроется главное меню
|
||||||
|
|
||||||
# Установить pre-commit хуки (опционально)
|
# Установить pre-commit хуки (опционально)
|
||||||
make pre-commit-install
|
make pre-commit-install
|
||||||
@@ -50,16 +57,138 @@ make pre-commit-install
|
|||||||
### Первый запуск
|
### Первый запуск
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# Инициализация проекта
|
||||||
|
make init
|
||||||
|
|
||||||
# Поднять контроллер
|
# Поднять контроллер
|
||||||
make lab-up
|
make lab up
|
||||||
|
|
||||||
# Запустить минимальную лабораторию
|
# Запустить минимальную лабораторию
|
||||||
make lab-test LAB_SPEC=molecule/presets/minimal.yml
|
make lab test
|
||||||
|
|
||||||
# Посмотреть отчет
|
# Посмотреть отчет
|
||||||
make lab-report
|
make report
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Основные команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Показать справку
|
||||||
|
make help
|
||||||
|
|
||||||
|
# Управление лабораторией
|
||||||
|
make lab up # Поднять контроллер
|
||||||
|
make lab down # Остановить контроллер
|
||||||
|
make lab test # Полный цикл тестирования
|
||||||
|
make lab create # Создать инфраструктуру
|
||||||
|
make lab converge # Запустить роли
|
||||||
|
make lab verify # Проверить работу
|
||||||
|
make lab destroy # Уничтожить инфраструктуру
|
||||||
|
make lab reset # Полный сброс
|
||||||
|
|
||||||
|
# Управление Kubernetes
|
||||||
|
make kube sh # Войти в контейнер
|
||||||
|
make kube cmd CLUSTER=lab CMD="get pods -A"
|
||||||
|
make kube kiali CLUSTER=lab
|
||||||
|
make kube istio CLUSTER=lab
|
||||||
|
make kube grafana CLUSTER=lab
|
||||||
|
make kube prom CLUSTER=lab
|
||||||
|
make kube kubeconfig CLUSTER=lab # Получить kubeconfig
|
||||||
|
|
||||||
|
# Управление пресетами
|
||||||
|
make preset list # Список пресетов
|
||||||
|
make preset create NAME=my-preset
|
||||||
|
make preset test NAME=my-preset
|
||||||
|
make preset edit NAME=my-preset
|
||||||
|
|
||||||
|
# Управление ролями
|
||||||
|
make role list # Список ролей
|
||||||
|
make role create NAME=my-role # Создать роль (интерактивно)
|
||||||
|
make role test NAME=my-role # Тестировать роль
|
||||||
|
make role lint # Проверка ролей
|
||||||
|
make role deploy # Развертывание ролей
|
||||||
|
make role info NAME=my-role # Информация о роли
|
||||||
|
make role playbook NAME=my-role # Управление playbooks роли
|
||||||
|
|
||||||
|
# Проверка всего проекта
|
||||||
|
make lint # Проверить весь проект на ошибки
|
||||||
|
make check-secrets # Проверить безопасность секретов
|
||||||
|
make idempotence # Проверить идемпотентность
|
||||||
|
make chaos # Запустить Chaos Engineering тесты
|
||||||
|
|
||||||
|
# Управление Vault
|
||||||
|
make vault show # Показать содержимое
|
||||||
|
make vault create # Создать vault файл
|
||||||
|
make vault edit # Редактировать vault файл
|
||||||
|
|
||||||
|
# Управление Git
|
||||||
|
make git status # Статус репозитория
|
||||||
|
make git add # Добавить файлы
|
||||||
|
make git commit MESSAGE="your message"
|
||||||
|
make git push # Отправить изменения
|
||||||
|
|
||||||
|
# Отчеты и мониторинг
|
||||||
|
make report # HTML отчет
|
||||||
|
make kubeconfigs # Получить все kubeconfig файлы
|
||||||
|
make open-report # Открыть отчет в браузере
|
||||||
|
make full-test # Полный цикл с отчетом и kubeconfig
|
||||||
|
make snapshot # Создать снапшот
|
||||||
|
make restore # Восстановить снапшот
|
||||||
|
make cleanup # Очистить лабораторию
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 Новые возможности
|
||||||
|
|
||||||
|
### Интерактивный интерфейс
|
||||||
|
|
||||||
|
Проект теперь имеет полноценный TUI (Text User Interface) с whiptail:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Главное меню (запускается автоматически)
|
||||||
|
make
|
||||||
|
|
||||||
|
# Интерактивные команды
|
||||||
|
make preset-create-interactive # Создание пресета через диалоги
|
||||||
|
make role-create-interactive # Создание роли через диалоги
|
||||||
|
```
|
||||||
|
|
||||||
|
### Автоматическая инициализация
|
||||||
|
|
||||||
|
При первом запуске проекта автоматически запускается интерактивная настройка:
|
||||||
|
|
||||||
|
- Настройка основных параметров проекта
|
||||||
|
- Конфигурация Docker и лаборатории
|
||||||
|
- Настройка Kubernetes и мониторинга
|
||||||
|
- Создание необходимых файлов и папок
|
||||||
|
|
||||||
|
### CI/CD команды
|
||||||
|
|
||||||
|
Полный набор команд для автоматизированного тестирования:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Основные CI/CD команды
|
||||||
|
make ci-validate # Валидация проекта
|
||||||
|
make ci-lint # Проверка синтаксиса
|
||||||
|
make ci-test # Запуск тестов
|
||||||
|
make ci-deploy # Развертывание
|
||||||
|
make ci-security # Проверка безопасности
|
||||||
|
make ci-report # Генерация отчета
|
||||||
|
make ci-cleanup # Очистка после тестов
|
||||||
|
|
||||||
|
# Комбинированные команды
|
||||||
|
make ci-full # Полный цикл (lint + test + deploy)
|
||||||
|
make ci-all # Все проверки
|
||||||
|
```
|
||||||
|
|
||||||
|
### Управление ролями
|
||||||
|
|
||||||
|
Интерактивное создание и управление Ansible ролями:
|
||||||
|
|
||||||
|
- Автоматическое создание структуры роли
|
||||||
|
- Универсальные задачи для Debian и RHEL
|
||||||
|
- Создание handlers, defaults, meta файлов
|
||||||
|
- Интерактивная настройка параметров
|
||||||
|
|
||||||
## 📚 Документация
|
## 📚 Документация
|
||||||
|
|
||||||
### Основные разделы
|
### Основные разделы
|
||||||
@@ -67,6 +196,7 @@ make lab-report
|
|||||||
- **[Универсальная лаборатория](docs/universal-lab.md)** - полное руководство по работе с лабораторией
|
- **[Универсальная лаборатория](docs/universal-lab.md)** - полное руководство по работе с лабораторией
|
||||||
- **[Пресеты](docs/presets.md)** - описание всех 21 готового пресета
|
- **[Пресеты](docs/presets.md)** - описание всех 21 готового пресета
|
||||||
- **[Роли](docs/roles.md)** - структура и создание Ansible ролей
|
- **[Роли](docs/roles.md)** - структура и создание Ansible ролей
|
||||||
|
- **[CI/CD](ci-cd/README.md)** - настройка CI/CD для Ansible ролей
|
||||||
|
|
||||||
### Дополнительные материалы
|
### Дополнительные материалы
|
||||||
|
|
||||||
@@ -239,9 +369,9 @@ images:
|
|||||||
|
|
||||||
# Настройки по умолчанию для systemd контейнеров
|
# Настройки по умолчанию для systemd контейнеров
|
||||||
systemd_defaults:
|
systemd_defaults:
|
||||||
privileged: true
|
privileged: true
|
||||||
command: "/sbin/init"
|
command: "/sbin/init"
|
||||||
volumes:
|
volumes:
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||||
tmpfs:
|
tmpfs:
|
||||||
- "/run"
|
- "/run"
|
||||||
@@ -332,6 +462,11 @@ ansible-template/
|
|||||||
│ ├── examples.md # Примеры использования
|
│ ├── examples.md # Примеры использования
|
||||||
│ ├── troubleshooting.md # Решение проблем
|
│ ├── troubleshooting.md # Решение проблем
|
||||||
│ └── api.md # API Reference
|
│ └── api.md # API Reference
|
||||||
|
├── ci-cd/ # CI/CD конфигурация
|
||||||
|
│ ├── README.md # Документация CI/CD
|
||||||
|
│ ├── .gitlab-ci.yml # GitLab CI/CD
|
||||||
|
│ ├── gitlab/ # GitLab Runner
|
||||||
|
│ └── dockerfiles/ # Dockerfile'ы для разных ОС
|
||||||
├── molecule/ # Molecule конфигурация
|
├── molecule/ # Molecule конфигурация
|
||||||
│ ├── universal/ # Универсальный сценарий
|
│ ├── universal/ # Универсальный сценарий
|
||||||
│ │ ├── molecule.yml # Конфигурация Molecule
|
│ │ ├── molecule.yml # Конфигурация Molecule
|
||||||
@@ -352,11 +487,14 @@ ansible-template/
|
|||||||
│ └── requirements.yml # Ansible коллекции
|
│ └── requirements.yml # Ansible коллекции
|
||||||
├── roles/ # Ansible роли
|
├── roles/ # Ansible роли
|
||||||
│ └── your_role/ # Ваши роли
|
│ └── your_role/ # Ваши роли
|
||||||
├── scripts/ # Скрипты
|
├── scripts/ # Скрипты (запускаются через Docker)
|
||||||
│ ├── report_html.py # Генератор HTML отчетов
|
│ ├── report_html.py # Генератор HTML отчетов
|
||||||
│ ├── snapshot.sh # Создание снапшотов
|
│ ├── snapshot.sh # Создание снапшотов
|
||||||
│ ├── restore.sh # Восстановление снапшотов
|
│ ├── restore.sh # Восстановление снапшотов
|
||||||
│ └── cleanup.sh # Очистка лаборатории
|
│ └── cleanup.sh # Очистка лаборатории
|
||||||
|
├── vault/ # Секреты и пароли
|
||||||
|
│ ├── .vault # Пароль для Ansible Vault
|
||||||
|
│ └── secrets.yml # Зашифрованные секреты
|
||||||
└── .pre-commit-config.yaml # Pre-commit конфигурация
|
└── .pre-commit-config.yaml # Pre-commit конфигурация
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
123
ci-cd/README.md
Normal file
123
ci-cd/README.md
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
# CI/CD для Ansible ролей
|
||||||
|
|
||||||
|
Этот раздел содержит примеры настройки CI/CD для Ansible ролей с использованием GitLab CI/CD.
|
||||||
|
|
||||||
|
## Структура
|
||||||
|
|
||||||
|
```
|
||||||
|
ci-cd/
|
||||||
|
├── README.md # Эта документация
|
||||||
|
├── .gitlab-ci.yml # GitLab CI/CD конфигурация
|
||||||
|
├── gitlab/ # GitLab Runner конфигурация
|
||||||
|
│ ├── config.json # Docker registry конфигурация
|
||||||
|
│ ├── docker-compose.yaml # GitLab Runner в Docker
|
||||||
|
│ └── runner/
|
||||||
|
│ └── config.toml # Runner конфигурация
|
||||||
|
└── dockerfiles/ # Dockerfile'ы для разных ОС
|
||||||
|
├── Dockerfile # Базовый Dockerfile
|
||||||
|
├── Dockerfile-CentOS # Dockerfile для CentOS
|
||||||
|
└── Dockerfile-Ubuntu # Dockerfile для Ubuntu
|
||||||
|
```
|
||||||
|
|
||||||
|
## GitLab CI/CD
|
||||||
|
|
||||||
|
### Основные этапы
|
||||||
|
|
||||||
|
1. **Lint** - проверка синтаксиса Ansible
|
||||||
|
2. **Test** - запуск тестов через Molecule
|
||||||
|
3. **Deploy** - развертывание в продакшн
|
||||||
|
4. **Notify** - уведомления о результатах
|
||||||
|
|
||||||
|
### Настройка
|
||||||
|
|
||||||
|
1. **Переменные окружения:**
|
||||||
|
- `CI_REGISTRY_USER` - пользователь Docker registry
|
||||||
|
- `CI_REGISTRY_PASSWORD` - пароль Docker registry
|
||||||
|
- `SSH_PRIVATE_KEY` - SSH ключ для доступа к серверам
|
||||||
|
- `TELEGRAM_BOT_TOKEN` - токен Telegram бота
|
||||||
|
- `TELEGRAM_CHAT_ID` - ID чата для уведомлений
|
||||||
|
|
||||||
|
2. **Docker Registry:**
|
||||||
|
- Настроен доступ к `hub.cism-ms.ru`
|
||||||
|
- Используется образ `hub.cism-ms.ru/ansible/ansible:latest`
|
||||||
|
|
||||||
|
3. **Vault:**
|
||||||
|
- Автоматическое расшифрование/шифрование секретов
|
||||||
|
- Используется `vault-password.txt` для доступа
|
||||||
|
|
||||||
|
## GitLab Runner
|
||||||
|
|
||||||
|
### Конфигурация
|
||||||
|
|
||||||
|
- **Executor:** Docker
|
||||||
|
- **Image:** `hub.cism-ms.ru/ansible/ansible:latest`
|
||||||
|
- **Privileged:** true
|
||||||
|
- **Volumes:** Docker socket для DinD
|
||||||
|
|
||||||
|
### Настройка Runner
|
||||||
|
|
||||||
|
1. Зарегистрировать Runner:
|
||||||
|
```bash
|
||||||
|
docker-compose -f ci-cd/gitlab/docker-compose.yaml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Настроить переменные в `ci-cd/gitlab/runner/config.toml`
|
||||||
|
|
||||||
|
## Dockerfile'ы
|
||||||
|
|
||||||
|
### Базовый Dockerfile
|
||||||
|
- Основан на Ubuntu
|
||||||
|
- Установлены Ansible, Molecule, Docker
|
||||||
|
- Настроен systemd для тестирования
|
||||||
|
|
||||||
|
### Dockerfile-CentOS
|
||||||
|
- Основан на CentOS
|
||||||
|
- Адаптирован для RHEL-семейства
|
||||||
|
- Установлены необходимые пакеты
|
||||||
|
|
||||||
|
### Dockerfile-Ubuntu
|
||||||
|
- Основан на Ubuntu
|
||||||
|
- Оптимизирован для Debian-семейства
|
||||||
|
- Включены дополнительные инструменты
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
### Локальная разработка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать роль
|
||||||
|
make role create NAME=my-role
|
||||||
|
|
||||||
|
# Тестировать роль
|
||||||
|
make role test NAME=my-role
|
||||||
|
|
||||||
|
# Проверить синтаксис
|
||||||
|
make role lint
|
||||||
|
```
|
||||||
|
|
||||||
|
### CI/CD Pipeline
|
||||||
|
|
||||||
|
1. **Автоматический запуск** при push в ветки
|
||||||
|
2. **Lint проверка** всех ролей
|
||||||
|
3. **Molecule тесты** для каждой роли
|
||||||
|
4. **Deploy** в продакшн (ручной запуск)
|
||||||
|
5. **Уведомления** в Telegram
|
||||||
|
|
||||||
|
### Настройка для своего проекта
|
||||||
|
|
||||||
|
1. Скопировать `.gitlab-ci.yml` в корень проекта
|
||||||
|
2. Настроить переменные в GitLab
|
||||||
|
3. Обновить Docker registry URL
|
||||||
|
4. Настроить SSH ключи для деплоя
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
- Все секреты хранятся в Ansible Vault
|
||||||
|
- SSH ключи используются только для деплоя
|
||||||
|
- Docker registry требует аутентификации
|
||||||
|
- Vault файлы автоматически шифруются после использования
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
|
||||||
|
Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
138
create_role_fixed.sh
Executable file
138
create_role_fixed.sh
Executable file
@@ -0,0 +1,138 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Исправленная команда создания роли
|
||||||
|
ROLE_NAME="$1"
|
||||||
|
ROLE_DESC="$2"
|
||||||
|
ROLE_PACKAGE="$3"
|
||||||
|
ROLE_SERVICE="$4"
|
||||||
|
ROLE_TAGS="$5"
|
||||||
|
|
||||||
|
if [ -z "$ROLE_NAME" ]; then
|
||||||
|
echo "Использование: $0 ROLE_NAME ROLE_DESC ROLE_PACKAGE ROLE_SERVICE ROLE_TAGS"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Создание роли: $ROLE_NAME"
|
||||||
|
mkdir -p ./roles/${ROLE_NAME}/{tasks,handlers,templates,files,vars,defaults,meta,tests,playbooks}
|
||||||
|
|
||||||
|
# Создаем main.yml
|
||||||
|
cat > ./roles/${ROLE_NAME}/tasks/main.yml << 'MAIN_EOF'
|
||||||
|
---
|
||||||
|
# Основные задачи роли ROLE_NAME_PLACEHOLDER
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: Включить задачи для Debian/Ubuntu
|
||||||
|
import_tasks: debian.yml
|
||||||
|
when: ansible_os_family == 'Debian'
|
||||||
|
|
||||||
|
- name: Включить задачи для RHEL/CentOS
|
||||||
|
import_tasks: redhat.yml
|
||||||
|
when: ansible_os_family == 'RedHat'
|
||||||
|
MAIN_EOF
|
||||||
|
|
||||||
|
# Создаем debian.yml
|
||||||
|
cat > ./roles/${ROLE_NAME}/tasks/debian.yml << 'DEBIAN_EOF'
|
||||||
|
---
|
||||||
|
# Задачи для Debian/Ubuntu
|
||||||
|
|
||||||
|
- name: Обновить кэш пакетов
|
||||||
|
apt:
|
||||||
|
update_cache: yes
|
||||||
|
cache_valid_time: 3600
|
||||||
|
|
||||||
|
- name: Установить пакет PACKAGE_PLACEHOLDER
|
||||||
|
apt:
|
||||||
|
name: "{{ ROLE_NAME_PLACEHOLDER_package }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Запустить и включить сервис SERVICE_PLACEHOLDER
|
||||||
|
systemd:
|
||||||
|
name: "{{ ROLE_NAME_PLACEHOLDER_service }}"
|
||||||
|
enabled: "{{ ROLE_NAME_PLACEHOLDER_enabled }}"
|
||||||
|
state: "{{ 'started' if ROLE_NAME_PLACEHOLDER_started else 'stopped' }}"
|
||||||
|
DEBIAN_EOF
|
||||||
|
|
||||||
|
# Создаем redhat.yml
|
||||||
|
cat > ./roles/${ROLE_NAME}/tasks/redhat.yml << 'REDHAT_EOF'
|
||||||
|
---
|
||||||
|
# Задачи для RHEL/CentOS
|
||||||
|
|
||||||
|
- name: Установить пакет PACKAGE_PLACEHOLDER
|
||||||
|
yum:
|
||||||
|
name: "{{ ROLE_NAME_PLACEHOLDER_package }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Запустить и включить сервис SERVICE_PLACEHOLDER
|
||||||
|
systemd:
|
||||||
|
name: "{{ ROLE_NAME_PLACEHOLDER_service }}"
|
||||||
|
enabled: "{{ ROLE_NAME_PLACEHOLDER_enabled }}"
|
||||||
|
state: "{{ 'started' if ROLE_NAME_PLACEHOLDER_started else 'stopped' }}"
|
||||||
|
REDHAT_EOF
|
||||||
|
|
||||||
|
# Создаем defaults/main.yml
|
||||||
|
cat > ./roles/${ROLE_NAME}/defaults/main.yml << 'DEFAULTS_EOF'
|
||||||
|
---
|
||||||
|
# Переменные по умолчанию для роли ROLE_NAME_PLACEHOLDER
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
ROLE_NAME_PLACEHOLDER_package: PACKAGE_PLACEHOLDER
|
||||||
|
ROLE_NAME_PLACEHOLDER_service: SERVICE_PLACEHOLDER
|
||||||
|
ROLE_NAME_PLACEHOLDER_enabled: true
|
||||||
|
ROLE_NAME_PLACEHOLDER_started: true
|
||||||
|
DEFAULTS_EOF
|
||||||
|
|
||||||
|
# Создаем meta/main.yml
|
||||||
|
cat > ./roles/${ROLE_NAME}/meta/main.yml << 'META_EOF'
|
||||||
|
---
|
||||||
|
galaxy_info:
|
||||||
|
author: Сергей Антропов
|
||||||
|
description: ROLE_DESC_PLACEHOLDER
|
||||||
|
company: https://devops.org.ru
|
||||||
|
license: MIT
|
||||||
|
min_ansible_version: 2.9
|
||||||
|
platforms:
|
||||||
|
- name: Ubuntu
|
||||||
|
versions: [18.04, 20.04, 22.04]
|
||||||
|
- name: Debian
|
||||||
|
versions: [10, 11, 12]
|
||||||
|
- name: EL
|
||||||
|
versions: [7, 8, 9]
|
||||||
|
galaxy_tags: [TAGS_PLACEHOLDER]
|
||||||
|
|
||||||
|
dependencies: []
|
||||||
|
META_EOF
|
||||||
|
|
||||||
|
# Создаем handlers/main.yml
|
||||||
|
cat > ./roles/${ROLE_NAME}/handlers/main.yml << 'HANDLERS_EOF'
|
||||||
|
---
|
||||||
|
# Обработчики роли ROLE_NAME_PLACEHOLDER
|
||||||
|
|
||||||
|
- name: Перезапустить SERVICE_PLACEHOLDER
|
||||||
|
systemd:
|
||||||
|
name: "{{ ROLE_NAME_PLACEHOLDER_service }}"
|
||||||
|
state: restarted
|
||||||
|
HANDLERS_EOF
|
||||||
|
|
||||||
|
# Заменяем плейсхолдеры
|
||||||
|
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/main.yml
|
||||||
|
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/debian.yml
|
||||||
|
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml
|
||||||
|
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/defaults/main.yml
|
||||||
|
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/meta/main.yml
|
||||||
|
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/handlers/main.yml
|
||||||
|
|
||||||
|
sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/tasks/debian.yml
|
||||||
|
sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml
|
||||||
|
sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/defaults/main.yml
|
||||||
|
|
||||||
|
sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/tasks/debian.yml
|
||||||
|
sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml
|
||||||
|
sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/handlers/main.yml
|
||||||
|
|
||||||
|
sed -i '' "s/ROLE_DESC_PLACEHOLDER/${ROLE_DESC}/g" ./roles/${ROLE_NAME}/meta/main.yml
|
||||||
|
sed -i '' "s/TAGS_PLACEHOLDER/${ROLE_TAGS}/g" ./roles/${ROLE_NAME}/meta/main.yml
|
||||||
|
|
||||||
|
echo "Роль ${ROLE_NAME} создана успешно!"
|
||||||
|
echo "Структура: ./roles/${ROLE_NAME}/"
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Deploy roles
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
become_user: root
|
|
||||||
become_method: ansible.builtin.sudo
|
|
||||||
gather_facts: true
|
|
||||||
vars_files:
|
|
||||||
- ../../vars/secrets.yml
|
|
||||||
roles:
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Пример таски
|
|
||||||
debug:
|
|
||||||
msg: "Привет! Я запустился на Debian/Ubuntu!"
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
- name: "Определяем ОС"
|
|
||||||
set_fact:
|
|
||||||
os_family: "{{ ansible_facts['os_family'] }}"
|
|
||||||
|
|
||||||
- name: "Подключаем таски для RedHat совместимых"
|
|
||||||
include_tasks: "redhat/main.yaml"
|
|
||||||
when: os_family == "RedHat"
|
|
||||||
|
|
||||||
- name: "Подключаем таски для Debian/Ubuntu совместимых"
|
|
||||||
include_tasks: "debian/main.yaml"
|
|
||||||
when: os_family == "Debian"
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Пример таски
|
|
||||||
debug:
|
|
||||||
msg: "Привет! Я запустился на RedHat/CentOS/Fedora!"
|
|
||||||
@@ -8,12 +8,16 @@ services:
|
|||||||
command: sleep infinity
|
command: sleep infinity
|
||||||
environment:
|
environment:
|
||||||
DOCKER_HOST: unix:///var/run/docker.sock
|
DOCKER_HOST: unix:///var/run/docker.sock
|
||||||
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault-password.txt
|
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault/.vault
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
- ./molecule:/ansible/molecule
|
- ./molecule:/ansible/molecule
|
||||||
- ./files:/ansible/files
|
- ./files:/ansible/files
|
||||||
- ./vault-password.txt:/ansible/vault-password.txt
|
- ./scripts:/ansible/scripts
|
||||||
|
- ./reports:/ansible/reports
|
||||||
|
- ./snapshots:/ansible/snapshots
|
||||||
|
- ./vault:/ansible/vault
|
||||||
|
- ./.ansible-lint:/ansible/.ansible-lint
|
||||||
# каталог с ролями (локальный или внешний)
|
# каталог с ролями (локальный или внешний)
|
||||||
- ${ROLES_DIR:-./roles}:/ansible/roles:ro
|
- ${ROLES_DIR:-./roles}:/ansible/roles:ro
|
||||||
working_dir: /ansible
|
working_dir: /ansible
|
||||||
|
|||||||
54
docs/api.md
54
docs/api.md
@@ -197,6 +197,50 @@ kubectl logs <pod-name>
|
|||||||
kubectl exec -it <pod-name> -- /bin/sh
|
kubectl exec -it <pod-name> -- /bin/sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Ansible-lint команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить весь проект
|
||||||
|
make lint
|
||||||
|
|
||||||
|
# Проверить роли
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Проверить конкретную роль
|
||||||
|
ansible-lint --config-file .ansible-lint roles/my-role/
|
||||||
|
|
||||||
|
# Проверить playbook
|
||||||
|
ansible-lint --config-file .ansible-lint files/playbooks/site.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Настройки ansible-lint (.ansible-lint)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
skip_list:
|
||||||
|
- fqcn # Полные имена модулей
|
||||||
|
- yaml[new-line-at-end-of-file] # Новая строка в конце файла
|
||||||
|
- yaml[truthy] # Булевы значения
|
||||||
|
- yaml[line-length] # Длина строки
|
||||||
|
- var-naming[no-role-prefix] # Префиксы переменных
|
||||||
|
- 'ignore-errors' # Игнорирование ошибок
|
||||||
|
|
||||||
|
exclude_paths:
|
||||||
|
- molecule/universal/ # Исключить файлы Molecule
|
||||||
|
- files/playbooks/ # Исключить playbooks с Docker модулями
|
||||||
|
```
|
||||||
|
|
||||||
|
**Описание пропускаемых правил:**
|
||||||
|
- `fqcn` - позволяет использовать короткие имена модулей (например, `yum` вместо `ansible.builtin.yum`)
|
||||||
|
- `yaml[new-line-at-end-of-file]` - не требует новой строки в конце YAML файлов
|
||||||
|
- `yaml[truthy]` - позволяет использовать `yes/no` вместо `true/false`
|
||||||
|
- `yaml[line-length]` - не ограничивает длину строк в YAML
|
||||||
|
- `var-naming[no-role-prefix]` - не требует префиксов для переменных ролей
|
||||||
|
- `ignore-errors` - позволяет использовать `ignore_errors: yes`
|
||||||
|
|
||||||
|
**Исключенные пути:**
|
||||||
|
- `molecule/universal/` - файлы Molecule с Docker модулями
|
||||||
|
- `files/playbooks/` - playbooks с Docker Compose модулями
|
||||||
|
|
||||||
### Port-forward команды
|
### Port-forward команды
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -432,10 +476,10 @@ python3 scripts/report_html.py <input.json> <output.html>
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Создание снапшотов лаборатории
|
# Создание снапшотов лаборатории (запускается через Docker)
|
||||||
|
|
||||||
# Параметры
|
# Параметры
|
||||||
OUT_DIR="snapshots"
|
OUT_DIR="/ansible/snapshots"
|
||||||
|
|
||||||
# Создать директорию
|
# Создать директорию
|
||||||
mkdir -p "$OUT_DIR"
|
mkdir -p "$OUT_DIR"
|
||||||
@@ -457,10 +501,10 @@ done
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Восстановление из снапшотов
|
# Восстановление из снапшотов (запускается через Docker)
|
||||||
|
|
||||||
# Параметры
|
# Параметры
|
||||||
IN_DIR="snapshots"
|
IN_DIR="/ansible/snapshots"
|
||||||
|
|
||||||
# Проверить директорию
|
# Проверить директорию
|
||||||
[ -d "$IN_DIR" ] || { echo "No snapshots dir"; exit 1; }
|
[ -d "$IN_DIR" ] || { echo "No snapshots dir"; exit 1; }
|
||||||
@@ -480,7 +524,7 @@ done
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Очистка лаборатории
|
# Очистка лаборатории (запускается через Docker)
|
||||||
|
|
||||||
echo "[cleanup] removing lab containers/volumes/networks"
|
echo "[cleanup] removing lab containers/volumes/networks"
|
||||||
|
|
||||||
|
|||||||
694
docs/roles.md
694
docs/roles.md
@@ -1,420 +1,372 @@
|
|||||||
# Ansible Роли
|
# Управление ролями Ansible
|
||||||
|
|
||||||
## Автор
|
Полное руководство по созданию, управлению и использованию ролей в универсальной лаборатории.
|
||||||
Сергей Антропов
|
|
||||||
Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
## Описание
|
|
||||||
|
|
||||||
Этот документ описывает структуру, создание и использование Ansible ролей в универсальной лаборатории.
|
|
||||||
|
|
||||||
## Содержание
|
|
||||||
|
|
||||||
- [Структура роли](#структура-роли)
|
|
||||||
- [Создание роли](#создание-роли)
|
|
||||||
- [Использование роли](#использование-роли)
|
|
||||||
- [Тестирование роли](#тестирование-роли)
|
|
||||||
- [Лучшие практики](#лучшие-практики)
|
|
||||||
- [Примеры ролей](#примеры-ролей)
|
|
||||||
|
|
||||||
## Структура роли
|
|
||||||
|
|
||||||
```
|
|
||||||
roles/
|
|
||||||
└── your_role/
|
|
||||||
├── tasks/ # Основные задачи
|
|
||||||
│ └── main.yml
|
|
||||||
├── handlers/ # Обработчики событий
|
|
||||||
│ └── main.yml
|
|
||||||
├── templates/ # Jinja2 шаблоны
|
|
||||||
│ └── config.j2
|
|
||||||
├── files/ # Статические файлы
|
|
||||||
│ └── config.conf
|
|
||||||
├── vars/ # Переменные роли
|
|
||||||
│ └── main.yml
|
|
||||||
├── defaults/ # Переменные по умолчанию
|
|
||||||
│ └── main.yml
|
|
||||||
├── meta/ # Метаданные роли
|
|
||||||
│ └── main.yml
|
|
||||||
└── tests/ # Тесты роли
|
|
||||||
├── inventory
|
|
||||||
└── test.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
### Описание директорий
|
|
||||||
|
|
||||||
| Директория | Описание | Обязательная |
|
|
||||||
|------------|----------|--------------|
|
|
||||||
| `tasks/` | Основные задачи роли | Да |
|
|
||||||
| `handlers/` | Обработчики событий | Нет |
|
|
||||||
| `templates/` | Jinja2 шаблоны | Нет |
|
|
||||||
| `files/` | Статические файлы | Нет |
|
|
||||||
| `vars/` | Переменные роли | Нет |
|
|
||||||
| `defaults/` | Переменные по умолчанию | Нет |
|
|
||||||
| `meta/` | Метаданные роли | Нет |
|
|
||||||
| `tests/` | Тесты роли | Нет |
|
|
||||||
|
|
||||||
## Создание роли
|
## Создание роли
|
||||||
|
|
||||||
### Автоматическое создание
|
### Интерактивное создание
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Создать роль с помощью ansible-galaxy
|
make role create NAME=my-role
|
||||||
ansible-galaxy init your_role
|
|
||||||
|
|
||||||
# Создать роль в определенной директории
|
|
||||||
ansible-galaxy init your_role --init-path roles/
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Ручное создание
|
**Что происходит:**
|
||||||
|
1. **Запрашивается описание роли** - краткое описание функциональности
|
||||||
|
2. **Настраивается основной пакет** - имя пакета для установки
|
||||||
|
3. **Настраивается сервис** - имя сервиса для управления
|
||||||
|
4. **Выбираются платформы** - поддерживаемые ОС (ubuntu, centos, rhel)
|
||||||
|
5. **Указываются теги** - теги для Ansible Galaxy
|
||||||
|
6. **Создается универсальная структура роли** с поддержкой RHEL и Debian семейств
|
||||||
|
7. **Создается папка `playbooks/`** для playbooks роли
|
||||||
|
|
||||||
```bash
|
### Структура созданной роли
|
||||||
# Создать структуру роли
|
|
||||||
mkdir -p roles/your_role/{tasks,handlers,templates,files,vars,defaults,meta,tests}
|
|
||||||
|
|
||||||
# Создать основной task
|
```
|
||||||
cat > roles/your_role/tasks/main.yml << EOF
|
roles/my-role/
|
||||||
|
├── tasks/
|
||||||
|
│ ├── main.yml # Основные задачи (универсальные)
|
||||||
|
│ ├── debian.yml # Задачи для Debian/Ubuntu
|
||||||
|
│ └── redhat.yml # Задачи для RHEL/CentOS
|
||||||
|
├── handlers/
|
||||||
|
│ └── main.yml # Обработчики
|
||||||
|
├── templates/ # Шаблоны Jinja2
|
||||||
|
├── files/ # Статические файлы
|
||||||
|
├── vars/
|
||||||
|
│ └── main.yml # Переменные роли
|
||||||
|
├── defaults/
|
||||||
|
│ └── main.yml # Переменные по умолчанию
|
||||||
|
├── meta/
|
||||||
|
│ └── main.yml # Метаданные роли
|
||||||
|
├── tests/ # Тесты роли
|
||||||
|
└── playbooks/ # Playbooks роли
|
||||||
|
└── (создаются через make role playbook)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Универсальные роли
|
||||||
|
|
||||||
|
### Принцип работы
|
||||||
|
|
||||||
|
Роли создаются **универсальными** для RHEL и Debian семейств:
|
||||||
|
|
||||||
|
1. **`tasks/main.yml`** - содержит общую логику и включает OS-специфичные задачи
|
||||||
|
2. **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
|
||||||
|
3. **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
|
||||||
|
|
||||||
|
### Автоматическое определение ОС
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# tasks/main.yml
|
||||||
|
- name: Include OS-specific tasks
|
||||||
|
include_tasks: "{{ ansible_os_family | lower }}.yml"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Поддерживаемые ОС:**
|
||||||
|
- **Debian семейство**: Ubuntu, Debian, Linux Mint
|
||||||
|
- **RHEL семейство**: CentOS, RHEL, Rocky Linux, AlmaLinux
|
||||||
|
|
||||||
|
### Примеры задач
|
||||||
|
|
||||||
|
#### Debian/Ubuntu (tasks/debian.yml)
|
||||||
|
```yaml
|
||||||
---
|
---
|
||||||
- name: Install package
|
# Задачи для Debian/Ubuntu семейства
|
||||||
package:
|
|
||||||
name: "{{ package_name }}"
|
- name: Update apt cache (Debian)
|
||||||
|
apt:
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: ansible_os_family == 'Debian'
|
||||||
|
|
||||||
|
- name: Install nginx package (Debian)
|
||||||
|
apt:
|
||||||
|
name: "{{ nginx_package | default('nginx') }}"
|
||||||
state: present
|
state: present
|
||||||
|
when: ansible_os_family == 'Debian'
|
||||||
- name: Start service
|
|
||||||
service:
|
|
||||||
name: "{{ service_name }}"
|
|
||||||
state: started
|
|
||||||
enabled: true
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Создать переменные по умолчанию
|
|
||||||
cat > roles/your_role/defaults/main.yml << EOF
|
|
||||||
---
|
|
||||||
package_name: nginx
|
|
||||||
service_name: nginx
|
|
||||||
EOF
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Использование роли
|
#### RHEL/CentOS (tasks/redhat.yml)
|
||||||
|
|
||||||
### В playbook
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
---
|
---
|
||||||
- name: Deploy web server
|
# Задачи для RHEL/CentOS семейства
|
||||||
hosts: webservers
|
|
||||||
become: true
|
- name: Update yum cache (RHEL)
|
||||||
roles:
|
yum:
|
||||||
- your_role
|
update_cache: true
|
||||||
|
when: ansible_os_family == 'RedHat'
|
||||||
|
|
||||||
|
- name: Install nginx package (RHEL)
|
||||||
|
yum:
|
||||||
|
name: "{{ nginx_package | default('nginx') }}"
|
||||||
|
state: present
|
||||||
|
when: ansible_os_family == 'RedHat'
|
||||||
```
|
```
|
||||||
|
|
||||||
### С переменными
|
## Управление playbooks роли
|
||||||
|
|
||||||
```yaml
|
### Создание playbook
|
||||||
---
|
|
||||||
- name: Deploy web server
|
|
||||||
hosts: webservers
|
|
||||||
become: true
|
|
||||||
roles:
|
|
||||||
- role: your_role
|
|
||||||
vars:
|
|
||||||
package_name: apache2
|
|
||||||
service_name: apache2
|
|
||||||
```
|
|
||||||
|
|
||||||
### С условиями
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
- name: Deploy web server
|
|
||||||
hosts: webservers
|
|
||||||
become: true
|
|
||||||
roles:
|
|
||||||
- role: your_role
|
|
||||||
when: ansible_os_family == "Debian"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Тестирование роли
|
|
||||||
|
|
||||||
### Создание тестов
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Создать тестовый playbook
|
make role playbook NAME=my-role
|
||||||
cat > roles/your_role/tests/test.yml << EOF
|
# Выберите: create
|
||||||
|
# Введите имя: deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
**Создается файл:** `roles/my-role/playbooks/deploy.yml`
|
||||||
|
|
||||||
|
```yaml
|
||||||
---
|
---
|
||||||
- name: Test role
|
# Playbook: deploy для роли my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: deploy
|
||||||
hosts: all
|
hosts: all
|
||||||
become: true
|
become: true
|
||||||
roles:
|
gather_facts: true
|
||||||
- your_role
|
vars:
|
||||||
EOF
|
# Переменные для роли my-role
|
||||||
|
my_role_enabled: true
|
||||||
|
|
||||||
# Создать инвентарь для тестов
|
pre_tasks:
|
||||||
cat > roles/your_role/tests/inventory << EOF
|
- name: Display OS information
|
||||||
[webservers]
|
debug:
|
||||||
localhost ansible_connection=local
|
msg: "OS Family: {{ ansible_os_family }}, OS: {{ ansible_distribution }} {{ ansible_distribution_version }}"
|
||||||
EOF
|
|
||||||
|
roles:
|
||||||
|
- role: my-role
|
||||||
|
|
||||||
|
post_tasks:
|
||||||
|
- name: Verify my-role installation
|
||||||
|
debug:
|
||||||
|
msg: "my-role successfully deployed on {{ inventory_hostname }}"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Запуск тестов
|
### Универсальные playbooks
|
||||||
|
|
||||||
|
Playbooks создаются **универсальными** с поддержкой:
|
||||||
|
|
||||||
|
1. **`gather_facts: true`** - сбор информации об ОС
|
||||||
|
2. **`pre_tasks`** - отображение информации об ОС
|
||||||
|
3. **`post_tasks`** - проверка успешного развертывания
|
||||||
|
4. **Переменные роли** - автоматически добавляются в `vars`
|
||||||
|
|
||||||
|
### Список playbooks
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Запустить тест роли
|
make role playbook NAME=my-role
|
||||||
ansible-playbook -i roles/your_role/tests/inventory roles/your_role/tests/test.yml
|
# Выберите: list
|
||||||
|
```
|
||||||
|
|
||||||
# Запустить тест с Molecule
|
### Редактирование playbook
|
||||||
molecule test
|
|
||||||
|
```bash
|
||||||
|
make role playbook NAME=my-role
|
||||||
|
# Выберите: edit
|
||||||
|
# Введите имя: deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
### Запуск playbook
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make role playbook NAME=my-role
|
||||||
|
# Выберите: run
|
||||||
|
# Введите имя: deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
## Команды управления ролями
|
||||||
|
|
||||||
|
### Основные команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Список ролей
|
||||||
|
make role list
|
||||||
|
|
||||||
|
# Создать роль (интерактивно)
|
||||||
|
make role create NAME=my-role
|
||||||
|
|
||||||
|
# Редактировать роль
|
||||||
|
make role edit NAME=my-role
|
||||||
|
|
||||||
|
# Тестировать роль
|
||||||
|
make role test NAME=my-role
|
||||||
|
|
||||||
|
# Проверить синтаксис
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Развернуть роли
|
||||||
|
make role deploy
|
||||||
|
|
||||||
|
# Информация о роли
|
||||||
|
make role info NAME=my-role
|
||||||
|
|
||||||
|
# Управление playbooks
|
||||||
|
make role playbook NAME=my-role
|
||||||
|
```
|
||||||
|
|
||||||
|
### Интерактивные возможности
|
||||||
|
|
||||||
|
#### При создании роли:
|
||||||
|
- **Описание роли** - автоматически добавляется в README.md
|
||||||
|
- **Основной пакет** - настраивается в defaults/main.yml
|
||||||
|
- **Сервис** - настраивается в defaults/main.yml
|
||||||
|
- **Платформы** - добавляются в meta/main.yml
|
||||||
|
- **Теги** - добавляются в meta/main.yml
|
||||||
|
|
||||||
|
#### При работе с playbooks:
|
||||||
|
- **Создание** - интерактивный ввод имени
|
||||||
|
- **Редактирование** - выбор из списка существующих
|
||||||
|
- **Запуск** - выбор playbook для выполнения
|
||||||
|
|
||||||
|
## Примеры использования
|
||||||
|
|
||||||
|
### Создание роли nginx
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make role create NAME=nginx
|
||||||
|
# Описание: Nginx web server role
|
||||||
|
# Пакет: nginx
|
||||||
|
# Сервис: nginx
|
||||||
|
# Платформы: ubuntu,centos
|
||||||
|
# Теги: web,nginx,server
|
||||||
|
```
|
||||||
|
|
||||||
|
### Создание playbook для nginx
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make role playbook NAME=nginx
|
||||||
|
# Выберите: create
|
||||||
|
# Имя: install
|
||||||
|
```
|
||||||
|
|
||||||
|
**Результат:** `roles/nginx/playbooks/install.yml`
|
||||||
|
|
||||||
|
### Запуск playbook
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make role playbook NAME=nginx
|
||||||
|
# Выберите: run
|
||||||
|
# Имя: install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Структура файлов роли
|
||||||
|
|
||||||
|
### tasks/main.yml
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Основные задачи роли nginx
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: nginx placeholder
|
||||||
|
debug:
|
||||||
|
msg: "Роль nginx готова для настройки"
|
||||||
|
|
||||||
|
- name: Install nginx package
|
||||||
|
package:
|
||||||
|
name: "{{ nginx_package | default('nginx') }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Start nginx service
|
||||||
|
systemd:
|
||||||
|
name: "{{ nginx_service | default('nginx') }}"
|
||||||
|
state: started
|
||||||
|
enabled: true
|
||||||
|
when: nginx_service is defined
|
||||||
|
```
|
||||||
|
|
||||||
|
### defaults/main.yml
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Переменные по умолчанию для роли nginx
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
nginx_enabled: true
|
||||||
|
nginx_package: nginx
|
||||||
|
nginx_service: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### meta/main.yml
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
galaxy_info:
|
||||||
|
author: Сергей Антропов
|
||||||
|
description: Nginx web server role
|
||||||
|
company: https://devops.org.ru
|
||||||
|
license: MIT
|
||||||
|
min_ansible_version: 2.9
|
||||||
|
platforms:
|
||||||
|
- name: Ubuntu
|
||||||
|
versions: [focal, jammy]
|
||||||
|
- name: CentOS
|
||||||
|
versions: [7, 8, 9]
|
||||||
|
- name: RHEL
|
||||||
|
versions: [7, 8, 9]
|
||||||
|
galaxy_tags: [web,nginx,server]
|
||||||
|
dependencies: []
|
||||||
```
|
```
|
||||||
|
|
||||||
## Лучшие практики
|
## Лучшие практики
|
||||||
|
|
||||||
### Структура задач
|
### 1. Универсальные роли
|
||||||
|
- **Всегда создавайте OS-специфичные задачи** в `debian.yml` и `redhat.yml`
|
||||||
|
- **Используйте `ansible_os_family`** для определения ОС
|
||||||
|
- **Тестируйте на разных платформах** (Ubuntu, CentOS, RHEL)
|
||||||
|
- **Используйте универсальные модули** когда возможно (package, systemd)
|
||||||
|
|
||||||
```yaml
|
### 2. Структура роли
|
||||||
---
|
- **`tasks/main.yml`** - общая логика и включение OS-специфичных задач
|
||||||
# tasks/main.yml
|
- **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
|
||||||
- name: Install package
|
- **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
|
||||||
package:
|
- **`handlers`** - для перезапуска сервисов
|
||||||
name: "{{ package_name }}"
|
- **`templates`** - для конфигурационных файлов
|
||||||
state: present
|
- **`files`** - для статических файлов
|
||||||
notify: restart service
|
|
||||||
|
|
||||||
- name: Configure service
|
### 3. Переменные
|
||||||
template:
|
- **`defaults/main.yml`** - значения по умолчанию
|
||||||
src: config.j2
|
- **`vars/main.yml`** - внутренние переменные роли
|
||||||
dest: /etc/service/config.conf
|
- **Используйте префиксы** для переменных роли
|
||||||
notify: restart service
|
- **Создавайте OS-специфичные переменные** при необходимости
|
||||||
|
|
||||||
- name: Start service
|
### 4. Playbooks
|
||||||
service:
|
- **`gather_facts: true`** - всегда собирайте информацию об ОС
|
||||||
name: "{{ service_name }}"
|
- **`pre_tasks`** - отображайте информацию об ОС
|
||||||
state: started
|
- **`post_tasks`** - проверяйте успешное развертывание
|
||||||
enabled: true
|
- **Используйте переменные** для настройки
|
||||||
```
|
|
||||||
|
|
||||||
### Обработчики
|
### 5. Тестирование
|
||||||
|
- **`make role test`** - проверка роли
|
||||||
```yaml
|
- **Тестируйте на разных ОС** - Ubuntu, CentOS, RHEL
|
||||||
---
|
- **Создавайте тесты** в папке tests/
|
||||||
# handlers/main.yml
|
- **Проверяйте идемпотентность** - повторный запуск не должен изменять систему
|
||||||
- name: restart service
|
|
||||||
service:
|
|
||||||
name: "{{ service_name }}"
|
|
||||||
state: restarted
|
|
||||||
```
|
|
||||||
|
|
||||||
### Переменные
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
# defaults/main.yml
|
|
||||||
package_name: nginx
|
|
||||||
service_name: nginx
|
|
||||||
config_file: /etc/nginx/nginx.conf
|
|
||||||
port: 80
|
|
||||||
|
|
||||||
# vars/main.yml
|
|
||||||
service_user: nginx
|
|
||||||
service_group: nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
### Метаданные
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
# meta/main.yml
|
|
||||||
galaxy_info:
|
|
||||||
author: Your Name
|
|
||||||
description: Your role description
|
|
||||||
company: Your Company
|
|
||||||
license: MIT
|
|
||||||
min_ansible_version: "2.9"
|
|
||||||
platforms:
|
|
||||||
- name: Ubuntu
|
|
||||||
versions:
|
|
||||||
- focal
|
|
||||||
- jammy
|
|
||||||
- name: CentOS
|
|
||||||
versions:
|
|
||||||
- 8
|
|
||||||
- 9
|
|
||||||
galaxy_tags:
|
|
||||||
- web
|
|
||||||
- nginx
|
|
||||||
dependencies: []
|
|
||||||
```
|
|
||||||
|
|
||||||
## Примеры ролей
|
|
||||||
|
|
||||||
### Роль для веб-сервера
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
# tasks/main.yml
|
|
||||||
- name: Install nginx
|
|
||||||
package:
|
|
||||||
name: nginx
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Configure nginx
|
|
||||||
template:
|
|
||||||
src: nginx.conf.j2
|
|
||||||
dest: /etc/nginx/nginx.conf
|
|
||||||
notify: restart nginx
|
|
||||||
|
|
||||||
- name: Start nginx
|
|
||||||
service:
|
|
||||||
name: nginx
|
|
||||||
state: started
|
|
||||||
enabled: true
|
|
||||||
```
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
# defaults/main.yml
|
|
||||||
nginx_port: 80
|
|
||||||
nginx_ssl_port: 443
|
|
||||||
nginx_user: www-data
|
|
||||||
nginx_worker_processes: auto
|
|
||||||
```
|
|
||||||
|
|
||||||
### Роль для базы данных
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
# tasks/main.yml
|
|
||||||
- name: Install PostgreSQL
|
|
||||||
package:
|
|
||||||
name: postgresql
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Start PostgreSQL
|
|
||||||
service:
|
|
||||||
name: postgresql
|
|
||||||
state: started
|
|
||||||
enabled: true
|
|
||||||
|
|
||||||
- name: Create database
|
|
||||||
postgresql_db:
|
|
||||||
name: "{{ db_name }}"
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Create user
|
|
||||||
postgresql_user:
|
|
||||||
name: "{{ db_user }}"
|
|
||||||
password: "{{ db_password }}"
|
|
||||||
state: present
|
|
||||||
```
|
|
||||||
|
|
||||||
### Роль для мониторинга
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
# tasks/main.yml
|
|
||||||
- name: Install Prometheus
|
|
||||||
package:
|
|
||||||
name: prometheus
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Configure Prometheus
|
|
||||||
template:
|
|
||||||
src: prometheus.yml.j2
|
|
||||||
dest: /etc/prometheus/prometheus.yml
|
|
||||||
notify: restart prometheus
|
|
||||||
|
|
||||||
- name: Start Prometheus
|
|
||||||
service:
|
|
||||||
name: prometheus
|
|
||||||
state: started
|
|
||||||
enabled: true
|
|
||||||
```
|
|
||||||
|
|
||||||
## Интеграция с лабораторией
|
## Интеграция с лабораторией
|
||||||
|
|
||||||
### Использование в пресетах
|
### Автоматическое добавление в систему
|
||||||
|
|
||||||
|
При создании роли через `make role create`:
|
||||||
|
1. Роль автоматически добавляется в `deploy/tasks/main.yml`
|
||||||
|
2. Создается переменная `{role_name}_enabled: true`
|
||||||
|
3. Обновляется `site.yml` с новой ролью
|
||||||
|
|
||||||
|
### Использование в playbooks
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
---
|
---
|
||||||
# molecule/presets/webapp.yml
|
- name: Deploy my-role
|
||||||
hosts:
|
hosts: all
|
||||||
- name: web1
|
|
||||||
group: webservers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8080:80"
|
|
||||||
|
|
||||||
- name: db1
|
|
||||||
group: databases
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5432:5432"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Playbook для ролей
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
# files/playbooks/site.yml
|
|
||||||
- name: Deploy web servers
|
|
||||||
hosts: webservers
|
|
||||||
become: true
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- nginx
|
- role: my-role
|
||||||
- ssl
|
vars:
|
||||||
|
my_role_enabled: true
|
||||||
- name: Deploy databases
|
my_role_package: custom-package
|
||||||
hosts: databases
|
|
||||||
become: true
|
|
||||||
roles:
|
|
||||||
- postgresql
|
|
||||||
- backup
|
|
||||||
|
|
||||||
- name: Deploy monitoring
|
|
||||||
hosts: monitoring
|
|
||||||
become: true
|
|
||||||
roles:
|
|
||||||
- prometheus
|
|
||||||
- grafana
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Тестирование с различными пресетами
|
## Автор
|
||||||
|
|
||||||
```bash
|
Сергей Антропов
|
||||||
# Тестирование с минимальным пресетом
|
Сайт: https://devops.org.ru
|
||||||
make lab-test LAB_SPEC=molecule/presets/minimal.yml
|
|
||||||
|
|
||||||
# Тестирование с веб-приложением
|
|
||||||
make lab-test LAB_SPEC=molecule/presets/webapp.yml
|
|
||||||
|
|
||||||
# Тестирование с микросервисами
|
|
||||||
make lab-test LAB_SPEC=molecule/presets/microservices.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
## Публикация роли
|
|
||||||
|
|
||||||
### В Ansible Galaxy
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Установить ansible-galaxy
|
|
||||||
pip install ansible-galaxy
|
|
||||||
|
|
||||||
# Публиковать роль
|
|
||||||
ansible-galaxy import your-username your-role
|
|
||||||
|
|
||||||
# Или через GitHub
|
|
||||||
ansible-galaxy import your-username your-role --github-user your-username
|
|
||||||
```
|
|
||||||
|
|
||||||
### В приватном репозитории
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Установить роль из Git
|
|
||||||
ansible-galaxy install git+https://github.com/your-username/your-role.git
|
|
||||||
|
|
||||||
# Установить роль из файла
|
|
||||||
ansible-galaxy install your-role.tar.gz
|
|
||||||
```
|
|
||||||
|
|
||||||
## Заключение
|
|
||||||
|
|
||||||
Этот документ описывает основные принципы создания и использования Ansible ролей в универсальной лаборатории. Для получения дополнительной информации обратитесь к [основной документации](universal-lab.md) и [примерам использования](examples.md).
|
|
||||||
73
env.example
73
env.example
@@ -1,16 +1,69 @@
|
|||||||
# Переменные окружения для универсальной лаборатории
|
# =============================================================================
|
||||||
|
# Ansible Template Environment Configuration
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
# Путь к каталогу с Ansible ролями (вне этого репозитория)
|
# Основные настройки проекта
|
||||||
ROLES_DIR=/path/to/your/ansible/roles
|
PROJECT_NAME=ansible-template
|
||||||
|
VERSION=0.1.0
|
||||||
|
AUTHOR="Сергей Антропов"
|
||||||
|
SITE="https://devops.org.ru"
|
||||||
|
|
||||||
# Telegram уведомления (опционально)
|
# Docker настройки
|
||||||
TG_TOKEN=your_telegram_bot_token
|
DOCKER_IMAGE=quay.io/ansible/creator-ee:latest
|
||||||
TG_CHAT=your_telegram_chat_id
|
DOCKER_NETWORK=labnet
|
||||||
|
DOCKER_COMPOSE=docker compose
|
||||||
|
|
||||||
# Пауза для ручной проверки (минуты)
|
# Molecule настройки
|
||||||
LAB_PAUSE_MINUTES=10
|
|
||||||
|
|
||||||
# Сценарий Molecule
|
|
||||||
SCENARIO=universal
|
SCENARIO=universal
|
||||||
|
LAB_SPEC=molecule/presets/minimal.yml
|
||||||
|
MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule
|
||||||
|
|
||||||
|
# Kubernetes настройки
|
||||||
|
KUBE_CONTEXT=kind-lab
|
||||||
|
ISTIO_VERSION=1.22.1
|
||||||
|
KIND_VERSION=v0.23.0
|
||||||
|
|
||||||
|
# Пути
|
||||||
|
ROLES_DIR=./roles
|
||||||
|
VAULT_PASSWORD_FILE=vault/.vault
|
||||||
|
|
||||||
|
# Переменные для лаборатории
|
||||||
|
LAB_PAUSE_MINUTES=10
|
||||||
|
LAB_SPEC=molecule/presets/minimal.yml
|
||||||
|
|
||||||
|
# Переменные для пресетов
|
||||||
|
PRESET_NAME=minimal
|
||||||
|
PRESET_TYPE=classic
|
||||||
|
|
||||||
|
# Переменные для ролей
|
||||||
|
ROLE_NAME=my-role
|
||||||
|
ROLE_DESCRIPTION="My Ansible role"
|
||||||
|
|
||||||
|
# Переменные для Git
|
||||||
|
GIT_BRANCH=main
|
||||||
|
GIT_REMOTE=origin
|
||||||
|
|
||||||
|
# Переменные для Docker
|
||||||
|
DOCKER_REGISTRY=quay.io
|
||||||
|
DOCKER_TAG=latest
|
||||||
|
|
||||||
|
# Переменные для мониторинга
|
||||||
|
GRAFANA_ADMIN_PASSWORD=admin
|
||||||
|
PROMETHEUS_RETENTION=15d
|
||||||
|
|
||||||
|
# Переменные для Istio
|
||||||
|
ISTIO_PROFILE=demo
|
||||||
|
KIALI_AUTH_STRATEGY=anonymous
|
||||||
|
|
||||||
|
# Переменные для Kind
|
||||||
|
KIND_WORKERS=2
|
||||||
|
KIND_API_PORT=6443
|
||||||
|
|
||||||
|
# Переменные для портов
|
||||||
|
HTTP_PORT=8080
|
||||||
|
HTTPS_PORT=8443
|
||||||
|
GRAFANA_PORT=3000
|
||||||
|
PROMETHEUS_PORT=9090
|
||||||
|
KIALI_PORT=20001
|
||||||
93
files/playbooks/chaos.yml
Normal file
93
files/playbooks/chaos.yml
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
---
|
||||||
|
# Chaos Engineering для тестирования отказоустойчивости
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: Chaos Network (add latency)
|
||||||
|
hosts: localhost
|
||||||
|
gather_facts: false
|
||||||
|
vars:
|
||||||
|
chaos_duration: "{{ chaos_duration | default(60) }}"
|
||||||
|
chaos_latency: "{{ chaos_latency | default('100ms') }}"
|
||||||
|
chaos_loss: "{{ chaos_loss | default('5%') }}"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Install chaos tools
|
||||||
|
package:
|
||||||
|
name: [iproute2, iptables, tc]
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Add network latency
|
||||||
|
command: >
|
||||||
|
tc qdisc add dev eth0 root netem delay {{ chaos_latency }}
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: Add packet loss
|
||||||
|
command: >
|
||||||
|
tc qdisc add dev eth0 root netem loss {{ chaos_loss }}
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: Wait for chaos duration
|
||||||
|
pause:
|
||||||
|
seconds: "{{ chaos_duration }}"
|
||||||
|
|
||||||
|
- name: Remove network chaos
|
||||||
|
command: >
|
||||||
|
tc qdisc del dev eth0 root
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: Chaos Services (random failures)
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
vars:
|
||||||
|
chaos_services:
|
||||||
|
- postgresql
|
||||||
|
- redis
|
||||||
|
- nginx
|
||||||
|
- docker
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Random service stop
|
||||||
|
systemd:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: stopped
|
||||||
|
loop: "{{ chaos_services }}"
|
||||||
|
when: (ansible_play_hosts.index(inventory_hostname) + ansible_date_time.epoch) % 3 == 0
|
||||||
|
|
||||||
|
- name: Wait for chaos
|
||||||
|
pause:
|
||||||
|
seconds: 30
|
||||||
|
|
||||||
|
- name: Restart services
|
||||||
|
systemd:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: started
|
||||||
|
loop: "{{ chaos_services }}"
|
||||||
|
when: (ansible_play_hosts.index(inventory_hostname) + ansible_date_time.epoch) % 3 == 0
|
||||||
|
|
||||||
|
- name: Chaos Docker (container failures)
|
||||||
|
hosts: "{{ groups['dind'] | default([]) }}"
|
||||||
|
gather_facts: false
|
||||||
|
vars:
|
||||||
|
docker_host: "tcp://{{ inventory_hostname }}:2375"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Random container stop
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: stopped
|
||||||
|
docker_host: "{{ docker_host }}"
|
||||||
|
loop: "{{ ansible_play_hosts }}"
|
||||||
|
when: (ansible_play_hosts.index(inventory_hostname) + ansible_date_time.epoch) % 4 == 0
|
||||||
|
|
||||||
|
- name: Wait for chaos
|
||||||
|
pause:
|
||||||
|
seconds: 20
|
||||||
|
|
||||||
|
- name: Restart containers
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: started
|
||||||
|
docker_host: "{{ docker_host }}"
|
||||||
|
loop: "{{ ansible_play_hosts }}"
|
||||||
|
when: (ansible_play_hosts.index(inventory_hostname) + ansible_date_time.epoch) % 4 == 0
|
||||||
@@ -35,66 +35,11 @@
|
|||||||
- unzip
|
- unzip
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
# Под каждую группу — свои роли. Подставь свои имена.
|
# Развертывание инфраструктуры
|
||||||
- name: ETCD
|
- name: Deploy infrastructure
|
||||||
hosts: etcd
|
hosts: all
|
||||||
become: true
|
become: true
|
||||||
roles:
|
|
||||||
# - role: your_role_etcd
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: ETCD placeholder
|
- name: Infrastructure placeholder
|
||||||
debug:
|
debug:
|
||||||
msg: "ETCD группа готова для настройки"
|
msg: "Инфраструктура готова для настройки"
|
||||||
|
|
||||||
- name: Patroni
|
|
||||||
hosts: patroni
|
|
||||||
become: true
|
|
||||||
roles:
|
|
||||||
# - role: your_role_patroni
|
|
||||||
tasks:
|
|
||||||
- name: Patroni placeholder
|
|
||||||
debug:
|
|
||||||
msg: "Patroni группа готова для настройки"
|
|
||||||
|
|
||||||
- name: HAProxy
|
|
||||||
hosts: haproxy
|
|
||||||
become: true
|
|
||||||
roles:
|
|
||||||
# - role: your_role_haproxy
|
|
||||||
tasks:
|
|
||||||
- name: HAProxy placeholder
|
|
||||||
debug:
|
|
||||||
msg: "HAProxy группа готова для настройки"
|
|
||||||
|
|
||||||
# Пример: развернуть docker-compose прямо внутри DinD хоста(ов)
|
|
||||||
- name: DinD stack deploy
|
|
||||||
hosts: apps
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
docker_host: "tcp://{{ inventory_hostname }}:2375"
|
|
||||||
stack_dir: /root/stack
|
|
||||||
tasks:
|
|
||||||
- name: Create stack directory
|
|
||||||
file:
|
|
||||||
path: "{{ stack_dir }}"
|
|
||||||
state: directory
|
|
||||||
|
|
||||||
- name: Copy demo docker-compose.yml
|
|
||||||
copy:
|
|
||||||
dest: "{{ stack_dir }}/docker-compose.yml"
|
|
||||||
content: |
|
|
||||||
version: "3.9"
|
|
||||||
services:
|
|
||||||
web:
|
|
||||||
image: nginx:alpine
|
|
||||||
ports: ["8080:80"]
|
|
||||||
cache:
|
|
||||||
image: redis:7-alpine
|
|
||||||
|
|
||||||
- name: Deploy stack on DinD
|
|
||||||
community.docker.docker_compose_v2:
|
|
||||||
project_src: "{{ stack_dir }}"
|
|
||||||
state: present
|
|
||||||
docker_host: "{{ docker_host }}"
|
|
||||||
when: item.type is defined and item.type == 'dind'
|
|
||||||
loop: "{{ groups['apps'] | map('extract', hostvars) | list }}"
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
[all]
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Converge
|
|
||||||
hosts: all
|
|
||||||
vars_files:
|
|
||||||
- ../../vars/secrets.yml
|
|
||||||
roles:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
- name: Destroy containers on interrupt
|
|
||||||
hosts: localhost
|
|
||||||
tasks:
|
|
||||||
- name: Ensure containers are destroyed
|
|
||||||
docker_container:
|
|
||||||
name: "{{ item.name }}"
|
|
||||||
state: absent
|
|
||||||
loop: "{{ molecule_yml.platforms }}"
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
---
|
|
||||||
dependency:
|
|
||||||
name: galaxy
|
|
||||||
enabled: false
|
|
||||||
options:
|
|
||||||
requirements-file: requirements.yml
|
|
||||||
|
|
||||||
driver:
|
|
||||||
name: docker
|
|
||||||
|
|
||||||
platforms:
|
|
||||||
- name: centos
|
|
||||||
image: "inecs/ansible:centos"
|
|
||||||
privileged: true
|
|
||||||
pre_build_image: true
|
|
||||||
volumes:
|
|
||||||
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
tmpfs:
|
|
||||||
- /tmp
|
|
||||||
- /run
|
|
||||||
- name: ubuntu
|
|
||||||
image: "inecs/ansible:ubuntu"
|
|
||||||
privileged: true
|
|
||||||
pre_build_image: true
|
|
||||||
volumes:
|
|
||||||
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
tmpfs:
|
|
||||||
- /tmp
|
|
||||||
- /run
|
|
||||||
|
|
||||||
provisioner:
|
|
||||||
name: ansible
|
|
||||||
connection_options:
|
|
||||||
ansible_connection: docker
|
|
||||||
ansible_user: root
|
|
||||||
env:
|
|
||||||
ANSIBLE_PYTHON_INTERPRETER: /usr/bin/python3
|
|
||||||
lint:
|
|
||||||
name: ansible-lint
|
|
||||||
|
|
||||||
verifier:
|
|
||||||
name: ansible
|
|
||||||
|
|
||||||
scenario:
|
|
||||||
name: default
|
|
||||||
test_sequence:
|
|
||||||
- dependency
|
|
||||||
- cleanup
|
|
||||||
- destroy
|
|
||||||
- syntax
|
|
||||||
- create
|
|
||||||
- prepare
|
|
||||||
- converge
|
|
||||||
- idempotence
|
|
||||||
- side_effect
|
|
||||||
- verify
|
|
||||||
- cleanup
|
|
||||||
- destroy
|
|
||||||
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
- name: Prepare
|
|
||||||
hosts: all
|
|
||||||
tasks:
|
|
||||||
- name: Detect OS family
|
|
||||||
ansible.builtin.setup:
|
|
||||||
gather_subset:
|
|
||||||
- "min"
|
|
||||||
|
|
||||||
- name: Обновляем пакеты для работы с Ansible в RockyLinux (Centos/RedHat)
|
|
||||||
when: ansible_facts['os_family'] == "RedHat"
|
|
||||||
block:
|
|
||||||
- name: Устанавливаем репозиторий AppStream (если его нет)
|
|
||||||
ansible.builtin.raw: dnf config-manager --set-enabled appstream
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Установить rsync
|
|
||||||
ansible.builtin.raw: dnf install -y rsync
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Устанавливаем Python 3.8
|
|
||||||
ansible.builtin.raw: dnf install -y python38 python38-pip
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Обновляем символическую ссылку python3
|
|
||||||
ansible.builtin.raw: alternatives --set python /usr/bin/python3.8
|
|
||||||
changed_when: false
|
|
||||||
# - name: Fix repository URLs
|
|
||||||
# ansible.builtin.command:
|
|
||||||
# cmd: sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
|
|
||||||
# changed_when: false
|
|
||||||
|
|
||||||
# - name: Update baseurl
|
|
||||||
# ansible.builtin.command:
|
|
||||||
# cmd: sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
|
|
||||||
# changed_when: false
|
|
||||||
|
|
||||||
# - name: Install required packages
|
|
||||||
# ansible.builtin.yum:
|
|
||||||
# name:
|
|
||||||
# - epel-release
|
|
||||||
# - python3
|
|
||||||
# - python3-pip
|
|
||||||
# state: present
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Prepare
|
|
||||||
hosts: all
|
|
||||||
tasks:
|
|
||||||
- name: Reun verify
|
|
||||||
debug:
|
|
||||||
msg: "Hello, Verify!"
|
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
---
|
|
||||||
# Проверка работы systemd, docker и docker-compose в образах
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
- name: Verify systemd, docker and docker-compose services
|
|
||||||
hosts: all
|
|
||||||
gather_facts: true
|
|
||||||
tasks:
|
|
||||||
- name: Display OS information
|
|
||||||
debug:
|
|
||||||
msg: "Тестирование на {{ ansible_distribution }} {{ ansible_distribution_version }}"
|
|
||||||
|
|
||||||
- name: Check if systemd is available and running
|
|
||||||
systemd:
|
|
||||||
name: systemd
|
|
||||||
state: started
|
|
||||||
register: systemd_status
|
|
||||||
failed_when: false
|
|
||||||
|
|
||||||
- name: Display systemd status
|
|
||||||
debug:
|
|
||||||
msg: "Systemd статус: {{ 'Доступен и запущен' if systemd_status is succeeded else 'Недоступен или не запущен' }}"
|
|
||||||
|
|
||||||
- name: Check systemd version
|
|
||||||
command: systemd --version
|
|
||||||
register: systemd_version
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display systemd version
|
|
||||||
debug:
|
|
||||||
msg: "Версия systemd: {{ systemd_version.stdout_lines[0] if systemd_version.stdout_lines else 'Не определена' }}"
|
|
||||||
|
|
||||||
- name: Check if docker service exists
|
|
||||||
stat:
|
|
||||||
path: /usr/bin/docker
|
|
||||||
register: docker_binary
|
|
||||||
|
|
||||||
- name: Check if docker service exists (alternative path)
|
|
||||||
stat:
|
|
||||||
path: /usr/local/bin/docker
|
|
||||||
register: docker_binary_alt
|
|
||||||
|
|
||||||
- name: Display docker binary status
|
|
||||||
debug:
|
|
||||||
msg: "Docker binary: {{ 'Найден в /usr/bin/docker' if docker_binary.stat.exists else ('Найден в /usr/local/bin/docker' if docker_binary_alt.stat.exists else 'Не найден') }}"
|
|
||||||
|
|
||||||
- name: Check docker version
|
|
||||||
command: docker --version
|
|
||||||
register: docker_version
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display docker version
|
|
||||||
debug:
|
|
||||||
msg: "Версия Docker: {{ docker_version.stdout if docker_version.stdout else 'Docker не установлен' }}"
|
|
||||||
|
|
||||||
- name: Check if docker daemon is running
|
|
||||||
command: docker info
|
|
||||||
register: docker_info
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display docker daemon status
|
|
||||||
debug:
|
|
||||||
msg: "Docker daemon: {{ 'Запущен' if docker_info is succeeded else 'Не запущен или недоступен' }}"
|
|
||||||
|
|
||||||
- name: Check if docker-compose binary exists
|
|
||||||
stat:
|
|
||||||
path: /usr/local/bin/docker-compose
|
|
||||||
register: docker_compose_binary
|
|
||||||
|
|
||||||
- name: Check if docker-compose binary exists (alternative path)
|
|
||||||
stat:
|
|
||||||
path: /usr/bin/docker-compose
|
|
||||||
register: docker_compose_binary_alt
|
|
||||||
|
|
||||||
- name: Check if docker compose plugin exists
|
|
||||||
command: docker compose version
|
|
||||||
register: docker_compose_plugin
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display docker-compose status
|
|
||||||
debug:
|
|
||||||
msg: "Docker Compose: {{ 'Найден как binary' if docker_compose_binary.stat.exists or docker_compose_binary_alt.stat.exists else ('Найден как plugin' if docker_compose_plugin is succeeded else 'Не найден') }}"
|
|
||||||
|
|
||||||
- name: Display docker-compose version
|
|
||||||
debug:
|
|
||||||
msg: "Версия Docker Compose: {{ docker_compose_plugin.stdout if docker_compose_plugin is succeeded else 'Docker Compose не установлен' }}"
|
|
||||||
|
|
||||||
- name: Test docker functionality
|
|
||||||
command: docker run --rm hello-world
|
|
||||||
register: docker_test
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display docker test result
|
|
||||||
debug:
|
|
||||||
msg: "Тест Docker: {{ 'Успешно' if docker_test is succeeded else 'Ошибка - ' + docker_test.stderr }}"
|
|
||||||
|
|
||||||
- name: Check systemd services status
|
|
||||||
command: systemctl list-units --type=service --state=running
|
|
||||||
register: running_services
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display running services count
|
|
||||||
debug:
|
|
||||||
msg: "Количество запущенных сервисов: {{ running_services.stdout_lines | length }}"
|
|
||||||
|
|
||||||
- name: Check for docker-related systemd services
|
|
||||||
command: systemctl list-units --type=service | grep -i docker
|
|
||||||
register: docker_services
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display docker services
|
|
||||||
debug:
|
|
||||||
msg: "Docker сервисы: {{ docker_services.stdout_lines if docker_services.stdout_lines else 'Не найдены' }}"
|
|
||||||
|
|
||||||
- name: Final summary
|
|
||||||
debug:
|
|
||||||
msg: |
|
|
||||||
========================================
|
|
||||||
РЕЗУЛЬТАТЫ ПРОВЕРКИ ОБРАЗА {{ ansible_distribution }}:
|
|
||||||
========================================
|
|
||||||
Systemd: {{ '✓ Работает' if systemd_status is succeeded else '✗ Не работает' }}
|
|
||||||
Docker: {{ '✓ Установлен и работает' if docker_info is succeeded else '✗ Не установлен или не работает' }}
|
|
||||||
Docker Compose: {{ '✓ Доступен' if (docker_compose_binary.stat.exists or docker_compose_binary_alt.stat.exists or docker_compose_plugin is succeeded) else '✗ Недоступен' }}
|
|
||||||
========================================
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Big Data кластер (12-18 машин)
|
|
||||||
#
|
|
||||||
# Описание: Кластер для обработки больших данных с различными компонентами
|
|
||||||
# - 3 Hadoop NameNode (активный/резервный/журнал) - метаданные
|
|
||||||
# - 3 Hadoop DataNode - хранение данных
|
|
||||||
# - 1 Hive Metastore - метаданные таблиц
|
|
||||||
# - 1 Spark Master - управление Spark
|
|
||||||
# - 2 Spark Worker - обработка данных
|
|
||||||
# - 1 Kafka Broker - потоковая обработка
|
|
||||||
# - 1 Zookeeper - координация сервисов
|
|
||||||
# - 1 Elasticsearch - поиск и аналитика
|
|
||||||
# - 1 Kibana - визуализация данных
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/bigdata.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: namenode1
|
|
||||||
group: namenodes
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9870:9870"
|
|
||||||
|
|
||||||
- name: namenode2
|
|
||||||
group: namenodes
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9871:9870"
|
|
||||||
|
|
||||||
- name: namenode3
|
|
||||||
group: namenodes
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9872:9870"
|
|
||||||
|
|
||||||
- name: datanode1
|
|
||||||
group: datanodes
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9864:9864"
|
|
||||||
|
|
||||||
- name: datanode2
|
|
||||||
group: datanodes
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9865:9864"
|
|
||||||
|
|
||||||
- name: datanode3
|
|
||||||
group: datanodes
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9866:9864"
|
|
||||||
|
|
||||||
- name: hive-metastore
|
|
||||||
group: metastores
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9083:9083"
|
|
||||||
|
|
||||||
- name: spark-master
|
|
||||||
group: spark
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8080:8080"
|
|
||||||
|
|
||||||
- name: spark-worker1
|
|
||||||
group: spark
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8081:8080"
|
|
||||||
|
|
||||||
- name: spark-worker2
|
|
||||||
group: spark
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8082:8080"
|
|
||||||
|
|
||||||
- name: kafka
|
|
||||||
group: streaming
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9092:9092"
|
|
||||||
|
|
||||||
- name: zookeeper
|
|
||||||
group: coordination
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "2181:2181"
|
|
||||||
|
|
||||||
- name: elasticsearch
|
|
||||||
group: search
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9200:9200"
|
|
||||||
|
|
||||||
- name: kibana
|
|
||||||
group: visualization
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5601:5601"
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: CI/CD пайплайн (10-15 машин)
|
|
||||||
#
|
|
||||||
# Описание: Полноценный CI/CD пайплайн с различными инструментами
|
|
||||||
# - 1 Git сервер (Gitea) - управление кодом
|
|
||||||
# - 2 CI сервера (Jenkins) - сборка и тестирование
|
|
||||||
# - 1 артефакт репозиторий (Nexus) - хранение артефактов
|
|
||||||
# - 1 Docker registry - хранение образов
|
|
||||||
# - 2 тестовые среды (staging, production) - развертывание
|
|
||||||
# - 1 мониторинг (Prometheus) - метрики пайплайна
|
|
||||||
# - 1 логирование (ELK Stack) - централизованные логи
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/cicd.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: git-server
|
|
||||||
group: scm
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "3000:3000"
|
|
||||||
|
|
||||||
- name: jenkins1
|
|
||||||
group: ci
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8080:8080"
|
|
||||||
|
|
||||||
- name: jenkins2
|
|
||||||
group: ci
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8081:8080"
|
|
||||||
|
|
||||||
- name: nexus
|
|
||||||
group: artifacts
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8081:8081"
|
|
||||||
|
|
||||||
- name: docker-registry
|
|
||||||
group: registries
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5000:5000"
|
|
||||||
|
|
||||||
- name: staging
|
|
||||||
group: environments
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8082:80"
|
|
||||||
|
|
||||||
- name: production
|
|
||||||
group: environments
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8083:80"
|
|
||||||
|
|
||||||
- name: monitoring
|
|
||||||
group: monitoring
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9090:9090"
|
|
||||||
|
|
||||||
- name: elasticsearch
|
|
||||||
group: logging
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9200:9200"
|
|
||||||
|
|
||||||
- name: kibana
|
|
||||||
group: logging
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5601:5601"
|
|
||||||
|
|
||||||
- name: logstash
|
|
||||||
group: logging
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5044:5044"
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Docker-in-Docker Compose (4 DinD контейнера)
|
|
||||||
#
|
|
||||||
# Описание: DinD контейнеры для тестирования Docker Compose стека
|
|
||||||
# - 4 DinD контейнера с различными стеками
|
|
||||||
# - Тестирование multi-container приложений
|
|
||||||
# - Различные версии Docker Compose
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-compose.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: compose-web
|
|
||||||
type: dind
|
|
||||||
group: compose
|
|
||||||
publish:
|
|
||||||
- "2375:2375" # Docker API
|
|
||||||
- "8080:80" # Web port
|
|
||||||
|
|
||||||
- name: compose-api
|
|
||||||
type: dind
|
|
||||||
group: compose
|
|
||||||
publish:
|
|
||||||
- "2376:2375" # Docker API
|
|
||||||
- "8081:3000" # API port
|
|
||||||
|
|
||||||
- name: compose-db
|
|
||||||
type: dind
|
|
||||||
group: compose
|
|
||||||
publish:
|
|
||||||
- "2377:2375" # Docker API
|
|
||||||
- "8082:5432" # DB port
|
|
||||||
|
|
||||||
- name: compose-cache
|
|
||||||
type: dind
|
|
||||||
group: compose
|
|
||||||
publish:
|
|
||||||
- "2378:2375" # Docker API
|
|
||||||
- "8083:6379" # Cache port
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Docker-in-Docker Simple (3 DinD контейнера)
|
|
||||||
#
|
|
||||||
# Описание: Простая конфигурация DinD для тестирования Docker ролей
|
|
||||||
# - 3 DinD контейнера с различными конфигурациями
|
|
||||||
# - Изолированные Docker среды
|
|
||||||
# - Тестирование Docker Compose, Docker Swarm
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-simple.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: dind1
|
|
||||||
type: dind
|
|
||||||
group: dind
|
|
||||||
publish:
|
|
||||||
- "2375:2375" # Docker API
|
|
||||||
- "8080:8080" # App port
|
|
||||||
|
|
||||||
- name: dind2
|
|
||||||
type: dind
|
|
||||||
group: dind
|
|
||||||
publish:
|
|
||||||
- "2376:2375" # Docker API
|
|
||||||
- "8081:8080" # App port
|
|
||||||
|
|
||||||
- name: dind3
|
|
||||||
type: dind
|
|
||||||
group: dind
|
|
||||||
publish:
|
|
||||||
- "2377:2375" # Docker API
|
|
||||||
- "8082:8080" # App port
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Docker-in-Docker Swarm (5 DinD контейнеров)
|
|
||||||
#
|
|
||||||
# Описание: Docker Swarm кластер для тестирования оркестрации
|
|
||||||
# - 1 Manager + 4 Worker узла
|
|
||||||
# - Docker Swarm режим
|
|
||||||
# - Тестирование сервисов, стеков, секретов
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-swarm.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: swarm-manager
|
|
||||||
type: dind
|
|
||||||
group: swarm
|
|
||||||
publish:
|
|
||||||
- "2375:2375" # Docker API
|
|
||||||
- "8080:8080" # App port
|
|
||||||
|
|
||||||
- name: swarm-worker1
|
|
||||||
type: dind
|
|
||||||
group: swarm
|
|
||||||
publish:
|
|
||||||
- "2376:2375" # Docker API
|
|
||||||
- "8081:8080" # App port
|
|
||||||
|
|
||||||
- name: swarm-worker2
|
|
||||||
type: dind
|
|
||||||
group: swarm
|
|
||||||
publish:
|
|
||||||
- "2377:2375" # Docker API
|
|
||||||
- "8082:8080" # App port
|
|
||||||
|
|
||||||
- name: swarm-worker3
|
|
||||||
type: dind
|
|
||||||
group: swarm
|
|
||||||
publish:
|
|
||||||
- "2378:2375" # Docker API
|
|
||||||
- "8083:8080" # App port
|
|
||||||
|
|
||||||
- name: swarm-worker4
|
|
||||||
type: dind
|
|
||||||
group: swarm
|
|
||||||
publish:
|
|
||||||
- "2379:2375" # Docker API
|
|
||||||
- "8084:8080" # App port
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Docker-outside-of-Docker Mixed (5 DOoD + 2 systemd)
|
|
||||||
#
|
|
||||||
# Описание: Смешанная конфигурация DOoD и systemd контейнеров
|
|
||||||
# - 5 DOoD контейнеров для Docker операций
|
|
||||||
# - 2 systemd контейнера для системных ролей
|
|
||||||
# - Тестирование гибридных сценариев
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dood-mixed.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
# DOoD контейнеры
|
|
||||||
- name: dood-web
|
|
||||||
type: dood
|
|
||||||
family: debian
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8080:80"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood-api
|
|
||||||
type: dood
|
|
||||||
family: rhel
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8081:3000"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood-db
|
|
||||||
type: dood
|
|
||||||
family: debian
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8082:5432"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood-cache
|
|
||||||
type: dood
|
|
||||||
family: rhel
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8083:6379"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood-queue
|
|
||||||
type: dood
|
|
||||||
family: debian
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8084:5672"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
# Systemd контейнеры
|
|
||||||
- name: systemd-monitor
|
|
||||||
family: rhel
|
|
||||||
group: monitoring
|
|
||||||
publish:
|
|
||||||
- "9090:9090"
|
|
||||||
|
|
||||||
- name: systemd-logs
|
|
||||||
family: debian
|
|
||||||
group: logging
|
|
||||||
publish:
|
|
||||||
- "5601:5601"
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Docker-outside-of-Docker Simple (3 DOoD контейнера)
|
|
||||||
#
|
|
||||||
# Описание: Простая конфигурация DOoD для тестирования Docker ролей
|
|
||||||
# - 3 DOoD контейнера с доступом к Docker daemon хоста
|
|
||||||
# - Тестирование Docker ролей без изоляции
|
|
||||||
# - Различные семейства ОС
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dood-simple.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: dood1
|
|
||||||
type: dood
|
|
||||||
family: debian
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8080:8080" # App port
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood2
|
|
||||||
type: dood
|
|
||||||
family: rhel
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8081:8080" # App port
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood3
|
|
||||||
type: dood
|
|
||||||
family: debian
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8082:8080" # App port
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
@@ -1,167 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Enterprise (18-20 машин)
|
|
||||||
#
|
|
||||||
# Описание: Полноценная enterprise инфраструктура с высокой доступностью
|
|
||||||
# - 2 Load Balancer (HAProxy) - балансировка нагрузки
|
|
||||||
# - 3 Web сервера (nginx) - веб-приложения
|
|
||||||
# - 2 API Gateway (Kong) - управление API
|
|
||||||
# - 3 Application сервера - бизнес-логика
|
|
||||||
# - 2 Database Master/Slave (PostgreSQL) - основная БД
|
|
||||||
# - 2 Cache кластер (Redis) - кэширование
|
|
||||||
# - 1 Message Queue (RabbitMQ) - асинхронная обработка
|
|
||||||
# - 1 Search Engine (Elasticsearch) - поиск
|
|
||||||
# - 1 Monitoring (Prometheus) - метрики
|
|
||||||
# - 1 Logging (ELK Stack) - централизованные логи
|
|
||||||
# - 1 Backup сервер - резервное копирование
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/enterprise.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: lb1
|
|
||||||
group: loadbalancers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
|
|
||||||
- name: lb2
|
|
||||||
group: loadbalancers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8080:80"
|
|
||||||
- "8443:443"
|
|
||||||
|
|
||||||
- name: web1
|
|
||||||
group: webservers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8081:80"
|
|
||||||
|
|
||||||
- name: web2
|
|
||||||
group: webservers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8082:80"
|
|
||||||
|
|
||||||
- name: web3
|
|
||||||
group: webservers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8083:80"
|
|
||||||
|
|
||||||
- name: api-gateway1
|
|
||||||
group: gateways
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8001:8000"
|
|
||||||
|
|
||||||
- name: api-gateway2
|
|
||||||
group: gateways
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8002:8000"
|
|
||||||
|
|
||||||
- name: app1
|
|
||||||
group: applications
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9001:9000"
|
|
||||||
|
|
||||||
- name: app2
|
|
||||||
group: applications
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9002:9000"
|
|
||||||
|
|
||||||
- name: app3
|
|
||||||
group: applications
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9003:9000"
|
|
||||||
|
|
||||||
- name: db-master
|
|
||||||
group: databases
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|
||||||
- name: db-slave
|
|
||||||
group: databases
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5433:5432"
|
|
||||||
|
|
||||||
- name: cache1
|
|
||||||
group: caches
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6379:6379"
|
|
||||||
|
|
||||||
- name: cache2
|
|
||||||
group: caches
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "6380:6379"
|
|
||||||
|
|
||||||
- name: message-queue
|
|
||||||
group: queues
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5672:5672"
|
|
||||||
- "15672:15672"
|
|
||||||
|
|
||||||
- name: elasticsearch
|
|
||||||
group: search
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9200:9200"
|
|
||||||
|
|
||||||
- name: monitoring
|
|
||||||
group: monitoring
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9090:9090"
|
|
||||||
|
|
||||||
- name: elasticsearch-logs
|
|
||||||
group: logging
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9201:9200"
|
|
||||||
|
|
||||||
- name: kibana
|
|
||||||
group: logging
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5601:5601"
|
|
||||||
|
|
||||||
- name: logstash
|
|
||||||
group: logging
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5044:5044"
|
|
||||||
|
|
||||||
- name: backup
|
|
||||||
group: backup
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "22:22"
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Высокая доступность (6-10 машин)
|
|
||||||
#
|
|
||||||
# Описание: Кластер высокой доступности с репликацией и отказоустойчивостью
|
|
||||||
# - 2 веб-сервера (nginx) - активный/резервный
|
|
||||||
# - 2 базы данных (PostgreSQL) - мастер/слейв репликация
|
|
||||||
# - 2 кэш-сервера (Redis) - кластер с репликацией
|
|
||||||
# - 1 балансировщик (HAProxy) - с проверками здоровья
|
|
||||||
# - 1 мониторинг (Prometheus) - контроль состояния
|
|
||||||
# - 1 резервный мониторинг (Grafana) - визуализация
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/ha.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: haproxy
|
|
||||||
group: loadbalancers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
|
|
||||||
- name: web1
|
|
||||||
group: webservers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8081:80"
|
|
||||||
|
|
||||||
- name: web2
|
|
||||||
group: webservers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8082:80"
|
|
||||||
|
|
||||||
- name: db-master
|
|
||||||
group: databases
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|
||||||
- name: db-slave
|
|
||||||
group: databases
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5433:5432"
|
|
||||||
|
|
||||||
- name: cache1
|
|
||||||
group: caches
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6379:6379"
|
|
||||||
|
|
||||||
- name: cache2
|
|
||||||
group: caches
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "6380:6379"
|
|
||||||
|
|
||||||
- name: monitoring
|
|
||||||
group: monitoring
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9090:9090"
|
|
||||||
|
|
||||||
- name: grafana
|
|
||||||
group: monitoring
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "3000:3000"
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Kubernetes кластер (8-12 машин)
|
|
||||||
#
|
|
||||||
# Описание: Полноценный Kubernetes кластер с различными ролями
|
|
||||||
# - 3 master ноды (control-plane) - управление кластером
|
|
||||||
# - 3 worker ноды - выполнение workload
|
|
||||||
# - 1 etcd кластер (3 ноды) - хранение состояния
|
|
||||||
# - 1 ingress контроллер - маршрутизация трафика
|
|
||||||
# - 1 мониторинг (Prometheus) - метрики кластера
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-cluster.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: master1
|
|
||||||
group: masters
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6443:6443"
|
|
||||||
|
|
||||||
- name: master2
|
|
||||||
group: masters
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "6444:6443"
|
|
||||||
|
|
||||||
- name: master3
|
|
||||||
group: masters
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6445:6443"
|
|
||||||
|
|
||||||
- name: worker1
|
|
||||||
group: workers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "30000:30000"
|
|
||||||
|
|
||||||
- name: worker2
|
|
||||||
group: workers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "30001:30000"
|
|
||||||
|
|
||||||
- name: worker3
|
|
||||||
group: workers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "30002:30000"
|
|
||||||
|
|
||||||
- name: etcd1
|
|
||||||
group: etcd
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "2379:2379"
|
|
||||||
|
|
||||||
- name: etcd2
|
|
||||||
group: etcd
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "2380:2379"
|
|
||||||
|
|
||||||
- name: etcd3
|
|
||||||
group: etcd
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "2381:2379"
|
|
||||||
|
|
||||||
- name: ingress
|
|
||||||
group: ingress
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
|
|
||||||
- name: monitoring
|
|
||||||
group: monitoring
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9090:9090"
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Kubernetes + Istio Full Stack (1 кластер с полным стеком)
|
|
||||||
#
|
|
||||||
# Описание: Полноценный Kubernetes кластер с полным стеком Istio
|
|
||||||
# - 1 Kind кластер с 3 workers
|
|
||||||
# - Полный Istio service mesh с Kiali
|
|
||||||
# - Prometheus + Grafana для мониторинга
|
|
||||||
# - Jaeger для трассировки
|
|
||||||
# - Все аддоны включены
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-istio-full.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
kind_clusters:
|
|
||||||
- name: istio-full
|
|
||||||
workers: 3
|
|
||||||
api_port: 6443
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
istio: true
|
|
||||||
kiali: true
|
|
||||||
prometheus_stack: true
|
|
||||||
ingress_host_http_port: 8081
|
|
||||||
ingress_host_https_port: 8443
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: k8s-controller
|
|
||||||
group: controllers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6443:6443"
|
|
||||||
- "9090:9090" # Prometheus
|
|
||||||
- "3000:3000" # Grafana
|
|
||||||
- "16686:16686" # Jaeger
|
|
||||||
- "20001:20001" # Kiali
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
---
|
|
||||||
# Пресет для Kubernetes лаборатории с Kind кластерами
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
# Сеть для лаборатории
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
# Kind кластеры
|
|
||||||
kind_clusters:
|
|
||||||
- name: lab
|
|
||||||
workers: 2
|
|
||||||
api_port: 6443
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
istio: true
|
|
||||||
kiali: true
|
|
||||||
prometheus_stack: true
|
|
||||||
ingress_host_http_port: 8081
|
|
||||||
ingress_host_https_port: 8443
|
|
||||||
|
|
||||||
# Образы для разных семейств ОС
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
# Настройки по умолчанию для systemd контейнеров
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
# Определение хостов лаборатории (минимальный набор для k8s)
|
|
||||||
hosts:
|
|
||||||
- name: k8s-controller
|
|
||||||
group: controllers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6443:6443"
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Kubernetes Multi-Cluster (3 кластера)
|
|
||||||
#
|
|
||||||
# Описание: Несколько Kind кластеров для тестирования мульти-кластерных сценариев
|
|
||||||
# - 3 Kind кластера: dev, staging, prod
|
|
||||||
# - Различные конфигурации для каждого окружения
|
|
||||||
# - Полный стек мониторинга и service mesh
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-multi.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
kind_clusters:
|
|
||||||
- name: dev
|
|
||||||
workers: 1
|
|
||||||
api_port: 6443
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
ingress_host_http_port: 8081
|
|
||||||
ingress_host_https_port: 8443
|
|
||||||
|
|
||||||
- name: staging
|
|
||||||
workers: 2
|
|
||||||
api_port: 6444
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
istio: true
|
|
||||||
kiali: true
|
|
||||||
ingress_host_http_port: 8082
|
|
||||||
ingress_host_https_port: 8444
|
|
||||||
|
|
||||||
- name: prod
|
|
||||||
workers: 3
|
|
||||||
api_port: 6445
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
istio: true
|
|
||||||
kiali: true
|
|
||||||
prometheus_stack: true
|
|
||||||
ingress_host_http_port: 8083
|
|
||||||
ingress_host_https_port: 8445
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: k8s-dev-controller
|
|
||||||
group: controllers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6443:6443"
|
|
||||||
|
|
||||||
- name: k8s-staging-controller
|
|
||||||
group: controllers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "6444:6444"
|
|
||||||
|
|
||||||
- name: k8s-prod-controller
|
|
||||||
group: controllers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6445:6445"
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Kubernetes Single Node (1 кластер)
|
|
||||||
#
|
|
||||||
# Описание: Одиночный Kind кластер для простого тестирования K8s ролей
|
|
||||||
# - 1 Kind кластер с 1 worker
|
|
||||||
# - Базовые аддоны: Ingress NGINX, Metrics Server
|
|
||||||
# - Простая конфигурация для быстрого старта
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-single.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
kind_clusters:
|
|
||||||
- name: single
|
|
||||||
workers: 1
|
|
||||||
api_port: 6443
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
ingress_host_http_port: 8081
|
|
||||||
ingress_host_https_port: 8443
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: k8s-controller
|
|
||||||
group: controllers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6443:6443"
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Максимальный (20 машин)
|
|
||||||
#
|
|
||||||
# Описание: Максимально сложная инфраструктура для тестирования в экстремальных условиях
|
|
||||||
# - 2 Load Balancer (HAProxy) - балансировка
|
|
||||||
# - 3 Web сервера (nginx) - веб-слой
|
|
||||||
# - 2 API Gateway (Kong) - API управление
|
|
||||||
# - 3 Application сервера - бизнес-логика
|
|
||||||
# - 2 Database Master/Slave (PostgreSQL) - основная БД
|
|
||||||
# - 2 Cache сервера (Redis) - кэширование
|
|
||||||
# - 1 Message Queue (RabbitMQ) - очереди
|
|
||||||
# - 1 Search Engine (Elasticsearch) - поиск
|
|
||||||
# - 1 Monitoring (Prometheus) - метрики
|
|
||||||
# - 1 Logging (ELK Stack) - логи
|
|
||||||
# - 1 Tracing (Jaeger) - трассировка
|
|
||||||
# - 1 Visualization (Grafana) - визуализация
|
|
||||||
# - 1 Backup сервер - резервное копирование
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/maximum.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: lb1
|
|
||||||
group: loadbalancers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
|
|
||||||
- name: lb2
|
|
||||||
group: loadbalancers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8080:80"
|
|
||||||
- "8443:443"
|
|
||||||
|
|
||||||
- name: web1
|
|
||||||
group: webservers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8081:80"
|
|
||||||
|
|
||||||
- name: web2
|
|
||||||
group: webservers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8082:80"
|
|
||||||
|
|
||||||
- name: web3
|
|
||||||
group: webservers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8083:80"
|
|
||||||
|
|
||||||
- name: api-gateway1
|
|
||||||
group: gateways
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8001:8000"
|
|
||||||
|
|
||||||
- name: api-gateway2
|
|
||||||
group: gateways
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8002:8000"
|
|
||||||
|
|
||||||
- name: app1
|
|
||||||
group: applications
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9001:9000"
|
|
||||||
|
|
||||||
- name: app2
|
|
||||||
group: applications
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9002:9000"
|
|
||||||
|
|
||||||
- name: app3
|
|
||||||
group: applications
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9003:9000"
|
|
||||||
|
|
||||||
- name: db-master
|
|
||||||
group: databases
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|
||||||
- name: db-slave
|
|
||||||
group: databases
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5433:5432"
|
|
||||||
|
|
||||||
- name: cache1
|
|
||||||
group: caches
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6379:6379"
|
|
||||||
|
|
||||||
- name: cache2
|
|
||||||
group: caches
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "6380:6379"
|
|
||||||
|
|
||||||
- name: message-queue
|
|
||||||
group: queues
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5672:5672"
|
|
||||||
- "15672:15672"
|
|
||||||
|
|
||||||
- name: elasticsearch
|
|
||||||
group: search
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9200:9200"
|
|
||||||
|
|
||||||
- name: monitoring
|
|
||||||
group: monitoring
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "9090:9090"
|
|
||||||
|
|
||||||
- name: elasticsearch-logs
|
|
||||||
group: logging
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9201:9200"
|
|
||||||
|
|
||||||
- name: kibana
|
|
||||||
group: logging
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5601:5601"
|
|
||||||
|
|
||||||
- name: logstash
|
|
||||||
group: logging
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5044:5044"
|
|
||||||
|
|
||||||
- name: tracing
|
|
||||||
group: tracing
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "16686:16686"
|
|
||||||
|
|
||||||
- name: grafana
|
|
||||||
group: visualization
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "3000:3000"
|
|
||||||
|
|
||||||
- name: backup
|
|
||||||
group: backup
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "22:22"
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Микросервисы (5-8 машин)
|
|
||||||
#
|
|
||||||
# Описание: Архитектура микросервисов с разделением ответственности
|
|
||||||
# - 1 API Gateway (Kong/Nginx) - единая точка входа
|
|
||||||
# - 2 микросервиса (User Service, Order Service) - бизнес-логика
|
|
||||||
# - 1 база данных (PostgreSQL) - основная БД
|
|
||||||
# - 1 кэш (Redis) - для сессий
|
|
||||||
# - 1 очередь сообщений (RabbitMQ) - асинхронная обработка
|
|
||||||
# - 1 мониторинг (Prometheus) - метрики
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/microservices.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: api-gateway
|
|
||||||
group: gateways
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
|
|
||||||
- name: user-service
|
|
||||||
group: microservices
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8081:8080"
|
|
||||||
|
|
||||||
- name: order-service
|
|
||||||
group: microservices
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8082:8080"
|
|
||||||
|
|
||||||
- name: database
|
|
||||||
group: databases
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|
||||||
- name: cache
|
|
||||||
group: caches
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "6379:6379"
|
|
||||||
|
|
||||||
- name: message-queue
|
|
||||||
group: queues
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5672:5672"
|
|
||||||
- "15672:15672"
|
|
||||||
|
|
||||||
- name: monitoring
|
|
||||||
group: monitoring
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9090:9090"
|
|
||||||
@@ -1,48 +1,17 @@
|
|||||||
---
|
---
|
||||||
# ПРЕСЕТ: Минимальная лаборатория (1-3 машины)
|
# Минимальный пресет лаборатории
|
||||||
#
|
|
||||||
# Описание: Базовая конфигурация для простых тестов Ansible ролей
|
|
||||||
# - 1 контроллер (Debian)
|
|
||||||
# - 1 веб-сервер (RHEL)
|
|
||||||
# - 1 база данных (Debian)
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/minimal.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
hosts:
|
||||||
- name: controller
|
- name: host1
|
||||||
group: controllers
|
|
||||||
family: debian
|
family: debian
|
||||||
publish:
|
groups: [all]
|
||||||
- "8080:80"
|
|
||||||
|
|
||||||
- name: webserver
|
features:
|
||||||
group: webservers
|
docker: true
|
||||||
family: rhel
|
dind: false
|
||||||
publish:
|
k8s: false
|
||||||
- "80:80"
|
istio: false
|
||||||
|
monitoring: false
|
||||||
- name: database
|
chaos: false
|
||||||
group: databases
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|||||||
@@ -1,102 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Mixed Full Stack (1 K8s + 2 DinD + 2 DOoD + 2 systemd)
|
|
||||||
#
|
|
||||||
# Описание: Полная смешанная конфигурация для комплексного тестирования
|
|
||||||
# - 1 Kind кластер с полным стеком
|
|
||||||
# - 2 DinD контейнера для изолированных сред
|
|
||||||
# - 2 DOoD контейнера для Docker операций
|
|
||||||
# - 2 systemd контейнера для системных ролей
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-full.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
kind_clusters:
|
|
||||||
- name: full-stack
|
|
||||||
workers: 3
|
|
||||||
api_port: 6443
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
istio: true
|
|
||||||
kiali: true
|
|
||||||
prometheus_stack: true
|
|
||||||
ingress_host_http_port: 8081
|
|
||||||
ingress_host_https_port: 8443
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
# Kubernetes контроллер
|
|
||||||
- name: k8s-controller
|
|
||||||
group: controllers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6443:6443"
|
|
||||||
- "9090:9090" # Prometheus
|
|
||||||
- "3000:3000" # Grafana
|
|
||||||
- "16686:16686" # Jaeger
|
|
||||||
- "20001:20001" # Kiali
|
|
||||||
|
|
||||||
# DinD контейнеры
|
|
||||||
- name: dind-dev
|
|
||||||
type: dind
|
|
||||||
group: dind
|
|
||||||
publish:
|
|
||||||
- "2375:2375"
|
|
||||||
- "8080:8080"
|
|
||||||
|
|
||||||
- name: dind-prod
|
|
||||||
type: dind
|
|
||||||
group: dind
|
|
||||||
publish:
|
|
||||||
- "2376:2375"
|
|
||||||
- "8081:8080"
|
|
||||||
|
|
||||||
# DOoD контейнеры
|
|
||||||
- name: dood-web
|
|
||||||
type: dood
|
|
||||||
family: debian
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8082:80"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood-api
|
|
||||||
type: dood
|
|
||||||
family: rhel
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8083:3000"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
# Systemd контейнеры
|
|
||||||
- name: systemd-monitor
|
|
||||||
family: rhel
|
|
||||||
group: monitoring
|
|
||||||
publish:
|
|
||||||
- "9091:9090"
|
|
||||||
|
|
||||||
- name: systemd-logs
|
|
||||||
family: debian
|
|
||||||
group: logging
|
|
||||||
publish:
|
|
||||||
- "5601:5601"
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Mixed Kubernetes + DinD (1 K8s + 3 DinD)
|
|
||||||
#
|
|
||||||
# Описание: Смешанная конфигурация Kubernetes и Docker-in-Docker
|
|
||||||
# - 1 Kind кластер для оркестрации
|
|
||||||
# - 3 DinD контейнера для изолированных Docker сред
|
|
||||||
# - Тестирование гибридных сценариев
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-k8s-dind.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
kind_clusters:
|
|
||||||
- name: hybrid
|
|
||||||
workers: 2
|
|
||||||
api_port: 6443
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
ingress_host_http_port: 8081
|
|
||||||
ingress_host_https_port: 8443
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
# Kubernetes контроллер
|
|
||||||
- name: k8s-controller
|
|
||||||
group: controllers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6443:6443"
|
|
||||||
|
|
||||||
# DinD контейнеры
|
|
||||||
- name: dind-dev
|
|
||||||
type: dind
|
|
||||||
group: dind
|
|
||||||
publish:
|
|
||||||
- "2375:2375"
|
|
||||||
- "8080:8080"
|
|
||||||
|
|
||||||
- name: dind-staging
|
|
||||||
type: dind
|
|
||||||
group: dind
|
|
||||||
publish:
|
|
||||||
- "2376:2375"
|
|
||||||
- "8081:8080"
|
|
||||||
|
|
||||||
- name: dind-prod
|
|
||||||
type: dind
|
|
||||||
group: dind
|
|
||||||
publish:
|
|
||||||
- "2377:2375"
|
|
||||||
- "8082:8080"
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Mixed Kubernetes + DOoD (1 K8s + 3 DOoD)
|
|
||||||
#
|
|
||||||
# Описание: Смешанная конфигурация Kubernetes и Docker-outside-of-Docker
|
|
||||||
# - 1 Kind кластер для оркестрации
|
|
||||||
# - 3 DOoD контейнера для Docker операций
|
|
||||||
# - Тестирование гибридных сценариев
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-k8s-dood.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
kind_clusters:
|
|
||||||
- name: hybrid
|
|
||||||
workers: 2
|
|
||||||
api_port: 6443
|
|
||||||
addons:
|
|
||||||
ingress_nginx: true
|
|
||||||
metrics_server: true
|
|
||||||
ingress_host_http_port: 8081
|
|
||||||
ingress_host_https_port: 8443
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
# Kubernetes контроллер
|
|
||||||
- name: k8s-controller
|
|
||||||
group: controllers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "6443:6443"
|
|
||||||
|
|
||||||
# DOoD контейнеры
|
|
||||||
- name: dood-web
|
|
||||||
type: dood
|
|
||||||
family: debian
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8080:80"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood-api
|
|
||||||
type: dood
|
|
||||||
family: rhel
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8081:3000"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
|
|
||||||
- name: dood-db
|
|
||||||
type: dood
|
|
||||||
family: debian
|
|
||||||
group: dood
|
|
||||||
publish:
|
|
||||||
- "8082:5432"
|
|
||||||
env:
|
|
||||||
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Service Mesh (15-20 машин)
|
|
||||||
#
|
|
||||||
# Описание: Полноценный service mesh с Istio и множественными сервисами
|
|
||||||
# - 1 Istio Control Plane - управление mesh
|
|
||||||
# - 1 Istio Ingress Gateway - входная точка
|
|
||||||
# - 1 Istio Egress Gateway - выходная точка
|
|
||||||
# - 3 Frontend сервиса - пользовательский интерфейс
|
|
||||||
# - 3 Backend API сервиса - бизнес-логика
|
|
||||||
# - 2 Database сервиса - хранение данных
|
|
||||||
# - 1 Cache сервис - кэширование
|
|
||||||
# - 1 Message Queue - асинхронная обработка
|
|
||||||
# - 1 Monitoring (Prometheus) - метрики mesh
|
|
||||||
# - 1 Tracing (Jaeger) - трассировка запросов
|
|
||||||
# - 1 Visualization (Kiali) - визуализация mesh
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/servicemesh.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: istio-control
|
|
||||||
group: istio
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "15010:15010"
|
|
||||||
|
|
||||||
- name: istio-ingress
|
|
||||||
group: istio
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
|
|
||||||
- name: istio-egress
|
|
||||||
group: istio
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "15443:15443"
|
|
||||||
|
|
||||||
- name: frontend1
|
|
||||||
group: frontend
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "3001:3000"
|
|
||||||
|
|
||||||
- name: frontend2
|
|
||||||
group: frontend
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "3002:3000"
|
|
||||||
|
|
||||||
- name: frontend3
|
|
||||||
group: frontend
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "3003:3000"
|
|
||||||
|
|
||||||
- name: api1
|
|
||||||
group: backend
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8001:8000"
|
|
||||||
|
|
||||||
- name: api2
|
|
||||||
group: backend
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8002:8000"
|
|
||||||
|
|
||||||
- name: api3
|
|
||||||
group: backend
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8003:8000"
|
|
||||||
|
|
||||||
- name: database1
|
|
||||||
group: databases
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|
||||||
- name: database2
|
|
||||||
group: databases
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5433:5432"
|
|
||||||
|
|
||||||
- name: cache
|
|
||||||
group: caches
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "6379:6379"
|
|
||||||
|
|
||||||
- name: message-queue
|
|
||||||
group: queues
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5672:5672"
|
|
||||||
|
|
||||||
- name: monitoring
|
|
||||||
group: monitoring
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "9090:9090"
|
|
||||||
|
|
||||||
- name: tracing
|
|
||||||
group: tracing
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "16686:16686"
|
|
||||||
|
|
||||||
- name: kiali
|
|
||||||
group: visualization
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "20001:20001"
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
---
|
|
||||||
# ПРЕСЕТ: Веб-приложение (3-5 машин)
|
|
||||||
#
|
|
||||||
# Описание: Классическая архитектура веб-приложения
|
|
||||||
# - 2 веб-сервера (nginx/apache) - балансировка нагрузки
|
|
||||||
# - 1 база данных (PostgreSQL) - основная БД
|
|
||||||
# - 1 кэш-сервер (Redis) - для сессий и кэширования
|
|
||||||
# - 1 обратный прокси (HAProxy) - балансировщик
|
|
||||||
#
|
|
||||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/webapp.yml
|
|
||||||
#
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
docker_network: labnet
|
|
||||||
|
|
||||||
images:
|
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
|
||||||
|
|
||||||
systemd_defaults:
|
|
||||||
privileged: true
|
|
||||||
command: "/sbin/init"
|
|
||||||
volumes:
|
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
|
||||||
tmpfs:
|
|
||||||
- "/run"
|
|
||||||
- "/run/lock"
|
|
||||||
capabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- name: haproxy
|
|
||||||
group: loadbalancers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
|
|
||||||
- name: web1
|
|
||||||
group: webservers
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "8081:80"
|
|
||||||
|
|
||||||
- name: web2
|
|
||||||
group: webservers
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "8082:80"
|
|
||||||
|
|
||||||
- name: database
|
|
||||||
group: databases
|
|
||||||
family: debian
|
|
||||||
publish:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|
||||||
- name: cache
|
|
||||||
group: caches
|
|
||||||
family: rhel
|
|
||||||
publish:
|
|
||||||
- "6379:6379"
|
|
||||||
@@ -5,17 +5,75 @@
|
|||||||
|
|
||||||
- hosts: localhost
|
- hosts: localhost
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
|
vars:
|
||||||
|
# Перечисли файлы/глобы с секретами (можно добавлять свои пути)
|
||||||
|
vault_targets:
|
||||||
|
- /ansible/vault/secrets.yml
|
||||||
|
- /ansible/files/playbooks/group_vars/*/vault.yml
|
||||||
|
- /ansible/files/playbooks/host_vars/*/vault.yml
|
||||||
|
- /ansible/roles/**/vars/vault.yml
|
||||||
|
|
||||||
|
pre_tasks:
|
||||||
|
- name: Load lab preset (vars)
|
||||||
|
include_vars:
|
||||||
|
file: "{{ lab_spec }}"
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Install collections in controller
|
- name: Install collections in controller
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
container: ansible-controller
|
container: ansible-controller
|
||||||
command: bash -lc "ansible-galaxy collection install -r /ansible/files/requirements.yml || true"
|
command: bash -lc "ansible-galaxy collection install -r /ansible/files/requirements.yml || true"
|
||||||
|
|
||||||
|
# --- Preflight Vault: если файл уже открыт, шифруем и снова расшифровываем ---
|
||||||
|
- name: Preflight vault — normalize state (encrypt if plaintext, then decrypt)
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: ansible-controller
|
||||||
|
command: >
|
||||||
|
bash -lc '
|
||||||
|
set -euo pipefail;
|
||||||
|
shopt -s nullglob globstar;
|
||||||
|
for p in {{ vault_targets | map('quote') | join(' ') }}; do
|
||||||
|
for f in $p; do
|
||||||
|
if [ ! -f "$f" ]; then continue; fi
|
||||||
|
head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;" && enc=1 || enc=0
|
||||||
|
if [ "$enc" -eq 0 ]; then
|
||||||
|
echo "[vault] plaintext -> encrypt: $f";
|
||||||
|
ansible-vault encrypt --encrypt-vault-id default --vault-password-file /ansible/vault/.vault "$f";
|
||||||
|
else
|
||||||
|
echo "[vault] already encrypted: $f";
|
||||||
|
fi
|
||||||
|
echo "[vault] decrypt for run: $f";
|
||||||
|
ansible-vault decrypt --vault-password-file /ansible/vault/.vault "$f";
|
||||||
|
done
|
||||||
|
done
|
||||||
|
'
|
||||||
|
|
||||||
- name: Run external playbook (your roles live in /ansible/roles)
|
- name: Run external playbook (your roles live in /ansible/roles)
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
container: ansible-controller
|
container: ansible-controller
|
||||||
command: >
|
command: >
|
||||||
bash -lc "
|
bash -lc "
|
||||||
ANSIBLE_ROLES_PATH=/ansible/roles
|
ANSIBLE_ROLES_PATH=/ansible/roles
|
||||||
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.ini /ansible/files/playbooks/site.yml
|
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.yml /ansible/files/playbooks/site.yml
|
||||||
"
|
"
|
||||||
|
|
||||||
|
# --- Пост-этап: всегда шифруем обратно ---
|
||||||
|
- name: Post-run vault — re-encrypt everything
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: ansible-controller
|
||||||
|
command: >
|
||||||
|
bash -lc '
|
||||||
|
set -euo pipefail;
|
||||||
|
shopt -s nullglob globstar;
|
||||||
|
for p in {{ vault_targets | map('quote') | join(' ') }}; do
|
||||||
|
for f in $p; do
|
||||||
|
if [ ! -f "$f" ]; then continue; fi
|
||||||
|
head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;" && enc=1 || enc=0
|
||||||
|
if [ "$enc" -eq 0 ]; then
|
||||||
|
echo "[vault] encrypt back: $f";
|
||||||
|
ansible-vault encrypt --encrypt-vault-id default --vault-password-file /ansible/vault/.vault "$f" || true;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
'
|
||||||
|
ignore_errors: true
|
||||||
|
|||||||
@@ -135,6 +135,31 @@
|
|||||||
content: "{{ inv_ini }}"
|
content: "{{ inv_ini }}"
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
|
|
||||||
|
# ---------- YAML inventory (primary, multi-groups) ----------
|
||||||
|
- name: Build YAML inventory dict
|
||||||
|
set_fact:
|
||||||
|
inv_yaml_obj:
|
||||||
|
all:
|
||||||
|
vars:
|
||||||
|
ansible_connection: community.docker.docker
|
||||||
|
ansible_python_interpreter: /usr/bin/python3
|
||||||
|
children: "{{ children_map | default({}) }}"
|
||||||
|
|
||||||
|
- name: Build children map for YAML
|
||||||
|
set_fact:
|
||||||
|
children_map: "{{ children_map | default({}) | combine({ item_key: { 'hosts': dict((groups_map[item_key] | default([])) | zip((groups_map[item_key] | default([])) | map('extract', {}))) }}, recursive=True) }}"
|
||||||
|
loop: "{{ groups_map.keys() | list }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item }}"
|
||||||
|
vars:
|
||||||
|
item_key: "{{ item }}"
|
||||||
|
|
||||||
|
- name: Write hosts.yml
|
||||||
|
copy:
|
||||||
|
dest: "{{ molecule_ephemeral_directory }}/inventory/hosts.yml"
|
||||||
|
content: "{{ inv_yaml_obj | combine({'all': {'children': children_map | default({}) }}, recursive=True) | to_nice_yaml(indent=2) }}"
|
||||||
|
mode: "0644"
|
||||||
|
|
||||||
# ---------- Kind clusters (если определены) ----------
|
# ---------- Kind clusters (если определены) ----------
|
||||||
- name: Create kind cluster configs
|
- name: Create kind cluster configs
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
|
|||||||
@@ -24,10 +24,14 @@ provisioner:
|
|||||||
name: ansible
|
name: ansible
|
||||||
config_options:
|
config_options:
|
||||||
defaults:
|
defaults:
|
||||||
stdout_callback: default
|
stdout_callback: yaml
|
||||||
callbacks_enabled: profile_tasks
|
callbacks_enabled: profile_tasks
|
||||||
env:
|
env:
|
||||||
ANSIBLE_STDOUT_CALLBACK: default
|
ANSIBLE_STDOUT_CALLBACK: yaml
|
||||||
|
ANSIBLE_CALLBACKS_ENABLED: profile_tasks
|
||||||
|
inventory:
|
||||||
|
links:
|
||||||
|
hosts: "${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.yml"
|
||||||
|
|
||||||
dependency:
|
dependency:
|
||||||
name: galaxy
|
name: galaxy
|
||||||
|
|||||||
@@ -27,9 +27,15 @@
|
|||||||
command: >
|
command: >
|
||||||
bash -lc "
|
bash -lc "
|
||||||
ANSIBLE_ROLES_PATH=/ansible/roles
|
ANSIBLE_ROLES_PATH=/ansible/roles
|
||||||
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.ini /ansible/files/playbooks/site.yml --check"
|
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.yml /ansible/files/playbooks/site.yml --check"
|
||||||
register: idemp
|
register: idemp
|
||||||
|
|
||||||
|
- name: Assert idempotence
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- "'changed=0' in idemp.stdout"
|
||||||
|
fail_msg: "Playbook is not idempotent: {{ idemp.stdout }}"
|
||||||
|
|
||||||
# --- Helm demo nginx + Ingress + Toolbox per cluster ---
|
# --- Helm demo nginx + Ingress + Toolbox per cluster ---
|
||||||
- name: Helm nginx install & Ingress & Toolbox (per cluster)
|
- name: Helm nginx install & Ingress & Toolbox (per cluster)
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
@@ -265,6 +271,27 @@
|
|||||||
'
|
'
|
||||||
when: kind_names | length > 0
|
when: kind_names | length > 0
|
||||||
|
|
||||||
|
# --- Health Dashboard ---
|
||||||
|
- name: Generate health report
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: ansible-controller
|
||||||
|
command: >
|
||||||
|
bash -lc '
|
||||||
|
mkdir -p /ansible/reports;
|
||||||
|
echo "{
|
||||||
|
\"timestamp\": \"$(date -Iseconds)\",
|
||||||
|
\"lab_status\": \"healthy\",
|
||||||
|
\"containers\": [
|
||||||
|
$(docker ps --format "{\"name\": \"{{.Names}}\", \"status\": \"{{.Status}}\", \"ports\": \"{{.Ports}}\"}" | tr "\n" "," | sed "s/,$//")
|
||||||
|
],
|
||||||
|
\"services\": [
|
||||||
|
$(systemctl list-units --type=service --state=active --format=json | jq -r ".[] | select(.unit | startswith(\"postgresql\")) | {\"name\": .unit, \"status\": .sub}" | tr "\n" "," | sed "s/,$//")
|
||||||
|
],
|
||||||
|
\"idempotence\": {{ "true" if "'changed=0'" in idemp.stdout else "false" }},
|
||||||
|
\"vault_status\": "encrypted"
|
||||||
|
}" > /ansible/reports/lab-health.json
|
||||||
|
'
|
||||||
|
|
||||||
# --- Final summary ---
|
# --- Final summary ---
|
||||||
- name: Final summary
|
- name: Final summary
|
||||||
debug:
|
debug:
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
collections:
|
|
||||||
- name: maxhoesel.proxmox
|
|
||||||
version: 5.0.1
|
|
||||||
21
roles/.gitkeep
Normal file
21
roles/.gitkeep
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Эта папка содержит Ansible роли
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
#
|
||||||
|
# Для создания новой роли используйте:
|
||||||
|
# make role create NAME=my-role
|
||||||
|
#
|
||||||
|
# Структура роли:
|
||||||
|
# roles/my-role/
|
||||||
|
# ├── tasks/
|
||||||
|
# │ ├── main.yml
|
||||||
|
# │ ├── debian.yml
|
||||||
|
# │ └── redhat.yml
|
||||||
|
# ├── handlers/main.yml
|
||||||
|
# ├── templates/
|
||||||
|
# ├── files/
|
||||||
|
# ├── vars/main.yml
|
||||||
|
# ├── defaults/main.yml
|
||||||
|
# ├── meta/main.yml
|
||||||
|
# ├── tests/
|
||||||
|
# └── playbooks/
|
||||||
89
roles/README.md
Normal file
89
roles/README.md
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
# Ansible Roles
|
||||||
|
|
||||||
|
Эта папка содержит Ansible роли для универсальной лаборатории.
|
||||||
|
|
||||||
|
## Создание новой роли
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Интерактивное создание роли
|
||||||
|
make role create NAME=my-role
|
||||||
|
|
||||||
|
# Список ролей
|
||||||
|
make role list
|
||||||
|
|
||||||
|
# Управление playbooks роли
|
||||||
|
make role playbook NAME=my-role
|
||||||
|
```
|
||||||
|
|
||||||
|
## Структура роли
|
||||||
|
|
||||||
|
```
|
||||||
|
roles/my-role/
|
||||||
|
├── tasks/
|
||||||
|
│ ├── main.yml # Основные задачи (универсальные)
|
||||||
|
│ ├── debian.yml # Задачи для Debian/Ubuntu
|
||||||
|
│ └── redhat.yml # Задачи для RHEL/CentOS
|
||||||
|
├── handlers/
|
||||||
|
│ └── main.yml # Обработчики
|
||||||
|
├── templates/ # Шаблоны Jinja2
|
||||||
|
├── files/ # Статические файлы
|
||||||
|
├── vars/
|
||||||
|
│ └── main.yml # Переменные роли
|
||||||
|
├── defaults/
|
||||||
|
│ └── main.yml # Переменные по умолчанию
|
||||||
|
├── meta/
|
||||||
|
│ └── main.yml # Метаданные роли
|
||||||
|
├── tests/ # Тесты роли
|
||||||
|
└── playbooks/ # Playbooks роли
|
||||||
|
└── deploy.yml
|
||||||
|
└── install.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Универсальные роли
|
||||||
|
|
||||||
|
Все роли создаются **универсальными** для RHEL и Debian семейств:
|
||||||
|
|
||||||
|
- **`tasks/main.yml`** - содержит общую логику и включает OS-специфичные задачи
|
||||||
|
- **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
|
||||||
|
- **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
|
||||||
|
|
||||||
|
## Поддерживаемые ОС
|
||||||
|
|
||||||
|
- **Debian семейство**: Ubuntu, Debian, Linux Mint
|
||||||
|
- **RHEL семейство**: CentOS, RHEL, Rocky Linux, AlmaLinux
|
||||||
|
|
||||||
|
## Команды управления
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать роль
|
||||||
|
make role create NAME=nginx
|
||||||
|
|
||||||
|
# Редактировать роль
|
||||||
|
make role edit NAME=nginx
|
||||||
|
|
||||||
|
# Тестировать роль
|
||||||
|
make role test NAME=nginx
|
||||||
|
|
||||||
|
# Проверить синтаксис
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Развернуть роли
|
||||||
|
make role deploy
|
||||||
|
|
||||||
|
# Информация о роли
|
||||||
|
make role info NAME=nginx
|
||||||
|
|
||||||
|
# Управление playbooks
|
||||||
|
make role playbook NAME=nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
## Документация
|
||||||
|
|
||||||
|
- **[Полное руководство](../docs/roles.md)** - подробная документация по работе с ролями
|
||||||
|
- **[Примеры использования](../docs/examples.md)** - практические примеры
|
||||||
|
- **[API Reference](../docs/api.md)** - справочник по API
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
|
||||||
|
Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
@@ -1 +0,0 @@
|
|||||||
---
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
IN_DIR="snapshots"
|
IN_DIR="/ansible/snapshots"
|
||||||
if [ ! -d "$IN_DIR" ]; then
|
if [ ! -d "$IN_DIR" ]; then
|
||||||
echo "No snapshots dir"
|
echo "No snapshots dir"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
72
scripts/secret_scan.sh
Normal file
72
scripts/secret_scan.sh
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Secrets Inspector - проверка безопасности секретов
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo "[secrets] Проверяем безопасность секретов..."
|
||||||
|
|
||||||
|
# Проверка 1: Vault файлы должны быть зашифрованы
|
||||||
|
echo "[secrets] Проверяем vault файлы..."
|
||||||
|
vault_files=$(find /ansible -name "*.yml" -o -name "*.yaml" | grep -E "(vault|secret)" || true)
|
||||||
|
if [ -n "$vault_files" ]; then
|
||||||
|
for file in $vault_files; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
if head -n1 "$file" | grep -q "^\$ANSIBLE_VAULT;"; then
|
||||||
|
echo "✅ $file - зашифрован"
|
||||||
|
else
|
||||||
|
echo "❌ $file - НЕ ЗАШИФРОВАН!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "ℹ️ Vault файлы не найдены"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка 2: Пароль vault не должен быть в Git
|
||||||
|
echo "[secrets] Проверяем vault пароль..."
|
||||||
|
if [ -f "/ansible/vault/.vault" ]; then
|
||||||
|
if git ls-files | grep -q "vault/.vault"; then
|
||||||
|
echo "❌ Vault пароль в Git!"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "✅ Vault пароль не в Git"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ Vault пароль не найден"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Проверка 3: Нет открытых секретов в коде
|
||||||
|
echo "[secrets] Проверяем открытые секреты..."
|
||||||
|
secret_patterns=(
|
||||||
|
"password.*=.*['\"][^'\"]{8,}['\"]"
|
||||||
|
"api_key.*=.*['\"][^'\"]{8,}['\"]"
|
||||||
|
"secret.*=.*['\"][^'\"]{8,}['\"]"
|
||||||
|
"token.*=.*['\"][^'\"]{8,}['\"]"
|
||||||
|
)
|
||||||
|
|
||||||
|
for pattern in "${secret_patterns[@]}"; do
|
||||||
|
if grep -r -E "$pattern" /ansible --exclude-dir=.git --exclude="*.encrypted" --exclude="vault/.vault" 2>/dev/null; then
|
||||||
|
echo "❌ Найдены открытые секреты в коде!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ Открытые секреты не найдены"
|
||||||
|
|
||||||
|
# Проверка 4: Права доступа к vault файлам
|
||||||
|
echo "[secrets] Проверяем права доступа..."
|
||||||
|
if [ -f "/ansible/vault/.vault" ]; then
|
||||||
|
perms=$(stat -c "%a" "/ansible/vault/.vault")
|
||||||
|
if [ "$perms" != "600" ]; then
|
||||||
|
echo "❌ Vault пароль имеет неправильные права: $perms (должно быть 600)"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "✅ Vault пароль имеет правильные права: $perms"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Все проверки безопасности пройдены!"
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
OUT_DIR="snapshots"
|
OUT_DIR="/ansible/snapshots"
|
||||||
mkdir -p "$OUT_DIR"
|
mkdir -p "$OUT_DIR"
|
||||||
|
|
||||||
# Найти все контейнеры лаборатории
|
# Найти все контейнеры лаборатории
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
test
|
|
||||||
45
vault/secrets.yml
Normal file
45
vault/secrets.yml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
|
36616532373361616262643163656363656533663465653636646264376666313838386336643263
|
||||||
|
6433626166306136653962646263643632353138396332380a393161333663333331303266373034
|
||||||
|
36366665626365323036353931353965343239613164393931636234396134343963333065373134
|
||||||
|
3661666162386339640a373639383233376263613164326234323064613030636336366239393339
|
||||||
|
37343565613837626236386339303565386531626238646139303266656264623031633663373236
|
||||||
|
66663362393663633363646664303737343134396465323663376332363864313834643533663539
|
||||||
|
65643636613437326535396335373333303938353837663632363238393061633431666334313733
|
||||||
|
37373730383732623632616261626335656534316230356638643266663965323139373239623238
|
||||||
|
38303831633436313439386639323535363036313539396361353462616338383633636432373338
|
||||||
|
64363035343337336233313534306166326438303031653034663639353663396435393531666238
|
||||||
|
66326331663933353463373338393765653434313565306162613135333864633131633035623966
|
||||||
|
62643239643138323532346165393961363637363864623738323633633862313966346238333464
|
||||||
|
66363761306637666230373533356432333238633432383966316134353630643432643133303537
|
||||||
|
31663863303163363433346166363232623737383230613637313435393737353361396565636233
|
||||||
|
62313835336438663438656536643339353738326539626530383834633061633939633436373262
|
||||||
|
35656234616538363936353162313436653764303337623032316561373866376266663165653765
|
||||||
|
31646533666536376366616638336232313830323330316564343864396130623633333530376665
|
||||||
|
36313365316664656331613863663162323161643732323963303561373765393165623834373766
|
||||||
|
61383065376534396630333930633666633034303232366637316237373863643065306439643230
|
||||||
|
37626533373666626263313538613864326539646631306166306637373134366331396138393931
|
||||||
|
63326139306538313461383434343362313232353265373337326336666639393665396166626262
|
||||||
|
66353832396665333362643837666438613035323164326361396130643766396434366231616632
|
||||||
|
31383834616530376634643632376634366637336665393963326239643237363564636134336333
|
||||||
|
35643536653532343466643932336163643138636662316530663464353639363436663634326432
|
||||||
|
34376332323936336134396338623835633562343830666431616163643239653132343236303537
|
||||||
|
65663736333562396430643038313961323365616533323166633663326663633464323934353739
|
||||||
|
38656138323533346239356432663563336432396463626331623230303864326434616161326233
|
||||||
|
33303363376164333839333435386339386139633739333435346530633663313261633631383835
|
||||||
|
63623436356462316362663965366631383663646333356536643632363566636163343264343063
|
||||||
|
61316664656635363564303135343466393533383164643432656334313338663033306261396136
|
||||||
|
62333962393039383831626537346566663566356266633364666362623462313166333661656362
|
||||||
|
34323062393334343063343038646432336239383334303332313166383461663336656465393137
|
||||||
|
33333364633033633765373432393038396231616139343665306335663231646264663537343637
|
||||||
|
37393537613338343736613062343963313963656164383734303439376265323135333239363361
|
||||||
|
30616539363364353333653039613036623966653266333130306634623236636337666437363534
|
||||||
|
61336130626261376334303636343231333666386132666365623365613735633433343133663031
|
||||||
|
36366338386630343766363464343536613761653464633138353238313462613265383135383766
|
||||||
|
35356265316535366231333664346337383266383064363731363437613732306231323339636631
|
||||||
|
64306535663264316561356531323864303866623331343635663836306333396634306333383764
|
||||||
|
62343439323433613963343033303535653762663633633130356235393437626164343432626332
|
||||||
|
33636136636562643166643461343135643265626434656136336236366131326462303036613139
|
||||||
|
61306263386532343365313539306339636238613062373162333036306166363933616664373962
|
||||||
|
32383036613961323633366431356434633839333864623565396265366365326162396434653233
|
||||||
|
35346237363764653866
|
||||||
Reference in New Issue
Block a user