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]
|
||||
- var-naming[no-role-prefix]
|
||||
- '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.
|
||||
.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
|
||||
|
||||
|
||||
174
README.md
174
README.md
@@ -11,16 +11,18 @@
|
||||
|
||||
### 🎯 Основные возможности
|
||||
|
||||
- **Динамическое создание инфраструктуры** - автоматическое развертывание Docker контейнеров и Kind кластеров
|
||||
- **Поддержка различных ОС** - тестирование ролей на Debian и RHEL-подобных системах
|
||||
- **Docker-in-Docker (DinD)** - изолированные Docker-среды внутри контейнеров
|
||||
- **Docker-outside-of-Docker (DOoD)** - использование Docker-демона хоста из контейнера
|
||||
- **Kubernetes кластеры** - полноценные Kind кластеры с аддонами
|
||||
- **Service Mesh** - Istio с Kiali для визуализации
|
||||
- **Мониторинг** - Prometheus, Grafana, Jaeger для полной наблюдаемости
|
||||
- **21 готовый пресет** - от простых до экстремально сложных сценариев
|
||||
- **HTML отчеты** - красивые отчеты о результатах тестирования
|
||||
- **Снапшоты** - сохранение и восстановление состояния лаборатории
|
||||
- **🎯 Интерактивный интерфейс** - полноценный TUI с whiptail для удобного управления
|
||||
- **🚀 Автоматическая инициализация** - настройка проекта при первом запуске
|
||||
- **🧪 Универсальная лаборатория** - автоматическое развертывание Docker контейнеров и Kind кластеров
|
||||
- **☸️ Kubernetes поддержка** - полноценные Kind кластеры с аддонами
|
||||
- **📋 21 готовый пресет** - от простых до экстремально сложных сценариев
|
||||
- **🎭 Управление ролями** - интерактивное создание и тестирование Ansible ролей
|
||||
- **🔐 Безопасность vault** - автоматическое управление секретами
|
||||
- **📊 Красивые отчеты** - HTML отчеты о результатах тестирования
|
||||
- **🔧 CI/CD команды** - автоматизированное тестирование, линтинг и развертывание
|
||||
- **📸 Снапшоты** - сохранение и восстановление состояния лаборатории
|
||||
- **🌐 Service Mesh** - Istio с Kiali для визуализации
|
||||
- **📈 Мониторинг** - Prometheus, Grafana для полной наблюдаемости
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
@@ -38,10 +40,15 @@
|
||||
git clone https://github.com/your-username/ansible-template.git
|
||||
cd ansible-template
|
||||
|
||||
# Создать необходимые файлы
|
||||
echo "your-vault-password" > vault-password.txt
|
||||
mkdir -p roles
|
||||
mkdir -p files/playbooks
|
||||
# Запустить проект (автоматическая инициализация)
|
||||
make
|
||||
# При первом запуске автоматически запустится интерактивная настройка:
|
||||
# - Название проекта, версия, автор, сайт
|
||||
# - Настройки Docker (образ, сеть)
|
||||
# - Настройки лаборатории (сценарий, пресет)
|
||||
# - Настройки Kubernetes (контекст, версии Istio/Kind)
|
||||
# - Пути к папкам и файлам
|
||||
# После настройки откроется главное меню
|
||||
|
||||
# Установить pre-commit хуки (опционально)
|
||||
make pre-commit-install
|
||||
@@ -50,16 +57,138 @@ make pre-commit-install
|
||||
### Первый запуск
|
||||
|
||||
```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/presets.md)** - описание всех 21 готового пресета
|
||||
- **[Роли](docs/roles.md)** - структура и создание Ansible ролей
|
||||
- **[CI/CD](ci-cd/README.md)** - настройка CI/CD для Ansible ролей
|
||||
|
||||
### Дополнительные материалы
|
||||
|
||||
@@ -332,6 +462,11 @@ ansible-template/
|
||||
│ ├── examples.md # Примеры использования
|
||||
│ ├── troubleshooting.md # Решение проблем
|
||||
│ └── 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 конфигурация
|
||||
│ ├── universal/ # Универсальный сценарий
|
||||
│ │ ├── molecule.yml # Конфигурация Molecule
|
||||
@@ -352,11 +487,14 @@ ansible-template/
|
||||
│ └── requirements.yml # Ansible коллекции
|
||||
├── roles/ # Ansible роли
|
||||
│ └── your_role/ # Ваши роли
|
||||
├── scripts/ # Скрипты
|
||||
├── scripts/ # Скрипты (запускаются через Docker)
|
||||
│ ├── report_html.py # Генератор HTML отчетов
|
||||
│ ├── snapshot.sh # Создание снапшотов
|
||||
│ ├── restore.sh # Восстановление снапшотов
|
||||
│ └── cleanup.sh # Очистка лаборатории
|
||||
├── vault/ # Секреты и пароли
|
||||
│ ├── .vault # Пароль для Ansible Vault
|
||||
│ └── secrets.yml # Зашифрованные секреты
|
||||
└── .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
|
||||
environment:
|
||||
DOCKER_HOST: unix:///var/run/docker.sock
|
||||
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault-password.txt
|
||||
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault/.vault
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./molecule:/ansible/molecule
|
||||
- ./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
|
||||
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
|
||||
```
|
||||
|
||||
### 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 команды
|
||||
|
||||
```bash
|
||||
@@ -432,10 +476,10 @@ python3 scripts/report_html.py <input.json> <output.html>
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Создание снапшотов лаборатории
|
||||
# Создание снапшотов лаборатории (запускается через Docker)
|
||||
|
||||
# Параметры
|
||||
OUT_DIR="snapshots"
|
||||
OUT_DIR="/ansible/snapshots"
|
||||
|
||||
# Создать директорию
|
||||
mkdir -p "$OUT_DIR"
|
||||
@@ -457,10 +501,10 @@ done
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Восстановление из снапшотов
|
||||
# Восстановление из снапшотов (запускается через Docker)
|
||||
|
||||
# Параметры
|
||||
IN_DIR="snapshots"
|
||||
IN_DIR="/ansible/snapshots"
|
||||
|
||||
# Проверить директорию
|
||||
[ -d "$IN_DIR" ] || { echo "No snapshots dir"; exit 1; }
|
||||
@@ -480,7 +524,7 @@ done
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Очистка лаборатории
|
||||
# Очистка лаборатории (запускается через Docker)
|
||||
|
||||
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
|
||||
# Создать роль с помощью ansible-galaxy
|
||||
ansible-galaxy init your_role
|
||||
|
||||
# Создать роль в определенной директории
|
||||
ansible-galaxy init your_role --init-path roles/
|
||||
make role create NAME=my-role
|
||||
```
|
||||
|
||||
### Ручное создание
|
||||
**Что происходит:**
|
||||
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
|
||||
package:
|
||||
name: "{{ package_name }}"
|
||||
# Задачи для Debian/Ubuntu семейства
|
||||
|
||||
- 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
|
||||
|
||||
- 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
|
||||
when: ansible_os_family == 'Debian'
|
||||
```
|
||||
|
||||
## Использование роли
|
||||
|
||||
### В playbook
|
||||
|
||||
#### RHEL/CentOS (tasks/redhat.yml)
|
||||
```yaml
|
||||
---
|
||||
- name: Deploy web server
|
||||
hosts: webservers
|
||||
become: true
|
||||
roles:
|
||||
- your_role
|
||||
# Задачи для RHEL/CentOS семейства
|
||||
|
||||
- name: Update yum cache (RHEL)
|
||||
yum:
|
||||
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
|
||||
---
|
||||
- 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"
|
||||
```
|
||||
|
||||
## Тестирование роли
|
||||
|
||||
### Создание тестов
|
||||
### Создание playbook
|
||||
|
||||
```bash
|
||||
# Создать тестовый playbook
|
||||
cat > roles/your_role/tests/test.yml << EOF
|
||||
make role playbook NAME=my-role
|
||||
# Выберите: create
|
||||
# Введите имя: deploy
|
||||
```
|
||||
|
||||
**Создается файл:** `roles/my-role/playbooks/deploy.yml`
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Test role
|
||||
# Playbook: deploy для роли my-role
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: deploy
|
||||
hosts: all
|
||||
become: true
|
||||
roles:
|
||||
- your_role
|
||||
EOF
|
||||
gather_facts: true
|
||||
vars:
|
||||
# Переменные для роли my-role
|
||||
my_role_enabled: true
|
||||
|
||||
# Создать инвентарь для тестов
|
||||
cat > roles/your_role/tests/inventory << EOF
|
||||
[webservers]
|
||||
localhost ansible_connection=local
|
||||
EOF
|
||||
pre_tasks:
|
||||
- name: Display OS information
|
||||
debug:
|
||||
msg: "OS Family: {{ ansible_os_family }}, OS: {{ ansible_distribution }} {{ ansible_distribution_version }}"
|
||||
|
||||
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
|
||||
# Запустить тест роли
|
||||
ansible-playbook -i roles/your_role/tests/inventory roles/your_role/tests/test.yml
|
||||
make role playbook NAME=my-role
|
||||
# Выберите: list
|
||||
```
|
||||
|
||||
# Запустить тест с Molecule
|
||||
molecule test
|
||||
### Редактирование playbook
|
||||
|
||||
```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
|
||||
---
|
||||
# tasks/main.yml
|
||||
- name: Install package
|
||||
package:
|
||||
name: "{{ package_name }}"
|
||||
state: present
|
||||
notify: restart service
|
||||
### 2. Структура роли
|
||||
- **`tasks/main.yml`** - общая логика и включение OS-специфичных задач
|
||||
- **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
|
||||
- **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
|
||||
- **`handlers`** - для перезапуска сервисов
|
||||
- **`templates`** - для конфигурационных файлов
|
||||
- **`files`** - для статических файлов
|
||||
|
||||
- name: Configure service
|
||||
template:
|
||||
src: config.j2
|
||||
dest: /etc/service/config.conf
|
||||
notify: restart service
|
||||
### 3. Переменные
|
||||
- **`defaults/main.yml`** - значения по умолчанию
|
||||
- **`vars/main.yml`** - внутренние переменные роли
|
||||
- **Используйте префиксы** для переменных роли
|
||||
- **Создавайте OS-специфичные переменные** при необходимости
|
||||
|
||||
- name: Start service
|
||||
service:
|
||||
name: "{{ service_name }}"
|
||||
state: started
|
||||
enabled: true
|
||||
```
|
||||
### 4. Playbooks
|
||||
- **`gather_facts: true`** - всегда собирайте информацию об ОС
|
||||
- **`pre_tasks`** - отображайте информацию об ОС
|
||||
- **`post_tasks`** - проверяйте успешное развертывание
|
||||
- **Используйте переменные** для настройки
|
||||
|
||||
### Обработчики
|
||||
|
||||
```yaml
|
||||
---
|
||||
# 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
|
||||
```
|
||||
### 5. Тестирование
|
||||
- **`make role test`** - проверка роли
|
||||
- **Тестируйте на разных ОС** - Ubuntu, CentOS, RHEL
|
||||
- **Создавайте тесты** в папке tests/
|
||||
- **Проверяйте идемпотентность** - повторный запуск не должен изменять систему
|
||||
|
||||
## Интеграция с лабораторией
|
||||
|
||||
### Использование в пресетах
|
||||
### Автоматическое добавление в систему
|
||||
|
||||
При создании роли через `make role create`:
|
||||
1. Роль автоматически добавляется в `deploy/tasks/main.yml`
|
||||
2. Создается переменная `{role_name}_enabled: true`
|
||||
3. Обновляется `site.yml` с новой ролью
|
||||
|
||||
### Использование в playbooks
|
||||
|
||||
```yaml
|
||||
---
|
||||
# molecule/presets/webapp.yml
|
||||
hosts:
|
||||
- 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
|
||||
- name: Deploy my-role
|
||||
hosts: all
|
||||
become: true
|
||||
roles:
|
||||
- nginx
|
||||
- ssl
|
||||
|
||||
- name: Deploy databases
|
||||
hosts: databases
|
||||
become: true
|
||||
roles:
|
||||
- postgresql
|
||||
- backup
|
||||
|
||||
- name: Deploy monitoring
|
||||
hosts: monitoring
|
||||
become: true
|
||||
roles:
|
||||
- prometheus
|
||||
- grafana
|
||||
- role: my-role
|
||||
vars:
|
||||
my_role_enabled: true
|
||||
my_role_package: custom-package
|
||||
```
|
||||
|
||||
### Тестирование с различными пресетами
|
||||
## Автор
|
||||
|
||||
```bash
|
||||
# Тестирование с минимальным пресетом
|
||||
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).
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
73
env.example
73
env.example
@@ -1,16 +1,69 @@
|
||||
# Переменные окружения для универсальной лаборатории
|
||||
# =============================================================================
|
||||
# Ansible Template Environment Configuration
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: 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 уведомления (опционально)
|
||||
TG_TOKEN=your_telegram_bot_token
|
||||
TG_CHAT=your_telegram_chat_id
|
||||
# Docker настройки
|
||||
DOCKER_IMAGE=quay.io/ansible/creator-ee:latest
|
||||
DOCKER_NETWORK=labnet
|
||||
DOCKER_COMPOSE=docker compose
|
||||
|
||||
# Пауза для ручной проверки (минуты)
|
||||
LAB_PAUSE_MINUTES=10
|
||||
|
||||
# Сценарий Molecule
|
||||
# Molecule настройки
|
||||
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
|
||||
state: present
|
||||
|
||||
# Под каждую группу — свои роли. Подставь свои имена.
|
||||
- name: ETCD
|
||||
hosts: etcd
|
||||
# Развертывание инфраструктуры
|
||||
- name: Deploy infrastructure
|
||||
hosts: all
|
||||
become: true
|
||||
roles:
|
||||
# - role: your_role_etcd
|
||||
tasks:
|
||||
- name: ETCD placeholder
|
||||
- name: Infrastructure placeholder
|
||||
debug:
|
||||
msg: "ETCD группа готова для настройки"
|
||||
|
||||
- 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 }}"
|
||||
msg: "Инфраструктура готова для настройки"
|
||||
|
||||
@@ -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
|
||||
|
||||
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: controller
|
||||
group: controllers
|
||||
- name: host1
|
||||
family: debian
|
||||
publish:
|
||||
- "8080:80"
|
||||
groups: [all]
|
||||
|
||||
- name: webserver
|
||||
group: webservers
|
||||
family: rhel
|
||||
publish:
|
||||
- "80:80"
|
||||
|
||||
- name: database
|
||||
group: databases
|
||||
family: debian
|
||||
publish:
|
||||
- "5432:5432"
|
||||
features:
|
||||
docker: true
|
||||
dind: false
|
||||
k8s: false
|
||||
istio: false
|
||||
monitoring: false
|
||||
chaos: false
|
||||
|
||||
@@ -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
|
||||
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:
|
||||
- name: Install collections in controller
|
||||
community.docker.docker_container_exec:
|
||||
container: ansible-controller
|
||||
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)
|
||||
community.docker.docker_container_exec:
|
||||
container: ansible-controller
|
||||
command: >
|
||||
bash -lc "
|
||||
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 }}"
|
||||
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 (если определены) ----------
|
||||
- name: Create kind cluster configs
|
||||
community.docker.docker_container_exec:
|
||||
|
||||
@@ -24,10 +24,14 @@ provisioner:
|
||||
name: ansible
|
||||
config_options:
|
||||
defaults:
|
||||
stdout_callback: default
|
||||
stdout_callback: yaml
|
||||
callbacks_enabled: profile_tasks
|
||||
env:
|
||||
ANSIBLE_STDOUT_CALLBACK: default
|
||||
ANSIBLE_STDOUT_CALLBACK: yaml
|
||||
ANSIBLE_CALLBACKS_ENABLED: profile_tasks
|
||||
inventory:
|
||||
links:
|
||||
hosts: "${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.yml"
|
||||
|
||||
dependency:
|
||||
name: galaxy
|
||||
|
||||
@@ -27,9 +27,15 @@
|
||||
command: >
|
||||
bash -lc "
|
||||
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
|
||||
|
||||
- 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 ---
|
||||
- name: Helm nginx install & Ingress & Toolbox (per cluster)
|
||||
community.docker.docker_container_exec:
|
||||
@@ -265,6 +271,27 @@
|
||||
'
|
||||
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 ---
|
||||
- name: Final summary
|
||||
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
|
||||
|
||||
IN_DIR="snapshots"
|
||||
IN_DIR="/ansible/snapshots"
|
||||
if [ ! -d "$IN_DIR" ]; then
|
||||
echo "No snapshots dir"
|
||||
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
|
||||
|
||||
OUT_DIR="snapshots"
|
||||
OUT_DIR="/ansible/snapshots"
|
||||
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