Compare commits

..

20 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
43 changed files with 2191 additions and 2375 deletions

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

1512
Makefile

File diff suppressed because it is too large Load Diff

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
@@ -96,11 +103,12 @@ make preset edit NAME=my-preset
# Управление ролями
make role list # Список ролей
make role create NAME=my-role
make role test NAME=my-role
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 info NAME=my-role # Информация о роли
make role playbook NAME=my-role # Управление playbooks роли
# Проверка всего проекта
make lint # Проверить весь проект на ошибки
@@ -129,6 +137,58 @@ 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 файлов
- Интерактивная настройка параметров
## 📚 Документация
### Основные разделы

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

View File

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

@@ -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 +0,0 @@
[all]

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"

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

View File

@@ -1,36 +1,45 @@
$ANSIBLE_VAULT;1.1;AES256
37313930666665366564356631646336636130366562343435376262666131373338616633646165
6232383865363562346664363334666438333438316630370a326532623133653963343230613434
38356337383966343732313930616632656635653063343961396539623130636231663433373565
6237303562303839630a646530653434616566303136643438356239626561326532383839663534
61393164643337653137373437393834623430313937613866303131343061326665333362316333
36303435353431313766653563653037393934373537643365313931373336333133633635386633
66616331653337333531356432613431653135303134643261336339346538653838303235393332
39373538643861653634613231323661366131303237393133653035326431386436653265306437
62643266313862623737656164643437616535633438383533346237313364313834383237623265
39303064356263666566386532323061646131336632616335626462373264633662616335353462
30393664313565396532383965396337616237373864626631333237633263653065626265393264
64396464356633333366353537633364643735323439336434386437643430316136613335646232
36313462666438626136363334343439333537646461653166313535366361643235326137333163
30363632613839653034626664653764376366653064613936353739363663326466303462356533
36393932303135643531373432326236653163653835306361363261393137373835623639346464
33616238633232373237643564626439653363356635373939333664653864643061643534336565
39303366616635313466623634336234386438353262653031356633323036306636333437623263
33343863316338356466323334316334313933393730626332373736396234376135623437393662
30626263613738373461613933373166353737353538316337633062633861633135643638383031
37626464323763376334656363373634343431383936386363623761366536653166353239343332
33313435366430666531316131306239643632376262656631396162636233343631336566613531
64313136383865326331366466316365646136623736303164373735636366643430343138373138
39653533336434333939656361366633376361663266653063666537633261653663363134333562
63663562303432323230303065303930343435356433326235323366373662666261313966616639
39376131623237323836663735313839333034626163363236313939396638623565363038333432
39643630366263613732636462353166626332653234336332366363346262316465353130623130
32663061633830373038656539653238393732333964343836653965383131656534386337393335
35383135316365393734666136343964393630346137393661643735613863613764313238663665
35323664353939303631653835636231323531353863333839306531376337653063373536623833
34326534303364383031346137323966353133333138306631323735376561656136376333616261
63343435623233623338666337383265353766323666396139633964643563393366656339633736
39326261316430313637313230656536323362666361353930353135383737313037316139653964
32326230396263383939393961353763323138613230353364313038366165646130303363643239
31303930653862323839653330373532646630336565303535306361346235306565613635396366
316438396434306663316134316230636462
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