Compare commits

...

30 Commits

Author SHA1 Message Date
3550678b0c cleanup: Удалены тестовые файлы после тестирования функций удаления
- Удалены файлы тестовой роли test-role
- Очистка после тестирования функций delete
- Проект готов к использованию

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 18:01:56 +03:00
f12bbc626d feat: Добавлены функции удаления для роли, плейбука и пресета
- Добавлена команда 'make role delete NAME=role-name'
- Добавлена команда 'make preset delete NAME=preset-name'
- Добавлена команда 'role playbook delete' для удаления playbook
- Обновлены описания команд в help

Новые функции:
- role delete: удаление роли с проверкой существования
- preset delete: удаление пресета с проверкой существования
- playbook delete: удаление playbook из роли

Обновленные списки команд:
- role: list|create|edit|test|lint|deploy|delete|info|playbook
- preset: list|create|edit|test|copy|delete
- playbook: create|list|edit|run|delete

Протестировано:
- Удаление роли - работает корректно
- Удаление пресета - работает корректно
- Все команды проверены и обновлены

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 17:14:34 +03:00
2d8d770b3f fix: Исправлена команда создания роли
- Создан исправленный скрипт create_role_fixed.sh
- Исправлены проблемы с переменными в шаблонах ролей
- Убраны пустые переменные типа {{  }}
- Исправлены имена переменных с правильным экранированием
- Создана тестовая роль test-role для проверки

Проблемы в старой команде:
- Неправильное экранирование переменных ROLE_NAME
- Пустые переменные в шаблонах
- Неправильные имена переменных в defaults
- Проблемы с заменой плейсхолдеров

Исправления:
- Правильное экранирование переменных
- Корректные переменные в шаблонах
- Правильные имена переменных
- Рабочая замена плейсхолдеров

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 16:35:42 +03:00
4f9b3029cc fix: Исправлены команды и убраны цветовые коды из ошибок
- Добавлена команда kubeconfig в описание команды kube
- Убраны цветовые коды из всех сообщений об ошибках
- Исправлены списки доступных команд

Изменения:
- kube: добавлен kubeconfig в описание и список команд
- lab: убраны цветовые коды из ошибок
- kube: убраны цветовые коды из ошибок
- preset: убраны цветовые коды из ошибок
- role: убраны цветовые коды из ошибок
- vault: убраны цветовые коды из ошибок
- git: убраны цветовые коды из ошибок
- docker: убраны цветовые коды из ошибок

Проблема:
В whiptail диалогах отображались ANSI escape-коды
из сообщений об ошибках команд.

Решение:
Убраны все цветовые коды из сообщений об ошибках
для чистого отображения в whiptail диалогах.

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 16:12:56 +03:00
8dd066f752 fix: Убраны ANSI escape-коды из команд списков
- Убраны цветовые коды из команды 'preset list'
- Убраны цветовые коды из команды 'role list'
- Убраны цветовые коды из команды 'vault show'
- Убраны цветовые коды из команды 'lint'
- Исправлено регулярное выражение в 'role list'

Изменения:
- preset list: убраны $(CYAN), $(GREEN), $(RESET), emoji
- role list: убраны $(CYAN), $(YELLOW), $(RESET), emoji
- vault show: убраны $(BLUE), $(RESET), emoji
- lint: убраны $(YELLOW), $(GREEN), $(RESET), emoji
- Исправлен grep pattern в role list

Проблема:
При выводе списков через whiptail появлялись ANSI escape-коды
типа ^[[0;36m, которые некорректно отображались в диалогах.

Решение:
Убраны все цветовые коды из команд, которые используются
в whiptail диалогах для чистого отображения текста.

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:53:47 +03:00
102003bb32 feat: Убраны emoji из whiptail диалогов и обновлена документация
- Убраны все emoji из whiptail диалогов для лучшей совместимости
- Обновлен README.md с новыми возможностями
- Добавлен раздел с интерактивным интерфейсом
- Добавлен раздел с автоматической инициализацией
- Добавлен раздел с CI/CD командами
- Добавлен раздел с управлением ролями

Изменения в whiptail:
- Убраны emoji из заголовков диалогов
- Убраны emoji из опций меню
- Сохранена функциональность всех диалогов
- Улучшена совместимость с разными терминалами

Обновления документации:
- Добавлен раздел 'Новые возможности'
- Описание интерактивного интерфейса
- Описание автоматической инициализации
- Описание CI/CD команд
- Описание управления ролями
- Обновлен быстрый старт

Преимущества:
- Лучшая совместимость с терминалами
- Чистый интерфейс whiptail
- Обновленная документация
- Сохранены цвета в консольном выводе

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:47:11 +03:00
c59edae00d feat: Добавлены CI/CD команды для автоматизированного тестирования
- Добавлены неинтерактивные CI/CD команды для автоматизации
- Команды для тестирования, линтинга, развертывания и очистки
- Команды для проверки безопасности и валидации проекта
- Команды для генерации отчетов

CI/CD команды:
- ci-test: Запуск всех тестов (лаборатория + роли)
- ci-lint: Проверка синтаксиса (YAML + Ansible)
- ci-deploy: Развертывание в лаборатории
- ci-cleanup: Очистка после тестов
- ci-full: Полный цикл (lint + test + deploy)
- ci-security: Проверка безопасности (vault + секреты)
- ci-validate: Валидация проекта (структура + зависимости)
- ci-report: Генерация отчета
- ci-all: Все проверки

Особенности:
- Неинтерактивные команды для CI/CD пайплайнов
- Цветной вывод для лучшей читаемости
- Обработка ошибок с exit codes
- Проверка зависимостей и структуры проекта
- Устойчивость к ошибкам ansible-lint
- Автоматическая очистка после тестов

Использование в CI/CD:
- make ci-validate - проверка готовности проекта
- make ci-lint - проверка синтаксиса
- make ci-test - запуск тестов
- make ci-deploy - развертывание
- make ci-security - проверка безопасности
- make ci-report - генерация отчета
- make ci-cleanup - очистка после тестов

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:42:08 +03:00
a9fcee13ef feat: Убраны emoji из whiptail и добавлена проверка инициализации в команду по умолчанию
- Убраны все emoji из whiptail диалогов для лучшей совместимости
- Добавлена команда check-init-and-menu как команда по умолчанию
- Автоматическая проверка инициализации при запуске make
- Сохранены цвета в консольном выводе для лучшей читаемости

Изменения в whiptail:
- Убраны emoji из заголовков диалогов
- Убраны emoji из сообщений
- Сохранена функциональность всех диалогов
- Улучшена совместимость с разными терминалами

Команда по умолчанию:
- make без параметров теперь проверяет инициализацию
- Автоматический запуск инициализации при первом запуске
- Переход к главному меню после инициализации
- Нет повторной инициализации после настройки

Преимущества:
- Лучшая совместимость с терминалами
- Автоматическая инициализация при первом запуске
- Сохранены цвета в консольном выводе
- Упрощенный интерфейс whiptail

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:40:02 +03:00
1909746098 feat: Добавлена автоматическая инициализация проекта при первом запуске
- Добавлена проверка инициализации проекта (check-init)
- Автоматический запуск инициализации при первом запуске
- Интерактивная настройка всех параметров проекта
- Создание файлов .env, vault/.vault, molecule/presets/minimal.yml
- Проверка наличия необходимых файлов и папок

Проверка инициализации:
- Проверка наличия .env файла
- Проверка наличия vault/.vault файла
- Проверка наличия папки molecule/presets
- Автоматический запуск инициализации при отсутствии файлов

Интерактивная инициализация:
- Настройка основных параметров проекта (название, версия, автор, сайт)
- Настройка Docker (образ, сеть)
- Настройка лаборатории (сценарий, пресет)
- Настройка Kubernetes (контекст, версии Istio/Kind)
- Настройка путей (папка ролей, файл vault)
- Создание файла .env с всеми настройками
- Создание vault файлов
- Создание минимального пресета лаборатории
- Создание необходимых папок

Преимущества:
- Автоматическая инициализация при первом запуске
- Интерактивная настройка всех параметров
- Значения по умолчанию для быстрой настройки
- Создание всех необходимых файлов и папок
- Проверка инициализации при каждом запуске
- Нет повторной инициализации после настройки

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:36:48 +03:00
f45ae8b64e feat: Убраны отдельные пункты 'interactive' и все операции сделаны через whiptail диалоги
- Убран пункт 'interactive' из главного меню
- Убран пункт 'interactive' из меню пресетов
- Убран пункт 'interactive' из меню ролей
- Создание пресетов теперь полностью интерактивное через whiptail
- Создание ролей теперь полностью интерактивное через whiptail

Создание пресетов через whiptail:
- Интерактивный ввод имени пресета
- Интерактивный ввод описания
- Выбор количества хостов
- Выбор семейства ОС (debian/redhat/mixed)
- Выбор функций (docker, dind, k8s, istio, monitoring, chaos)
- Автоматическая генерация YAML файла пресета
- Информативное сообщение об успехе

Создание ролей через whiptail:
- Интерактивный ввод имени роли
- Интерактивный ввод описания
- Выбор пакета для установки
- Выбор сервиса для управления
- Выбор поддерживаемых платформ (debian/redhat)
- Ввод тегов роли
- Автоматическая генерация полной структуры роли
- Создание универсальных задач для Debian и RHEL
- Создание handlers, defaults, meta файлов
- Информативное сообщение об успехе

Преимущества:
- Все операции через единый интерфейс whiptail
- Нет дублирования функциональности
- Интерактивный ввод всех параметров
- Автоматическая генерация файлов
- Универсальные роли для разных ОС
- Информативные сообщения об успехе

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:33:53 +03:00
3fe419f38e feat: Добавлена обработка ошибок для всех интерактивных меню
- Добавлена обработка ошибок для меню лаборатории
- Добавлена обработка ошибок для меню Kubernetes
- Добавлена обработка ошибок для меню пресетов
- Добавлена обработка ошибок для меню ролей
- Добавлены интерактивные диалоги для ввода параметров
- Добавлены подтверждения для опасных операций
- Добавлены информативные сообщения об успехе/ошибке

Обработка ошибок включает:
- Проверка наличия данных (логи, статус, списки)
- Интерактивный ввод параметров через whiptail
- Подтверждение опасных операций (destroy)
- Информативные сообщения об успехе/ошибке
- Прокручиваемые окна для длинных выводов
- Предупреждения при отсутствии данных

Меню лаборатории:
-  Успех/ Ошибка для всех операций
- ⚠️ Подтверждение для destroy
- 📊 Статус с проверкой наличия данных
- 📝 Логи с прокруткой

Меню Kubernetes:
- Интерактивный ввод команд и параметров
- Проверка доступности кластера
- Информативные сообщения с URL

Меню пресетов/ролей:
- Интерактивный ввод имен
- Проверка существования файлов
- Отображение ошибок синтаксиса
- Подтверждение операций

Преимущества:
- Пользователь всегда знает результат операции
- Нет пустых экранов при отсутствии данных
- Интерактивный ввод параметров
- Безопасность через подтверждения
- Удобство использования

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:27:33 +03:00
c8dbc5356f feat: Полноценный интерактивный интерфейс с whiptail
- Создано главное интерактивное меню с 13 разделами
- Добавлено интерактивное меню помощи с 6 подразделами
- Команда по умолчанию (make) теперь запускает главное меню
- Создано интерактивное создание playbooks
- Исправлены ошибки с return/exit в меню

Интерактивные меню:
- 🧪 Управление лабораторией (8 команд)
- ☸️  Управление Kubernetes (7 команд)
- 📋 Управление пресетами (6 команд)
- 🎭 Управление ролями (8 команд)
- 🔐 Управление vault (5 команд)
- 📊 Генерация отчетов (4 команды)
- 🔍 Проверка синтаксиса (5 команд)
- 📸 Снимки лаборатории (3 команды)
- 🧹 Очистка данных (5 команд)
- 🎯 Интерактивные команды (3 команды)
- 📚 Документация (6 разделов)
-  Помощь и справка (6 разделов)

Меню помощи включает:
- 📋 Обзор проекта
- 🚀 Быстрый старт
- ⌨️  Список команд
- 💡 Примеры использования
- 🔧 Решение проблем
- ℹ️  О проекте

Преимущества:
- Полноценный TUI интерфейс
- Навигация через меню
- Красивые диалоги с эмодзи
- Подробная справка
- Минимум ручного труда
- Удобство использования

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:22:51 +03:00
82c532fcf1 feat: Интерактивные команды с whiptail для максимального user-friendliness
- Добавлена автоматическая проверка и установка whiptail для разных ОС
- Создана интерактивная команда preset-create-interactive с whiptail диалогами
- Создана интерактивная команда role-create-interactive с whiptail диалогами
- Обновлена help команда с новыми интерактивными командами

Интерактивные возможности:
- Диалоговые окна для ввода параметров
- Выбор из списков (чекбоксы, меню)
- Автоматическая установка whiptail для macOS, Ubuntu, CentOS, RHEL, Arch, SUSE
- Красивые диалоги с цветовой подсветкой
- Возможность отмены на любом этапе

Команды:
- make preset-create-interactive - интерактивное создание пресета
- make role-create-interactive - интерактивное создание роли
- make check-whiptail - проверка и установка whiptail

Преимущества:
- Максимально user-friendly интерфейс
- Минимум ручного труда
- Красивые диалоги
- Автоматическая установка зависимостей
- Поддержка всех основных ОС

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:16:02 +03:00
eb61afb35a feat: Интерактивная инициализация проекта через make init
- Добавлена интерактивная команда setup-env-interactive
- make init теперь запрашивает настройки проекта в диалоговом режиме
- Обновлена документация в README.md
- Убрано упоминание о создании vault-password.txt вручную

Интерактивная настройка включает:
- Основные настройки: название, версия, автор, сайт
- Настройки Docker: образ, сеть
- Настройки лаборатории: сценарий, пресет
- Настройки Kubernetes: контекст, версии Istio/Kind
- Пути к папкам и файлам

Преимущества:
- Удобная настройка проекта при первом запуске
- Все необходимые файлы создаются автоматически
- Пользователь может настроить проект под свои нужды
- Сохранение настроек в .env файле

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:07:13 +03:00
a88c85d164 feat: Создана папка roles/ для Ansible ролей
- Создана папка roles/ с правильной структурой
- Добавлен .gitkeep для сохранения папки в git
- Создан README.md с документацией по работе с ролями
- Настроена структура для универсальных ролей

Структура папки roles:
- roles/.gitkeep - для сохранения папки в git
- roles/README.md - документация по работе с ролями

Документация в README.md:
- Инструкции по созданию ролей
- Структура универсальной роли
- Поддерживаемые ОС (RHEL и Debian семейства)
- Команды управления ролями
- Ссылки на подробную документацию

Преимущества:
- Четкая структура для ролей
- Документация по использованию
- Готовность к созданию ролей
- Сохранение папки в git
- Интеграция с make role командами

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:03:04 +03:00
2ee52d22ef feat: Обновлен .gitignore для исключения служебных файлов
- Добавлены правила для игнорирования vault файлов (.vault, vault/.vault, vault-password.txt)
- Добавлены правила для игнорирования IDE директорий (.cursor/, .idea/, .vscode/)
- Добавлены правила для игнорирования временных файлов (*.log, *.tmp, *.swp, *.swo, *~)
- Добавлены правила для игнорирования отчетов и снимков (reports/*.html, reports/*.json, snapshots/*.tar.gz)
- Удалены из git индекса файлы vault/.vault и .cursor/commands/docs.md

Новые правила в .gitignore:
- 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: reports/*.html, reports/*.json, snapshots/*.tar.gz, snapshots/*.zip
- Temporary files: *.retry, *.backup, *.bak

Преимущества:
- Исключены служебные файлы из репозитория
- Защищены пароли vault от случайного коммита
- Исключены IDE настройки и временные файлы
- Чистый репозиторий без мусорных файлов

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 15:01:58 +03:00
f48ed43bcc feat: Очистка проекта и настройка vault
- Удалена папка default/ (мусорная директория)
- Очищены vault файлы до состояния чистого репозитория
- Создан чистый vault/secrets.yml с примерами
- Настроен vault/.vault с паролем по умолчанию
- Зашифрован vault/secrets.yml

Изменения:
- Удалена папка default/ со старой структурой роли
- Создан чистый vault/secrets.yml с примерами секретов
- Настроен vault/.vault с паролем 'ansible-vault-password'
- Зашифрован vault/secrets.yml для безопасности

Структура vault:
- vault/.vault - пароль для vault
- vault/secrets.yml - зашифрованные секреты
- vault/.gitkeep - для сохранения папки в git

Примеры секретов:
- lab_secret: 'change-me-in-production'
- test_password: 'test123'
- demo_api_key: 'demo-key-12345'

Команды для работы с vault:
- make vault show - просмотр секретов
- make vault edit - редактирование
- make vault encrypt - шифрование

Преимущества:
- Чистый репозиторий без мусорных файлов
- Готовые примеры секретов
- Безопасное хранение секретов
- Простые команды для работы

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:59:25 +03:00
b1f681fb30 feat: Добавлена поддержка универсальных ролей для RHEL и Debian
- Роли теперь создаются универсальными для RHEL и Debian семейств
- Автоматическое создание OS-специфичных задач (debian.yml, redhat.yml)
- Универсальные playbooks с поддержкой разных ОС
- Обновлена документация с примерами и лучшими практиками

Новые возможности:
- Автоматическое определение ОС через ansible_os_family
- OS-специфичные задачи в отдельных файлах
- Универсальные playbooks с pre_tasks и post_tasks
- Поддержка apt для Debian/Ubuntu и yum для RHEL/CentOS

Структура универсальной роли:
- tasks/main.yml - общая логика и включение OS-специфичных задач
- tasks/debian.yml - задачи для Debian/Ubuntu (apt, systemd)
- tasks/redhat.yml - задачи для RHEL/CentOS (yum, systemd)
- playbooks/ - универсальные playbooks с поддержкой разных ОС

Универсальные playbooks:
- gather_facts: true - сбор информации об ОС
- pre_tasks - отображение информации об ОС
- post_tasks - проверка успешного развертывания
- Переменные роли автоматически добавляются

Документация:
- Добавлен раздел 'Универсальные роли' в docs/roles.md
- Примеры задач для Debian и RHEL семейств
- Лучшие практики для универсальных ролей
- Рекомендации по тестированию на разных ОС

Преимущества:
- Автоматическое создание универсальных ролей
- Поддержка RHEL и Debian семейств из коробки
- Лучшие практики встроены в шаблоны
- Подробная документация с примерами
- Приучение к написанию универсальных ролей

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:57:11 +03:00
0eb717ad82 feat: Добавлена интерактивность и поддержка playbooks для ролей
- Улучшена команда make role create с интерактивным вводом
- Добавлена команда make role playbook для управления playbooks
- Создана папка playbooks/ в структуре роли
- Обновлена документация по работе с ролями

Новые возможности:
- Интерактивное создание роли с настройкой параметров
- Управление playbooks роли (create|list|edit|run)
- Автоматическое создание структуры с папкой playbooks
- Улучшенные метаданные роли с платформами и тегами

Интерактивные параметры при создании роли:
- Описание роли
- Основной пакет
- Сервис
- Платформы (ubuntu,centos,rhel)
- Теги для Ansible Galaxy

Команды playbooks:
- make role playbook NAME=my-role create - создать playbook
- make role playbook NAME=my-role list - список playbooks
- make role playbook NAME=my-role edit - редактировать playbook
- make role playbook NAME=my-role run - запустить playbook

Документация:
- Создан docs/roles.md с полным руководством
- Обновлен README.md с новыми командами
- Добавлены примеры использования

Преимущества:
- Полная интерактивность при создании ролей
- Удобное управление playbooks роли
- Автоматическая генерация структуры
- Подробная документация
- Интеграция с лабораторией

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:53:35 +03:00
111efd7d92 fix: Упрощена команда help в Makefile
- Убрана сложная логика фильтрации с awk
- Добавлен упрощенный список команд
- Исправлена ошибка с grep -E

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:49:33 +03:00
d6bc3f1f31 feat: Реорганизация проекта и восстановление ролей
- Восстановлены команды make role в Makefile
- Создана папка ci-cd/ для CI/CD конфигурации
- Перенесены GitLab файлы в ci-cd/
- Перенесены Dockerfile'ы в ci-cd/dockerfiles/
- Удален корневой requirements.yml
- Удалена пустая папка vars/
- Создана документация ci-cd/README.md
- Обновлен README.md с информацией о CI/CD

Изменения:
- Восстановлены команды: make role list|create|edit|test|lint|deploy|info
- Создана структура ci-cd/ с GitLab CI/CD
- Перенесены Dockerfile'ы для разных ОС
- Добавлена документация по CI/CD
- Обновлена структура проекта в README.md

Новая структура:
- ci-cd/ - CI/CD конфигурация
- ci-cd/gitlab/ - GitLab Runner
- ci-cd/dockerfiles/ - Dockerfile'ы
- ci-cd/.gitlab-ci.yml - GitLab CI/CD
- ci-cd/README.md - документация CI/CD

Преимущества:
- Организованная структура проекта
- Восстановлена функциональность ролей
- Готовые примеры CI/CD
- Документация по настройке
- Разделение ответственности

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:46:44 +03:00
a875a874e9 feat: Удалены все роли Ansible из проекта
- Удалена директория roles/ со всеми ролями
- Упрощен site.yml (убраны ссылки на роли)
- Обновлен Makefile (убраны команды для ролей)
- Удален скрипт auto-add-role.sh
- Обновлен README.md (убрана информация о ролях)

Изменения:
- Удалена роль deploy
- Удалена роль demo
- Удален скрипт auto-add-role.sh
- Упрощен site.yml до базовых задач
- Убраны команды make role из Makefile
- Обновлена документация

Теперь проект использует только playbooks:
- files/playbooks/site.yml - основной playbook
- files/playbooks/chaos.yml - chaos engineering
- files/playbooks/health.yml - health dashboard

Преимущества:
- Упрощенная архитектура
- Меньше сложности
- Прямое использование playbooks
- Легче понимать и поддерживать

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:30:57 +03:00
e6287769d6 feat: Упрощена система ролей и добавлена автоматизация
- Создана простая демо роль для тестирования
- Упрощена роль deploy (убраны сложные компоненты)
- Добавлен скрипт auto-add-role.sh для автоматического добавления ролей
- Обновлен Makefile для автоматического добавления новых ролей

Изменения в роли deploy:
- Убраны сложные компоненты (ETCD, Patroni, HAProxy)
- Добавлена демо роль для тестирования
- Упрощены переменные и задачи

Новая демо роль:
- roles/demo/ - простая роль для тестирования
- Устанавливает базовые инструменты (htop, tree, git)
- Создает демо файлы с информацией о хосте
- Легко удаляется без поломки системы

Автоматизация:
- scripts/auto-add-role.sh - автоматическое добавление ролей
- Обновление deploy/tasks/main.yml
- Обновление deploy/defaults/main.yml
- Обновление site.yml
- Автоматическое выполнение при make role create

Преимущества:
- Простота тестирования с демо ролью
- Автоматическое добавление новых ролей
- Универсальность системы
- Легкое удаление без поломки
- Модульная архитектура

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:25:27 +03:00
51c76fb859 feat: Создана роль deploy для управления инфраструктурой
- Создана полноценная роль deploy в roles/deploy/
- Перенесена логика развертывания из site.yml в роль
- Обновлен site.yml для использования роли deploy
- Добавлена поддержка условного развертывания по группам

Структура роли deploy:
- tasks/main.yml - основные задачи
- tasks/etcd.yml - развертывание ETCD
- tasks/patroni.yml - развертывание Patroni
- tasks/haproxy.yml - развертывание HAProxy
- tasks/apps.yml - развертывание приложений
- tasks/dind-stack.yml - развертывание DinD стека
- templates/haproxy.cfg.j2 - конфигурация HAProxy
- templates/docker-compose.yml.j2 - конфигурация DinD стека
- handlers/main.yml - обработчики сервисов
- defaults/main.yml - переменные по умолчанию
- vars/main.yml - переменные роли
- meta/main.yml - метаданные роли
- README.md - документация роли

Обновления в site.yml:
- Упрощен до базовой установки common tools
- Добавлена роль deploy с условным развертыванием
- Поддержка развертывания по группам (etcd, patroni, haproxy, apps)

Новые команды:
- make role info NAME=deploy - информация о роли
- make role deploy - развертывание ролей с inventory

Преимущества:
- Модульная архитектура с разделением ответственности
- Условное развертывание по группам хостов
- Переиспользуемые компоненты (ETCD, Patroni, HAProxy)
- Шаблоны для конфигурации сервисов
- Обработчики для перезапуска сервисов
- Подробная документация роли

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:18:49 +03:00
dc255d006a feat: Добавлены продвинутые фичи из dialog.txt
- YAML inventory с мультигруппами в create.yml
- Vault preflight проверки в converge.yml (шифрование/расшифровка)
- Pre_tasks с include_vars для lab preset
- Chaos Engineering playbook для тестирования отказоустойчивости
- Idempotence проверки в verify.yml
- Health Dashboard с JSON отчетом
- Secrets Inspector скрипт для проверки безопасности
- Common tools установка в site.yml

Новые команды:
- make chaos - запуск Chaos Engineering тестов
- make check-secrets - проверка безопасности секретов
- make idempotence - проверка идемпотентности

Обновления в файлах:
- molecule/universal/create.yml: добавлена генерация YAML inventory
- molecule/universal/molecule.yml: обновлен для использования YAML inventory
- molecule/universal/converge.yml: добавлены vault preflight проверки
- molecule/universal/verify.yml: добавлены idempotence и health dashboard
- files/playbooks/chaos.yml: новый Chaos Engineering playbook
- files/playbooks/site.yml: добавлены common tools
- scripts/secret_scan.sh: новый Secrets Inspector
- Makefile: добавлены новые команды
- README.md: обновлена документация

Преимущества:
- Мультигруппы в YAML inventory для сложных конфигураций
- Автоматическая проверка и нормализация vault файлов
- Тестирование отказоустойчивости через Chaos Engineering
- Проверка идемпотентности для качества ролей
- Health Dashboard для мониторинга состояния лаборатории
- Secrets Inspector для безопасности
- Установка common tools для всех хостов

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:10:01 +03:00
26a09cd637 feat: Создана папка vault для хранения секретов и улучшена работа с Ansible Vault
- Создана папка vault/ для хранения всех секретов
- Перенесен vault-password.txt в vault/.vault
- Обновлены все команды vault для работы с новой структурой:
  - make vault show/create/edit/delete/rekey/decrypt/encrypt
  - Все команды теперь работают с vault/secrets.yml
  - Пароль хранится в vault/.vault

Обновления в docker-compose.yaml:
- Добавлено монтирование папки vault в контейнер
- Обновлена переменная ANSIBLE_VAULT_PASSWORD_FILE на /ansible/vault/.vault
- Добавлено монтирование .ansible-lint для корректной работы lint

Обновления в Makefile:
- VAULT_PASSWORD_FILE теперь указывает на vault/.vault
- Все vault команды обновлены для работы с vault/secrets.yml
- Команда clean теперь удаляет папку vault/

Обновления в .ansible-lint:
- Добавлены exclude_paths для исключения проблемных файлов
- Исключены molecule/universal/ и files/playbooks/ из проверки
- Это решает проблемы с Docker модулями в lint

Проверка работы vault:
- Создан тестовый файл vault/secrets.yml с секретами
- Проверена корректность шифрования/расшифровки
- Создан тестовый playbook для проверки работы с vault
- Все команды vault работают корректно

Обновления в документации:
- README.md: добавлена информация о папке vault/
- docs/api.md: обновлены настройки ansible-lint с exclude_paths

Преимущества:
- Централизованное хранение всех секретов в папке vault/
- Безопасное хранение паролей в скрытом файле .vault
- Корректная работа lint без ошибок с Docker модулями
- Автоматическое использование vault паролей во всех операциях

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 14:02:21 +03:00
df97e9d3d4 feat: Добавлена поддержка ansible-lint с настройками для пропуска ошибок
- Добавлена команда make lint для проверки всего проекта
- Обновлена команда make role lint для использования .ansible-lint
- Добавлен файл .ansible-lint с настройками для пропуска ошибок:
  - fqcn: позволяет использовать короткие имена модулей
  - 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

Обновления в Makefile:
- make lint: проверяет весь проект (molecule, playbooks, roles)
- make role lint: использует --config-file /ansible/.ansible-lint
- Добавлена команда lint в справку make help

Обновления в документации:
- README.md: добавлена команда make lint
- docs/api.md: добавлены разделы Ansible-lint команды и настройки

Преимущества:
- Единообразная проверка всего проекта
- Гибкие настройки для пропуска нежелательных ошибок
- Автоматическое использование конфигурационного файла
- Подробная документация по настройкам

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:52:44 +03:00
09ca55539f feat: Удален molecule/default и все скрипты теперь запускаются через Docker
- Удалена папка molecule/default (больше не используется)
- Все скрипты в папке scripts теперь запускаются через Docker контейнер
- Обновлены пути в скриптах для работы внутри контейнера:
  - snapshot.sh: OUT_DIR=/ansible/snapshots
  - restore.sh: IN_DIR=/ansible/snapshots
  - cleanup.sh: остался без изменений (уже корректный)

Обновления в docker-compose.yaml:
- Добавлены монтирования для scripts, reports, snapshots
- Скрипты теперь доступны внутри контейнера по пути /ansible/scripts/
- Отчеты сохраняются в /ansible/reports/
- Снапшоты сохраняются в /ansible/snapshots/

Обновления в Makefile:
- make snapshot теперь запускает: docker exec ansible-controller bash -lc 'bash /ansible/scripts/snapshot.sh'
- make restore теперь запускает: docker exec ansible-controller bash -lc 'bash /ansible/scripts/restore.sh'
- make cleanup теперь запускает: docker exec ansible-controller bash -lc 'bash /ansible/scripts/cleanup.sh'

Преимущества:
- Не требует установки дополнительных инструментов локально
- Все операции выполняются в изолированной среде
- Единообразный подход к запуску всех скриптов
- Автоматическое создание необходимых директорий

Обновлена документация:
- README.md: добавлено упоминание о запуске через Docker
- docs/api.md: обновлены примеры скриптов с путями для Docker

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:48:38 +03:00
9c55c8f615 feat: Добавлены команды для работы с kubeconfig и улучшена генерация отчетов
- Добавлена команда make kube kubeconfig CLUSTER=lab для получения kubeconfig файла
- Добавлена команда make kubeconfigs для получения всех kubeconfig файлов
- Улучшена команда make report для запуска через контейнер
- Добавлена команда make open-report для открытия отчета в браузере
- Добавлена команда make full-test для полного цикла с отчетом и kubeconfig
- Обновлена справка make help с новыми командами
- Обновлен README.md с новыми командами

Новые команды:
- make kube kubeconfig CLUSTER=lab - получить kubeconfig для конкретного кластера
- make kubeconfigs - получить все kubeconfig файлы из всех кластеров
- make open-report - открыть HTML отчет в браузере
- make full-test - полный цикл тестирования с генерацией отчетов и kubeconfig

Улучшения:
- Генерация отчетов теперь работает через контейнер (не требует Python локально)
- Автоматическое создание директорий reports/ и reports/kubeconfigs/
- Цветной вывод с информативными сообщениями
- Кроссплатформенное открытие отчетов (macOS, Linux, Windows)
- Валидация существования файлов перед открытием

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:43:08 +03:00
f2a0f46813 feat: Полностью переписан Makefile с максимальной автоматизацией
- Создан новый Makefile с унифицированными командами
- Команды теперь работают как: make lab up, make kube sh, make preset list
- Добавлена поддержка .env файла для конфигурации
- Созданы команды для автоматизации всех аспектов работы:

Основные команды:
- make help - справка по всем командам
- make init - полная инициализация проекта
- make setup-env - создание .env файла
- make setup-vault - создание vault-password.txt
- make setup-roles - создание директории ролей
- make setup-precommit - установка pre-commit хуков

Лаборатория (make lab):
- make lab up/down/sh/test/create/converge/verify/destroy/reset
- Полная автоматизация работы с лабораторией
- Цветной вывод и информативные сообщения

Kubernetes (make kube):
- make kube sh/cmd/enter/kiali/istio/grafana/prom/pf-stop
- Управление Kubernetes кластерами
- Port-forward для всех сервисов мониторинга

Пресеты (make preset):
- make preset list/create/edit/test/copy
- Автоматическое создание новых пресетов
- Копирование существующих пресетов
- Тестирование пресетов

Роли (make role):
- make role list/create/edit/test/lint/deploy
- Автоматическое создание структуры ролей
- Тестирование и линтинг ролей

Vault (make vault):
- make vault show/create/edit/delete/rekey/decrypt/encrypt
- Полное управление Ansible Vault

Git (make git):
- make git status/add/commit/push/pull/branch/merge
- Автоматизация работы с Git

Docker (make docker):
- make docker build/rebuild/prune/shell/logs/stop/start
- Управление Docker контейнерами

Утилиты:
- make report - генерация HTML отчетов
- make snapshot/restore - управление снапшотами
- make cleanup - очистка лаборатории
- make env - показ переменных окружения
- make clean - полная очистка проекта

Особенности:
- Цветной вывод для лучшего UX
- Информативные сообщения о выполняемых действиях
- Автоматическая загрузка переменных из .env файла
- Валидация параметров команд
- Подробная справка по всем командам
- Единообразный интерфейс для всех операций

Создан env.example с примером конфигурации
Обновлен README.md с новыми командами
Добавлена поддержка всех 21 пресета
Интеграция с существующей документацией

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:37:48 +03:00
73 changed files with 3436 additions and 2874 deletions

View File

@@ -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
View File

@@ -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

2340
Makefile

File diff suppressed because it is too large Load Diff

174
README.md
View File

@@ -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
View 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
View 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}/"

View File

@@ -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:

View File

@@ -1,4 +0,0 @@
---
- name: Пример таски
debug:
msg: "Привет! Я запустился на Debian/Ubuntu!"

View File

@@ -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"

View File

@@ -1,4 +0,0 @@
---
- name: Пример таски
debug:
msg: "Привет! Я запустился на RedHat/CentOS/Fedora!"

View File

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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
View 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

View File

@@ -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: "Инфраструктура готова для настройки"

View File

@@ -1 +0,0 @@
[all]

View File

@@ -1,6 +0,0 @@
---
- name: Converge
hosts: all
vars_files:
- ../../vars/secrets.yml
roles:

View File

@@ -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 }}"

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +0,0 @@
---
- name: Prepare
hosts: all
tasks:
- name: Reun verify
debug:
msg: "Hello, Verify!"

View File

@@ -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 '✗ Недоступен' }}
========================================

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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:

View File

@@ -1,4 +0,0 @@
---
collections:
- name: maxhoesel.proxmox
version: 5.0.1

21
roles/.gitkeep Normal file
View 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
View 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

View File

@@ -1 +0,0 @@
---

View File

@@ -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
View 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 "✅ Все проверки безопасности пройдены!"

View File

@@ -5,7 +5,7 @@
set -euo pipefail
OUT_DIR="snapshots"
OUT_DIR="/ansible/snapshots"
mkdir -p "$OUT_DIR"
# Найти все контейнеры лаборатории

View File

View File

@@ -1 +0,0 @@
test

45
vault/secrets.yml Normal file
View 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