Compare commits

..

35 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
8071fba25f feat: Создана полная документация проекта с централизованным хранением
- Создан новый README.md с полной документацией проекта
- Перемещены все MD файлы в папку /docs
- Создана структура документации:
  - docs/universal-lab.md - руководство по лаборатории
  - docs/presets.md - описание всех 21 пресета
  - docs/roles.md - структура и создание Ansible ролей
  - docs/examples.md - практические примеры использования
  - docs/troubleshooting.md - решение проблем
  - docs/api.md - справочник по API

Основные возможности документации:
- Полное описание всех возможностей лаборатории
- 21 готовый пресет для различных сценариев
- Подробные инструкции по использованию
- Примеры создания собственных пресетов
- Руководство по созданию Ansible ролей
- Troubleshooting для решения проблем
- API Reference для всех команд и параметров

Структура проекта:
- README.md - основная документация с ссылками
- docs/ - централизованное хранение документации
- molecule/presets/ - 21 готовый пресет
- files/ - файлы для ролей и playbooks
- scripts/ - скрипты для управления лабораторией

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:29:47 +03:00
d32ca54f7b feat: Добавлены расширенные пресеты для Kubernetes, DinD и DOoD
- Создано 11 новых пресетов для различных конфигураций
- Kubernetes пресеты: single, multi-cluster, istio-full
- DinD пресеты: simple, swarm, compose
- DOoD пресеты: simple, mixed
- Смешанные пресеты: k8s+dind, k8s+dood, full-stack

Kubernetes пресеты:
- k8s-single.yml - одиночный Kind кластер
- k8s-multi.yml - мульти-кластерная конфигурация (dev/staging/prod)
- k8s-istio-full.yml - полный стек Istio с мониторингом

DinD пресеты:
- dind-simple.yml - 3 изолированных Docker среды
- dind-swarm.yml - Docker Swarm кластер (1 manager + 4 workers)
- dind-compose.yml - 4 DinD контейнера для Compose стека

DOoD пресеты:
- dood-simple.yml - 3 DOoD контейнера с доступом к Docker daemon
- dood-mixed.yml - смешанная конфигурация DOoD + systemd

Смешанные пресеты:
- mixed-k8s-dind.yml - Kubernetes + DinD
- mixed-k8s-dood.yml - Kubernetes + DOoD
- mixed-full.yml - полная гибридная конфигурация

Обновлена документация:
- README с описанием всех 21 пресета
- Категоризация по типам (классические, k8s, dind, dood, смешанные)
- Примеры использования для каждого пресета
- Рекомендации по выбору подходящего пресета

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:23:01 +03:00
b1bae8af9f feat: Добавлены пресеты для различных сценариев тестирования (1-20 машин)
- Создано 10 готовых пресетов для разных типов инфраструктуры
- Минимальная лаборатория (1-3 машины) - базовое тестирование
- Веб-приложение (3-5 машин) - классическая архитектура
- Микросервисы (5-8 машин) - современная архитектура
- Высокая доступность (6-10 машин) - отказоустойчивость
- Kubernetes кластер (8-12 машин) - контейнерная оркестрация
- CI/CD пайплайн (10-15 машин) - автоматизация разработки
- Big Data кластер (12-18 машин) - обработка больших данных
- Service Mesh (15-20 машин) - микросервисная архитектура
- Enterprise (18-20 машин) - корпоративная инфраструктура
- Максимальный (20 машин) - экстремальные условия

Каждый пресет включает:
- Подробное описание архитектуры
- Различные группы хостов (webservers, databases, monitoring)
- Смешанные семейства ОС (debian/rhel)
- Настроенные порты и сервисы
- Готовые команды для запуска

Документация:
- README с описанием всех пресетов
- Примеры использования
- Рекомендации по выбору
- Troubleshooting

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:15:11 +03:00
33ada54c12 feat: Завершена реализация универсальной лаборатории
- Добавлена полная поддержка Istio service mesh с Kiali
- Интегрированы Helm charts (nginx, prometheus-stack)
- Созданы Grafana дашборды для Istio мониторинга
- Добавлен HTML генератор отчетов с красивым дизайном
- Созданы скрипты для снапшотов и восстановления
- Добавлена поддержка Istio Bookinfo demo
- Обновлена документация с полным описанием возможностей

Компоненты:
- Istio с Telemetry и Traffic Policy
- Prometheus + Grafana с автопровижинингом дашбордов
- HTML отчеты с анализом статусов
- Снапшоты и восстановление состояния
- Полная интеграция с Kubernetes

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:08:55 +03:00
b4881da7c5 feat: Добавлена универсальная лаборатория для тестирования Ansible ролей
- Создана структура molecule/universal/ с поддержкой DinD и DOoD
- Добавлена поддержка Kind кластеров для Kubernetes тестирования
- Интегрированы Helm charts (nginx, prometheus-stack)
- Добавлена поддержка Istio service mesh с Kiali
- Создан Makefile с lab-целями для управления лабораторией
- Добавлена поддержка Prometheus + Grafana с автопровижинингом
- Создан README с подробной документацией

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-22 13:01:53 +03:00
163 changed files with 7491 additions and 17862 deletions

View File

@@ -4,4 +4,8 @@ skip_list:
- yaml[truthy]
- yaml[line-length]
- var-naming[no-role-prefix]
- 'ignore-errors'
- 'ignore-errors'
exclude_paths:
- molecule/universal/
- files/playbooks/

View File

@@ -1,44 +0,0 @@
name: Ansible Testing
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run lint
run: make role lint
test:
runs-on: ubuntu-latest
needs: lint
strategy:
matrix:
preset: [minimal, default, performance]
steps:
- uses: actions/checkout@v4
- name: Setup Docker
run: |
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Run tests
run: make role test ${{ matrix.preset }}
deploy-check:
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Check deployment
run: make role deploy
env:
ANSIBLE_HOST_KEY_CHECKING: false

39
.gitignore vendored
View File

@@ -1,12 +1,6 @@
# ---> Ansible
*.retry
# ---> Vault (секретные файлы)
vault/.vault
vault/secrets/*.yml
# Зашифрованные vault файлы (если не нужно коммитить)
# vault/*.yml
# ---> Python
# Byte-compiled / optimized / DLL files
__pycache__/
@@ -177,9 +171,36 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
# Cursor IDE
# ---> Ansible Template Project Specific
# Vault password files
.vault
vault/.vault
vault-password.txt
# IDE directories
.cursor/
.idea/
.vscode/
# Kubernetes kubeconfig
kubeconfig
# 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

3604
Makefile

File diff suppressed because it is too large Load Diff

1130
README.md

File diff suppressed because it is too large Load Diff

8
ansible.cfg Normal file
View File

@@ -0,0 +1,8 @@
[defaults]
inventory = inventory/hosts
vault_password_file = vault-password.txt
remote_user = devops
host_key_checking = False
enable_plugins = yaml, ini
roles_path = roles/
interpreter_python = auto

89
ci-cd/.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,89 @@
stages:
- lint
- test
- deploy
- notify
services:
- name: docker:dind
command: ["--tls=false"]
variables:
DOCKER_IMAGE: "hub.cism-ms.ru/ansible/ansible:latest"
DOCKER_TLS_CERTDIR: ""
ANSIBLE_FORCE_COLOR: "true"
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login hub.cism-ms.ru -u "$CI_REGISTRY_USER" --password-stdin
- docker pull $DOCKER_IMAGE
- echo "Fixing directory permissions..."
- chmod o-w $CI_PROJECT_DIR
lint:
stage: lint
script:
- echo "Начинаем стейдж Lint"
- echo "Распаковываем секреты..."
- ansible-vault decrypt vars/secrets.yml --vault-password-file ./vault-password.txt
- echo "Запускаем ansible-lint..."
- ansible-lint roles/*
- echo "Упаковываем секреты..."
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
allow_failure: false
rules:
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
test:
stage: test
script:
- echo "Распаковываем секреты..."
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
- echo "Запускаем тесты через Молекулу..."
- molecule test --parallel --destroy=always
- echo "Упаковываем секреты..."
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
allow_failure: false
rules:
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
deploy:
stage: deploy
script:
- echo "Настраиваем SSH-ключ для доступа к серверам..."
# Создаем директорию .ssh и настраиваем права доступа
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
# Записываем SSH-ключ в файл ~/.ssh/id_rsa
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
# Запускаем основной пайплайн
- echo "Распаковываем секреты..."
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
- echo "Все ок. Деплоим в прод..."
- ansible-playbook roles/deploy.yaml
- echo "Упаковываем секреты..."
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
# Удаляем ключ
- rm -rf ~/.ssh
rules:
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
when: manual
notify:
stage: notify
script:
- |
if [ "$CI_JOB_STATUS" == "success" ]; then
MESSAGE="✅ Пайплайн успешно завершен!%0AПроект: $CI_PROJECT_NAME%0AВетка: $CI_COMMIT_REF_NAME%0AСтатус: $CI_JOB_STATUS"
else
MESSAGE="❌ Пайплайн завершен с ошибкой!%0AПроект: $CI_PROJECT_NAME%0AВетка: $CI_COMMIT_REF_NAME%0AСтатус: $CI_JOB_STATUS"
fi
# curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
# -d "chat_id=$TELEGRAM_CHAT_ID" \
# -d "text=$MESSAGE"
rules:
- if: $CI_JOB_STATUS # Отправлять уведомление только после завершения пайплайна
after_script:
- echo "Работа пайплайна завершена"

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

View File

@@ -0,0 +1,40 @@
# Используем готовый образ с Ansible
FROM geerlingguy/docker-ubuntu2204-ansible:latest
# Добавляем метаданные
LABEL maintainer="Сергей Антропов <sergey@antropoff.ru>"
LABEL description="Этот Dockerfile создан для внедрения подхода IaC в Ansible."
LABEL version="0.1"
LABEL contact.website="https://devops.org.ru"
# Устанавливаем переменные окружения
ENV PYTHONUNBUFFERED=1
ENV EDITOR=nano
# Устанавливаем дополнительные зависимости Python для Molecule
RUN pip install --upgrade pip && \
pip install \
molecule \
molecule-docker \
ansible-lint \
yamllint \
docker \
&& rm -rf /root/.cache/pip
# Создаем рабочую директорию
WORKDIR /ansible
# Копируем файлы проекта
COPY . /ansible/
# Устанавливаем права на выполнение (если папка scripts существует)
RUN if [ -d /ansible/scripts ]; then chmod +x /ansible/scripts/*.sh; fi
# Устанавливаем пользователя
USER root
# Открываем порт для SSH
EXPOSE 22
# Команда по умолчанию
CMD ["/bin/bash"]

View File

@@ -0,0 +1,54 @@
# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule
# Используем официальный образ Fedora
FROM quay.io/fedora/python-312
USER root
# Обновляем пакеты и устанавливаем systemd и необходимые пакеты
RUN dnf update -y && \
dnf install -y --nodocs --setopt=install_weak_deps=False \
systemd rsync \
git \
openssh \
gcc \
libffi-devel \
openssl-devel \
make \
sudo \
openssh-clients \
less \
ca-certificates \
curl \
gnupg2 \
nano \
sshpass \
redhat-lsb-core \
&& dnf clean all && \
rm -rf /var/cache/dnf /tmp/* /var/tmp/*
# Устанавливаем docker-compose
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
chmod +x /usr/local/bin/docker-compose
# Устанавливаем Python пакеты для Ansible
RUN pip install --upgrade pip && \
pip install \
ansible \
ansible-vault \
molecule \
molecule-docker \
ansible-lint \
yamllint \
docker \
&& rm -rf /root/.cache/pip
# Настраиваем окружение для systemd
ENV container=docker
STOPSIGNAL SIGRTMIN+3
# Создаем необходимые директории для systemd
VOLUME [ "/sys/fs/cgroup" ]
# Запускаем systemd при старте контейнера
CMD ["/sbin/init"]

View File

@@ -0,0 +1,62 @@
# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule
# Используем готовый образ с Ansible (более старый, но стабильный)
FROM geerlingguy/docker-ubuntu2004-ansible:latest
# Устанавливаем переменные окружения
ENV DEBIAN_FRONTEND=noninteractive
ENV container=docker
# Устанавливаем дополнительные пакеты для тестирования
RUN apt-get update && \
apt-get install -y --no-install-recommends \
systemd \
systemd-sysv \
rsync \
git \
ssh \
gcc \
libffi-dev \
libssl-dev \
make \
sudo \
sshpass \
openssh-client \
nano \
less \
ca-certificates \
curl \
gnupg \
lsb-release \
&& rm -rf /var/lib/apt/lists/*
# Устанавливаем Python пакеты для Ansible с обновлением зависимостей
RUN pip install --upgrade pip && \
pip install --upgrade \
requests \
PyYAML \
ansible-core \
&& pip install \
ansible \
"ansible-vault<4.0.0" \
molecule \
molecule-docker \
ansible-lint \
yamllint \
docker \
&& rm -rf /root/.cache/pip
# Устанавливаем docker-compose
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
chmod +x /usr/local/bin/docker-compose
# Указываем, что контейнер использует systemd в качестве init-системы
ENV container=docker
STOPSIGNAL SIGRTMIN+3
# Создаем необходимые директории для systemd
VOLUME [ "/sys/fs/cgroup" ]
# Запускаем systemd при старте контейнера
CMD ["/sbin/init"]

View File

@@ -1,51 +0,0 @@
# GitLab CI для AnsibleLab
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
stages:
- test
- deploy
variables:
DOCKER_IMAGE: "quay.io/ansible/creator-ee:latest"
DOCKER_TLS_CERTDIR: ""
ANSIBLE_FORCE_COLOR: "true"
before_script:
- echo "Установка зависимостей..."
- pip install molecule[docker] ansible-lint
- ansible-galaxy collection install -r requirements.yml
# Тестирование с Molecule
test:
stage: test
image: $DOCKER_IMAGE
services:
- docker:dind
variables:
DOCKER_TLS_CERTDIR: ""
script:
- echo "Запуск тестов Molecule..."
- cd molecule/universal
- molecule test -s universal
artifacts:
reports:
junit: molecule/universal/.molecule/reports/junit.xml
paths:
- molecule/universal/.molecule/
expire_in: 1 week
only:
- merge_requests
- main
- develop
# Деплой (если нужен)
deploy:
stage: deploy
image: $DOCKER_IMAGE
script:
- echo "Деплой не настроен"
- echo "Добавьте логику деплоя в этот job"
when: manual
only:
- main

View File

@@ -1,167 +0,0 @@
# Azure DevOps Pipeline для AnsibleLab
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
trigger:
- main
- develop
pool:
vmImage: 'ubuntu-latest'
variables:
ANSIBLE_FORCE_COLOR: 'true'
DOCKER_TLS_CERTDIR: ''
stages:
# Стадия 1: Lint проверка
- stage: Lint
displayName: '🔍 Lint Check'
jobs:
- job: LintJob
displayName: 'Run Lint'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
displayName: 'Use Python 3.11'
- script: |
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
displayName: 'Install Dependencies'
- script: |
echo "🔍 Проверка синтаксиса ролей..."
make role lint
displayName: 'Run Ansible Lint'
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: '.ansible-lint'
artifactName: 'lint-results'
condition: always()
# Стадия 2: Тестирование
- stage: Test
displayName: '🧪 Role Testing'
dependsOn: Lint
condition: succeeded()
jobs:
- job: TestJob
displayName: 'Run Tests'
strategy:
matrix:
minimal:
preset: minimal
default:
preset: default
performance:
preset: performance
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
displayName: 'Use Python 3.11'
- script: |
sudo apt-get update
sudo apt-get install -y docker.io make
sudo systemctl start docker
sudo usermod -aG docker $USER
displayName: 'Install System Dependencies'
- script: |
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
displayName: 'Install Python Dependencies'
- script: |
make docker setup-builder
make docker build
displayName: 'Setup Docker and Build Images'
- script: |
echo "🧪 Тестирование с preset: $(preset)"
make role test $(preset)
displayName: 'Run Molecule Tests'
env:
PRESET: $(preset)
- task: PublishTestResults@2
inputs:
testResultsFiles: 'molecule/default/.molecule/reports/junit.xml'
testRunTitle: 'Molecule Test Results - $(preset)'
condition: always()
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: 'molecule/default/.molecule'
artifactName: 'test-results-$(preset)'
condition: always()
# Стадия 3: Деплой (только для main ветки)
- stage: Deploy
displayName: '🚀 Deploy Check'
dependsOn: [Lint, Test]
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- job: DeployJob
displayName: 'Check Deployment'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
displayName: 'Use Python 3.11'
- script: |
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
displayName: 'Install Dependencies'
- script: |
mkdir -p inventory
cat > inventory/hosts.ini << EOF
[test_servers]
localhost ansible_connection=local
[all:vars]
ansible_python_interpreter=python3
EOF
displayName: 'Create Inventory File'
- script: |
echo "🚀 Проверка развертывания (dry-run)..."
make role deploy
displayName: 'Run Deployment Check'
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: 'deployment.log'
artifactName: 'deployment-results'
condition: always()
# Уведомления
- stage: Notify
displayName: '📢 Notifications'
dependsOn: [Lint, Test, Deploy]
condition: always()
jobs:
- job: NotifyJob
displayName: 'Send Notifications'
steps:
- script: |
echo "🔍 Lint: $(Lint.result)"
echo "🧪 Test: $(Test.result)"
echo "🚀 Deploy: $(Deploy.result)"
if [ "$(Lint.result)" = "Succeeded" ] && [ "$(Test.result)" = "Succeeded" ]; then
echo "✅ Все проверки пройдены успешно!"
else
echo "❌ Проверки не пройдены!"
exit 1
fi
displayName: 'Check Results and Notify'

View File

@@ -1,172 +0,0 @@
# GitHub Actions Workflow для AnsibleLab
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
name: AnsibleLab CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
# Стадия 1: Lint проверка
lint:
name: 🔍 Lint Check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run Ansible Lint
run: |
echo "🔍 Проверка синтаксиса ролей..."
make role lint
- name: Upload lint results
uses: actions/upload-artifact@v3
if: always()
with:
name: lint-results
path: |
.ansible-lint
lint-report.txt
# Стадия 2: Тестирование
test:
name: 🧪 Role Testing
runs-on: ubuntu-latest
needs: lint
strategy:
matrix:
preset: [minimal, default, performance]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y docker.io make
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Install Python dependencies
run: |
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Setup Docker builder
run: |
make docker setup-builder
- name: Build Docker images
run: |
make docker build
- name: Run Molecule tests
run: |
echo "🧪 Тестирование с preset: ${{ matrix.preset }}"
make role test ${{ matrix.preset }}
- name: Upload test results
uses: actions/upload-artifact@v3
if: always()
with:
name: test-results-${{ matrix.preset }}
path: |
molecule/default/.molecule/
test-report-${{ matrix.preset }}.txt
# Стадия 3: Деплой (только для main ветки)
deploy:
name: 🚀 Deploy Check
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Create inventory file
run: |
mkdir -p inventory
cat > inventory/hosts.ini << EOF
[test_servers]
localhost ansible_connection=local
[all:vars]
ansible_python_interpreter=python3
EOF
- name: Run deployment check
run: |
echo "🚀 Проверка развертывания (dry-run)..."
make role deploy
- name: Upload deployment results
uses: actions/upload-artifact@v3
if: always()
with:
name: deployment-results
path: |
deployment.log
deployment-report.txt
# Уведомления
notify:
name: 📢 Notifications
runs-on: ubuntu-latest
needs: [lint, test, deploy]
if: always()
steps:
- name: Notify on success
if: needs.lint.result == 'success' && needs.test.result == 'success'
run: |
echo "✅ Все проверки пройдены успешно!"
echo "🔍 Lint: ${{ needs.lint.result }}"
echo "🧪 Test: ${{ needs.test.result }}"
echo "🚀 Deploy: ${{ needs.deploy.result }}"
- name: Notify on failure
if: needs.lint.result == 'failure' || needs.test.result == 'failure'
run: |
echo "❌ Проверки не пройдены!"
echo "🔍 Lint: ${{ needs.lint.result }}"
echo "🧪 Test: ${{ needs.test.result }}"
echo "🚀 Deploy: ${{ needs.deploy.result }}"
exit 1

View File

@@ -1,153 +0,0 @@
# GitLab CI Pipeline для AnsibleLab
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
stages:
- lint
- test
- deploy
variables:
ANSIBLE_FORCE_COLOR: "true"
DOCKER_TLS_CERTDIR: ""
# Стадия 1: Lint проверка
lint:
stage: lint
image: python:3.11
before_script:
- pip install --upgrade pip
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- echo "🔍 Проверка синтаксиса ролей..."
- make role lint
artifacts:
reports:
junit: .ansible-lint
paths:
- .ansible-lint
expire_in: 1 week
# Стадия 2: Тестирование
test_minimal:
stage: test
image: docker:latest
services:
- docker:dind
variables:
DOCKER_TLS_CERTDIR: ""
before_script:
- apk add --no-cache make python3 py3-pip
- pip install --upgrade pip
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
- make docker setup-builder
- make docker build
script:
- echo "🧪 Тестирование с preset: minimal"
- make role test minimal
artifacts:
reports:
junit: molecule/default/.molecule/reports/junit.xml
paths:
- molecule/default/.molecule/
expire_in: 1 week
test_default:
stage: test
image: docker:latest
services:
- docker:dind
variables:
DOCKER_TLS_CERTDIR: ""
before_script:
- apk add --no-cache make python3 py3-pip
- pip install --upgrade pip
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
- make docker setup-builder
- make docker build
script:
- echo "🧪 Тестирование с preset: default"
- make role test default
artifacts:
reports:
junit: molecule/default/.molecule/reports/junit.xml
paths:
- molecule/default/.molecule/
expire_in: 1 week
test_performance:
stage: test
image: docker:latest
services:
- docker:dind
variables:
DOCKER_TLS_CERTDIR: ""
before_script:
- apk add --no-cache make python3 py3-pip
- pip install --upgrade pip
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
- make docker setup-builder
- make docker build
script:
- echo "🧪 Тестирование с preset: performance"
- make role test performance
artifacts:
reports:
junit: molecule/default/.molecule/reports/junit.xml
paths:
- molecule/default/.molecule/
expire_in: 1 week
# Стадия 3: Деплой (только для main ветки)
deploy:
stage: deploy
image: python:3.11
only:
- main
before_script:
- pip install --upgrade pip
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- echo "🚀 Проверка развертывания (dry-run)..."
- mkdir -p inventory
- |
cat > inventory/hosts.ini << EOF
[test_servers]
localhost ansible_connection=local
[all:vars]
ansible_python_interpreter=python3
EOF
- make role deploy
artifacts:
paths:
- deployment.log
expire_in: 1 week
# Уведомления
notify_success:
stage: deploy
image: python:3.11
only:
- main
when: on_success
script:
- echo "✅ Все проверки пройдены успешно!"
- echo "🔍 Lint: Success"
- echo "🧪 Test: Success"
- echo "🚀 Deploy: Success"
notify_failure:
stage: deploy
image: python:3.11
when: on_failure
script:
- echo "❌ Проверки не пройдены!"
- echo "🔍 Lint: Failed"
- echo "🧪 Test: Failed"
- echo "🚀 Deploy: Failed"

View File

@@ -1,138 +0,0 @@
// Jenkins Pipeline для AnsibleLab
// Автор: Сергей Антропов
// Сайт: https://devops.org.ru
pipeline {
agent any
environment {
ANSIBLE_FORCE_COLOR = 'true'
DOCKER_TLS_CERTDIR = ''
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
// Стадия 1: Lint проверка
stage('🔍 Lint Check') {
steps {
sh '''
echo "🔍 Проверка синтаксиса ролей..."
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
make role lint
'''
}
post {
always {
archiveArtifacts artifacts: '.ansible-lint', allowEmptyArchive: true
}
}
}
// Стадия 2: Тестирование
stage('🧪 Role Testing') {
parallel {
stage('Test Minimal') {
steps {
sh '''
echo "🧪 Тестирование с preset: minimal"
sudo apt-get update
sudo apt-get install -y docker.io make
sudo systemctl start docker
sudo usermod -aG docker $USER
make docker setup-builder
make docker build
make role test minimal
'''
}
}
stage('Test Default') {
steps {
sh '''
echo "🧪 Тестирование с preset: default"
sudo apt-get update
sudo apt-get install -y docker.io make
sudo systemctl start docker
sudo usermod -aG docker $USER
make docker setup-builder
make docker build
make role test default
'''
}
}
stage('Test Performance') {
steps {
sh '''
echo "🧪 Тестирование с preset: performance"
sudo apt-get update
sudo apt-get install -y docker.io make
sudo systemctl start docker
sudo usermod -aG docker $USER
make docker setup-builder
make docker build
make role test performance
'''
}
}
}
}
// Стадия 3: Деплой (только для main ветки)
stage('🚀 Deploy Check') {
when {
branch 'main'
}
steps {
sh '''
echo "🚀 Проверка развертывания (dry-run)..."
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
mkdir -p inventory
cat > inventory/hosts.ini << EOF
[test_servers]
localhost ansible_connection=local
[all:vars]
ansible_python_interpreter=python3
EOF
make role deploy
'''
}
post {
always {
archiveArtifacts artifacts: 'deployment.log', allowEmptyArchive: true
}
}
}
}
post {
always {
archiveArtifacts artifacts: 'molecule/default/.molecule/**/*', allowEmptyArchive: true
publishTestResults testResultsPattern: 'molecule/default/.molecule/reports/junit.xml'
}
success {
echo '✅ Все проверки пройдены успешно!'
echo '🔍 Lint: Success'
echo '🧪 Test: Success'
echo '🚀 Deploy: Success'
}
failure {
echo '❌ Проверки не пройдены!'
echo '🔍 Lint: Failed'
echo '🧪 Test: Failed'
echo '🚀 Deploy: Failed'
}
}
}

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

36
docker-compose.yaml Normal file
View File

@@ -0,0 +1,36 @@
version: "3.9"
services:
ansible-controller:
image: quay.io/ansible/creator-ee:latest
container_name: ansible-controller
privileged: true
command: sleep infinity
environment:
DOCKER_HOST: unix:///var/run/docker.sock
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault/.vault
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./molecule:/ansible/molecule
- ./files:/ansible/files
- ./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
# Обратная совместимость
# ansible:
# image: inecs/ansible:latest
# container_name: ansible
# volumes:
# - .:/ansible
# - /var/run/docker.sock:/var/run/docker.sock
# environment:
# - ANSIBLE_VAULT_PASSWORD_FILE=./vault-password.txt
# tty: true
# privileged: true
# working_dir: /ansible

View File

@@ -1,752 +0,0 @@
# Docker образы для универсальной системы тестирования AnsibleLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🐳 Обзор
Эта директория содержит Docker образы для различных операционных систем и компонентов, используемых в универсальной системе тестирования Ansible ролей. Все образы поддерживают multi-arch сборку (amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6) и автоматически публикуются в Docker Hub.
## 📁 Структура
```
dockerfiles/
├── ansible-controller/ # Ansible контроллер с предустановленными коллекциями
│ ├── Dockerfile
│ ├── docker-compose.yml
│ └── requirements.txt
├── alt-linux/ # ALT Linux P9 с systemd
│ └── Dockerfile
├── astra-linux/ # Astra Linux 1.7 с systemd
│ └── Dockerfile
├── redos/ # RED OS 9 с systemd
│ └── Dockerfile
├── rhel/ # Red Hat Enterprise Linux 8 с systemd
│ └── Dockerfile
├── centos7/ # CentOS 7 с systemd
│ └── Dockerfile
├── centos8/ # CentOS 8 Stream с systemd
│ └── Dockerfile
├── centos9/ # CentOS 9 Stream с systemd
│ └── Dockerfile
├── alma/ # AlmaLinux 8 с systemd
│ └── Dockerfile
├── rocky/ # Rocky Linux 8 с systemd
│ └── Dockerfile
├── ubuntu20/ # Ubuntu 20.04 LTS (focal) с systemd
│ └── Dockerfile
├── ubuntu22/ # Ubuntu 22.04 LTS (jammy) с systemd
│ └── Dockerfile
├── ubuntu24/ # Ubuntu 24.04 LTS (noble) с systemd
│ └── Dockerfile
├── debian9/ # Debian 9 (stretch) с systemd
│ └── Dockerfile
├── debian10/ # Debian 10 (buster) с systemd
│ └── Dockerfile
├── debian11/ # Debian 11 (bullseye) с systemd
│ └── Dockerfile
├── debian12/ # Debian 12 (bookworm) с systemd
│ └── Dockerfile
└── README.md # Документация
```
## 🚀 Доступные образы
### 1. ansible-controller
**Базовый образ:** `ubuntu:22.04`
**Тег:** `inecs/ansible-lab:ansible-controller-latest`
**Описание:** Ansible контроллер с предустановленными коллекциями и инструментами
#### Компоненты:
- **Ansible Core** с последними коллекциями
- **Docker CLI** для работы с контейнерами
- **kubectl** для управления Kubernetes
- **Helm** для управления пакетами Kubernetes
- **Kind** для локального Kubernetes
- **yq** для работы с YAML
- **jq** для работы с JSON
#### Предустановленные коллекции:
```yaml
collections:
- name: community.docker
version: ">=3.0.0"
- name: community.general
version: ">=7.0.0"
- name: ansible.posix
version: ">=1.5.4"
```
#### Предустановленные роли:
- `geerlingguy.docker` - управление Docker
- `geerlingguy.kubernetes` - управление Kubernetes
#### Переменные окружения:
```bash
DOCKER_HOST=unix:///var/run/docker.sock
ANSIBLE_FORCE_COLOR=1
ANSIBLE_STDOUT_CALLBACK=yaml
ANSIBLE_CALLBACKS_ENABLED=profile_tasks
```
#### Использование:
```bash
# Запуск контроллера
docker run -it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/workspace \
-w /workspace \
inecs/ansible-lab:ansible-controller-latest
# Выполнение Ansible команд
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/workspace \
-w /workspace \
inecs/ansible-lab:ansible-controller-latest \
ansible-playbook site.yml
```
### 2. Ubuntu
#### Ubuntu 20.04 (focal)
**Базовый образ:** `ubuntu:20.04`
**Тег:** `inecs/ansible-lab:ubuntu20`
**Описание:** Ubuntu 20.04 LTS с systemd
**Компоненты:**
- Ubuntu 20.04 LTS (Focal Fossa)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Ubuntu 22.04 (jammy) - основная версия
**Базовый образ:** `ubuntu:22.04`
**Тег:** `inecs/ansible-lab:ubuntu-latest` или `inecs/ansible-lab:ubuntu22`
**Описание:** Ubuntu 22.04 LTS с systemd
**Компоненты:**
- Ubuntu 22.04 LTS (Jammy Jellyfish)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Ubuntu 24.04 (noble)
**Базовый образ:** `ubuntu:24.04`
**Тег:** `inecs/ansible-lab:ubuntu24`
**Описание:** Ubuntu 24.04 LTS с systemd
**Компоненты:**
- Ubuntu 24.04 LTS (Noble Numbat)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
**Использование:**
```bash
# Запуск Ubuntu контейнера
docker run -d --privileged \
--name ubuntu-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:ubuntu22
```
### 3. Debian
#### Debian 9 (stretch)
**Базовый образ:** `debian:stretch`
**Тег:** `inecs/ansible-lab:debian9`
**Описание:** Debian 9 Stretch с systemd
**Компоненты:**
- Debian 9 (Stretch)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Debian 10 (buster)
**Базовый образ:** `debian:buster`
**Тег:** `inecs/ansible-lab:debian10`
**Описание:** Debian 10 Buster с systemd
**Компоненты:**
- Debian 10 (Buster)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Debian 11 (bullseye)
**Базовый образ:** `debian:bullseye`
**Тег:** `inecs/ansible-lab:debian11`
**Описание:** Debian 11 Bullseye с systemd
**Компоненты:**
- Debian 11 (Bullseye)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Debian 12 (bookworm) - основная версия
**Базовый образ:** `debian:bookworm`
**Тег:** `inecs/ansible-lab:debian-latest` или `inecs/ansible-lab:debian12`
**Описание:** Debian 12 Bookworm с systemd
**Компоненты:**
- Debian 12 (Bookworm)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
**Использование:**
```bash
# Запуск Debian контейнера
docker run -d --privileged \
--name debian-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:debian12
```
### 4. RHEL (Red Hat Enterprise Linux)
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
**Тег:** `inecs/ansible-lab:rhel-latest`
**Описание:** Red Hat Enterprise Linux 8 с systemd
**Компоненты:**
- RHEL 8 (Universal Base Image)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
**Использование:**
```bash
# Запуск RHEL контейнера
docker run -d --privileged \
--name rhel-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:rhel-latest
```
### 5. CentOS
#### CentOS 7
**Базовый образ:** `centos:7`
**Тег:** `inecs/ansible-lab:centos7`
**Описание:** CentOS 7 с systemd
**Компоненты:**
- CentOS 7
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### CentOS 8
**Базовый образ:** `quay.io/centos/centos:stream8`
**Тег:** `inecs/ansible-lab:centos8`
**Описание:** CentOS 8 Stream с systemd
**Компоненты:**
- CentOS 8 Stream
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### CentOS 9 (stream) - основная версия
**Базовый образ:** `quay.io/centos/centos:stream9`
**Тег:** `inecs/ansible-lab:centos-latest` или `inecs/ansible-lab:centos9`
**Описание:** CentOS Stream 9 с systemd
**Компоненты:**
- CentOS Stream 9
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
**Использование:**
```bash
# Запуск CentOS контейнера
docker run -d --privileged \
--name centos-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:centos9
```
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
#### Использование:
```bash
# Запуск CentOS контейнера
docker run -d --privileged \
--name centos-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:centos-latest
```
### 6. alma
**Базовый образ:** `almalinux:8`
**Тег:** `inecs/ansible-lab:alma-latest`
**Описание:** AlmaLinux 8 с systemd и Docker
#### Компоненты:
- **AlmaLinux 8**
- **systemd** для управления сервисами
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano jq
python3 python3-pip
```
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
#### Использование:
```bash
# Запуск AlmaLinux контейнера
docker run -d --privileged \
--name alma-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:alma-latest
```
### 7. rocky
**Базовый образ:** `rockylinux:8`
**Тег:** `inecs/ansible-lab:rocky-latest`
**Описание:** Rocky Linux 8 с systemd и Docker
#### Компоненты:
- **Rocky Linux 8**
- **systemd** для управления сервисами
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano jq
python3 python3-pip
```
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
#### Использование:
```bash
# Запуск Rocky Linux контейнера
docker run -d --privileged \
--name rocky-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:rocky-latest
```
### 8. alt-linux
**Базовый образ:** `altlinux/p9`
**Тег:** `inecs/ansible-lab:alt-linux-latest`
**Описание:** ALT Linux 9 с systemd и Docker
#### Компоненты:
- **ALT Linux 9** (Platform 9)
- **systemd** для управления сервисами
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano htop tree jq
python3 python3-pip
```
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
#### Использование:
```bash
# Запуск ALT Linux контейнера
docker run -d --privileged \
--name alt-linux-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:alt-linux-latest
```
### 9. astra-linux
**Базовый образ:** `astralinux/astra-1.7`
**Тег:** `inecs/ansible-lab:astra-linux-latest`
**Описание:** Astra Linux 1.7 с systemd и Docker
#### Компоненты:
- **Astra Linux 1.7**
- **systemd** для управления сервисами
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano htop tree jq
python3 python3-pip
```
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
#### Использование:
```bash
# Запуск Astra Linux контейнера
docker run -d --privileged \
--name astra-linux-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:astra-linux-latest
```
### 10. redos
**Базовый образ:** `redos/redos:9`
**Тег:** `inecs/ansible-lab:redos-latest`
**Описание:** RED OS 9 с systemd и Docker
#### Компоненты:
- **RED OS 9**
- **systemd** для управления сервисами
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano htop tree jq
python3 python3-pip
```
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
#### Использование:
```bash
# Запуск RED OS контейнера
docker run -d --privileged \
--name redos-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:redos-latest
```
## 🔧 Управление образами
### Сборка всех образов
```bash
# Сборка всех образов (multi-arch)
make docker build
# Сборка конкретного образа
make docker build-image IMAGE=ubuntu
# Полная пересборка с очисткой кеша
make docker rebuild
```
### Отправка в Docker Hub
```bash
# Отправка всех образов
make docker push
# Загрузка всех образов
make docker pull
```
### Очистка образов
```bash
# Очистка локальных образов
make docker clean
# Полная очистка Docker
make docker purge
```
### Информация об образах
```bash
# Информация о собранных образах
make docker info
# Диагностика проблем
make docker diagnose
```
## 🏗️ Multi-Arch поддержка
### Поддерживаемые архитектуры
| Архитектура | Описание | Статус |
|-------------|----------|--------|
| `linux/amd64` | Intel/AMD 64-bit | ✅ Поддерживается |
| `linux/arm64` | ARM 64-bit | ✅ Поддерживается |
| `linux/riscv64` | RISC-V 64-bit | ✅ Поддерживается |
| `linux/ppc64le` | PowerPC 64-bit LE | ✅ Поддерживается |
| `linux/s390x` | IBM Z 64-bit | ✅ Поддерживается |
| `linux/386` | Intel 32-bit | ✅ Поддерживается |
| `linux/arm/v7` | ARM 32-bit v7 | ✅ Поддерживается |
| `linux/arm/v6` | ARM 32-bit v6 | ✅ Поддерживается |
### Настройка builder'а
```bash
# Настройка multi-arch builder
make docker setup-builder
# Проверка builder'а
make docker diagnose
# Сброс builder'а при проблемах
make docker reset-builder
```
## 🚀 Использование в preset'ах
### Пример preset'а с собственными образами
```yaml
# molecule/presets/custom-images.yml
---
#description: Preset с собственными образами AnsibleLab
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# Собственные образы
images:
ubuntu: "inecs/ansible-lab:ubuntu-latest"
debian: "inecs/ansible-lab:debian-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos: "inecs/ansible-lab:centos-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
redos: "inecs/ansible-lab:redos-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
- name: ubuntu1
family: ubuntu
groups: [web, frontend]
- name: debian1
family: debian
groups: [web, frontend]
- name: rhel1
family: rhel
groups: [database, backend]
- name: centos1
family: centos
groups: [database, backend]
- name: alma1
family: alma
groups: [monitoring]
- name: rocky1
family: rocky
groups: [monitoring]
- name: alt1
family: alt
groups: [security]
- name: astra1
family: astra
groups: [security]
- name: redos1
family: redos
groups: [security]
```
### Тестирование с собственными образами
```bash
# Тестирование с собственными образами
make custom-images test full
# Проверка наличия образов
make custom-images check
# Сборка всех образов
make custom-images build
```
## 📊 Мониторинг и диагностика
### Проверка образов
```bash
# Проверка размера образов
docker images | grep inecs/ansible-lab
# Проверка архитектур
docker manifest inspect inecs/ansible-lab:ubuntu-latest
# Проверка содержимого образа
docker run --rm inecs/ansible-lab:ubuntu-latest cat /etc/os-release
```
### Логи сборки
```bash
# Подробные логи сборки
make docker build 2>&1 | tee build.log
# Логи конкретного образа
make docker build-image IMAGE=ubuntu 2>&1 | tee ubuntu-build.log
```
## 🐛 Troubleshooting
### Проблемы с сборкой
1. **Builder не создается:**
```bash
make docker diagnose
make docker reset-builder
```
2. **Образы не собираются:**
```bash
make docker clean
make docker setup-builder
make docker build
```
3. **Проблемы с multi-arch:**
```bash
make docker clean-builder
make docker setup-builder
```
### Проблемы с образами
1. **Образы не запускаются:**
```bash
# Проверка systemd
docker run --rm --privileged inecs/ansible-lab:ubuntu-latest systemctl status
# Проверка Docker
docker run --rm --privileged inecs/ansible-lab:ubuntu-latest docker --version
```
2. **Проблемы с правами:**
```bash
# Проверка пользователя ansible
docker run --rm inecs/ansible-lab:ubuntu-latest id ansible
# Проверка sudo прав
docker run --rm inecs/ansible-lab:ubuntu-latest sudo -l
```
## 📈 Производительность
### Оптимизация сборки
```bash
# Использование кеша Docker
make docker build
# Очистка кеша при проблемах
make docker rebuild
```
### Оптимизация образов
- **Многоэтапная сборка** для уменьшения размера
- **Кеширование слоев** для ускорения сборки
- **Минимальные базовые образы** для безопасности
- **Оптимизированные зависимости** для производительности
## 🔒 Безопасность
### Безопасность образов
- **Регулярные обновления** базовых образов
- **Минимальные права** для пользователей
- **Сканирование уязвимостей** в CI/CD
- **Подписанные образы** для целостности
### Лучшие практики
1. **Используйте конкретные теги** вместо `latest`
2. **Регулярно обновляйте** базовые образы
3. **Сканируйте образы** на уязвимости
4. **Используйте multi-arch** для совместимости
## 📚 Дополнительные ресурсы
- [Docker Multi-Arch Build](https://docs.docker.com/buildx/working-with-buildx/)
- [Ansible Collections](https://docs.ansible.com/ansible/latest/collections_guide/index.html)
- [Molecule Documentation](https://molecule.readthedocs.io/)
- [Systemd in Containers](https://systemd.io/CONTAINER_INTERFACE/)
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,52 +0,0 @@
# AlmaLinux с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# https://hub.docker.com/_/almalinux
FROM almalinux:8
# Обновляем систему
RUN dnf update -y && dnf upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN dnf install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python39 \
python39-pip \
sudo \
&& dnf clean all
# Создаем symlink для python3 -> python3.9
RUN ln -sf /usr/bin/python3.9 /usr/bin/python3
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
# && chmod +x /usr/local/bin/yq
# Устанавливаем Docker
# RUN dnf install -y dnf-plugins-core \
# && dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo \
# && dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,52 +0,0 @@
# ALT Linux с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# https://hub.docker.com/_/alt/tags
FROM alt:p9
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
dbus \
curl \
wget \
nano \
python3 \
sudo \
&& apt-get clean
# Устанавливаем pip для Python 3.7
RUN curl -sS https://bootstrap.pypa.io/pip/3.7/get-pip.py | python3
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
# && chmod +x /usr/local/bin/yq
# Устанавливаем Docker вручную для ALT Linux
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# && apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,93 +0,0 @@
# Ansible Controller с предустановленными коллекциями
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM ubuntu:22.04
# Обновляем систему
RUN apt-get update && apt-get upgrade -y && apt-get clean
# Устанавливаем Python и Ansible
RUN apt-get install -y \
python3 \
python3-pip \
python3-venv \
python3-dev \
build-essential \
&& apt-get clean
# Устанавливаем Ansible, ansible-lint и passlib для хеширования паролей
RUN pip3 install ansible ansible-core ansible-lint passlib
# Устанавливаем дополнительные пакеты
RUN apt-get install -y \
curl \
wget \
git \
vim \
nano \
htop \
tree \
jq \
&& apt-get clean
# Устанавливаем yq
RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
&& chmod +x /usr/local/bin/yq
# Устанавливаем Docker CLI
RUN apt-get install -y docker.io docker-compose
# Устанавливаем kubectl
RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" \
&& chmod +x kubectl \
&& mv kubectl /usr/local/bin/
# Устанавливаем Helm
RUN curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Устанавливаем Kind
RUN curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64 \
&& chmod +x ./kind \
&& mv ./kind /usr/local/bin/
## Устанавливаем Istio CLI
#RUN curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.22.1 sh - \
# && mv istio-1.22.1/bin/istioctl /usr/local/bin/ \
# && rm -rf istio-1.22.1
# Копируем файлы зависимостей
COPY requirements.yml /tmp/requirements.yml
COPY requirements.txt /tmp/requirements.txt
# Устанавливаем Python зависимости
RUN pip3 install -r /tmp/requirements.txt
# Устанавливаем Ansible коллекции
RUN ansible-galaxy collection install -r /tmp/requirements.yml
# Создаем пользователя ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Создаем рабочую директорию
WORKDIR /ansible
# Устанавливаем права
RUN chown -R ansible:ansible /ansible
# Переключаемся на пользователя ansible
USER ansible
# Устанавливаем дополнительные роли
RUN ansible-galaxy install geerlingguy.docker \
&& ansible-galaxy install geerlingguy.kubernetes
# Настройки для работы с Docker
ENV DOCKER_HOST=unix:///var/run/docker.sock
ENV ANSIBLE_FORCE_COLOR=1
ENV ANSIBLE_STDOUT_CALLBACK=yaml
ENV ANSIBLE_CALLBACKS_ENABLED=profile_tasks
# Команда по умолчанию
CMD ["sleep", "infinity"]

View File

@@ -1,22 +0,0 @@
version: "3.9"
services:
ansible-controller:
image: inecs/ansible-lab:ansible-controller-latest
container_name: ansible-controller
privileged: true
command: sleep infinity
environment:
DOCKER_HOST: unix:///var/run/docker.sock
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault/.vault
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- .:/ansible
working_dir: /ansible
networks:
- labnet
networks:
labnet:
external: true

View File

@@ -1,9 +0,0 @@
# Python зависимости для Ansible Controller
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Основные зависимости для работы с паролями
passlib>=1.7.4
# Дополнительные зависимости для безопасности
bcrypt>=4.0.1

View File

@@ -1,9 +0,0 @@
---
# Ansible Collections for Molecule Universal
collections:
- name: community.docker
version: ">=3.0.0"
- name: community.general
version: ">=7.0.0"
- name: ansible.posix
version: ">=1.5.4"

View File

@@ -1,70 +0,0 @@
# Astra Linux с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# https://registry.astralinux.ru/browse/library/
# ВАЖНО: Базовый образ поддерживает только linux/amd64
# Для сборки используйте: docker buildx build --platform linux/amd64
FROM registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& apt-get clean
# Устанавливаем yq (автоопределение архитектуры)
# RUN ARCH=$(dpkg --print-architecture | sed 's/amd64/amd64/; s/arm64/arm64/; s/aarch64/arm64/') && \
# wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
# chmod +x /usr/local/bin/yq
# Устанавливаем Docker вручную для AstraLinux (автоопределение архитектуры)
# RUN ARCH=$(dpkg --print-architecture) && \
# apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# lsb-release && \
# mkdir -p /usr/share/keyrings && \
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
# echo "deb [arch=${ARCH} signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian buster stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
# apt-get update && \
# apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin && \
# apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Отключаем Parsec для работы в контейнере
RUN if [ -f /etc/parsec/parsec.conf ]; then \
sed -i 's/enabled=1/enabled=0/' /etc/parsec/parsec.conf || true; \
fi && \
if [ -f /lib/modules/$(uname -r)/parsec.ko ]; then \
mv /lib/modules/$(uname -r)/parsec.ko /lib/modules/$(uname -r)/parsec.ko.disabled || true; \
fi && \
systemctl disable parsec 2>/dev/null || true
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,50 +0,0 @@
# CentOS 7 с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM centos:7
# Настраиваем vault репозитории для CentOS 7 (так как основные репозитории больше не поддерживаются)
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo && \
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo
# Обновляем систему
RUN yum update -y && yum upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN yum install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& yum clean all
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
# && chmod +x /usr/local/bin/yq
# Устанавливаем Docker
# RUN curl -fsSL https://get.docker.com | sh
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,50 +0,0 @@
# CentOS 8 с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM quay.io/centos/centos:8
# Настраиваем vault репозитории для CentOS 8 (так как основные репозитории больше не поддерживаются)
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo && \
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo
# Обновляем систему
RUN dnf update -y && dnf upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN dnf install -y --allowerasing \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& dnf clean all
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
# && chmod +x /usr/local/bin/yq
# Устанавливаем Docker
# RUN curl -fsSL https://get.docker.com | sh
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,46 +0,0 @@
# CentOS с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM quay.io/centos/centos:stream9
# Обновляем систему
RUN dnf update -y && dnf upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN dnf install -y --allowerasing \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& dnf clean all
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
# && chmod +x /usr/local/bin/yq
# Устанавливаем Docker
# RUN curl -fsSL https://get.docker.com | sh
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,62 +0,0 @@
# Debian 10 Buster с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM debian:10
# Устанавливаем переменные окружения для автоматического ответа на запросы
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
# Настраиваем archive репозитории для Debian 10 (так как основные репозитории больше не поддерживаются)
RUN sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list && \
sed -i 's|http://security.debian.org/debian-security|http://archive.debian.org/debian-security|g' /etc/apt/sources.list && \
echo "deb http://archive.debian.org/debian buster main" > /etc/apt/sources.list && \
echo "deb http://archive.debian.org/debian-security buster/updates main" >> /etc/apt/sources.list
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& apt-get clean
# Устанавливаем Docker вручную для Debian
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# lsb-release \
# && mkdir -p /usr/share/keyrings \
# && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
# && apt-get update \
# && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
# && apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,56 +0,0 @@
# Debian 11 Bullseye с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM debian:11
# Устанавливаем переменные окружения для автоматического ответа на запросы
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& apt-get clean
# Устанавливаем Docker вручную для Debian
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# lsb-release \
# && mkdir -p /usr/share/keyrings \
# && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
# && apt-get update \
# && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
# && apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,56 +0,0 @@
# Debian 12 Bookworm с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM debian:bookworm
# Устанавливаем переменные окружения для автоматического ответа на запросы
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& apt-get clean
# Устанавливаем Docker вручную для Debian
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# lsb-release \
# && mkdir -p /usr/share/keyrings \
# && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
# && apt-get update \
# && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
# && apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,62 +0,0 @@
# Debian 9 Stretch с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM debian:9
# Устанавливаем переменные окружения для автоматического ответа на запросы
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
# Настраиваем archive репозитории для Debian 9 (так как основные репозитории больше не поддерживаются)
RUN sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list && \
sed -i 's|http://security.debian.org/debian-security|http://archive.debian.org/debian-security|g' /etc/apt/sources.list && \
echo "deb http://archive.debian.org/debian stretch main" > /etc/apt/sources.list && \
echo "deb http://archive.debian.org/debian-security stretch/updates main" >> /etc/apt/sources.list
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& apt-get clean
# Устанавливаем Docker вручную для Debian
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# lsb-release \
# && mkdir -p /usr/share/keyrings \
# && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
# && apt-get update \
# && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
# && apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,73 +0,0 @@
# Kubernetes Kind Container - Multi-Arch
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
ARG TARGETARCH
FROM ubuntu:22.04
# Обновляем систему
RUN apt-get update && apt-get upgrade -y && apt-get clean
# Устанавливаем базовые пакеты
RUN apt-get install -y \
wget \
curl \
git \
vim \
bash \
ca-certificates \
python3 \
python3-yaml \
file \
apt-transport-https \
gnupg \
lsb-release \
&& apt-get clean
# Устанавливаем Docker CLI
RUN DOCKER_VERSION=20.10.24 && \
if [ "${TARGETARCH}" = "amd64" ]; then \
wget -O /tmp/docker-cli.tgz "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz" && \
tar -xz -C /tmp -f /tmp/docker-cli.tgz && \
mv /tmp/docker/docker /usr/local/bin/ && \
rm -rf /tmp/docker-cli.tgz /tmp/docker; \
else \
wget -O /tmp/docker-cli.tgz "https://download.docker.com/linux/static/stable/aarch64/docker-${DOCKER_VERSION}.tgz" && \
tar -xz -C /tmp -f /tmp/docker-cli.tgz && \
mv /tmp/docker/docker /usr/local/bin/ && \
rm -rf /tmp/docker-cli.tgz /tmp/docker; \
fi && \
chmod +x /usr/local/bin/docker
# Устанавливаем kubectl
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl"; \
else \
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/arm64/kubectl"; \
fi && \
chmod +x kubectl && \
mv kubectl /usr/local/bin/
# Устанавливаем Helm
RUN wget https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 -O - | bash
# Устанавливаем Kind v0.30.0
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
wget -O /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.30.0/kind-linux-amd64"; \
else \
wget -O /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.30.0/kind-linux-arm64"; \
fi && \
chmod +x /usr/local/bin/kind && \
ls -lh /usr/local/bin/kind && \
file /usr/local/bin/kind
# Устанавливаем Istio CLI
RUN ARCH=$(echo ${TARGETARCH} | sed 's/amd64/x86_64/; s/arm64/aarch64/') && \
ISTIO_VERSION=1.22.1 && \
wget -qO- https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} TARGET_ARCH=${ARCH} sh - && \
mv istio-${ISTIO_VERSION}/bin/istioctl /usr/local/bin/ && \
rm -rf istio-${ISTIO_VERSION}
# Команда по умолчанию
CMD ["sleep", "infinity"]

View File

@@ -1,54 +0,0 @@
# RED OS с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# https://registry.red-soft.ru/ubi7/ubi/tags
# docker search registry.red-soft.ru/ubi7/ubi
# ВАЖНО: Базовый образ поддерживает только linux/amd64
# Для сборки используйте: docker buildx build --platform linux/amd64
FROM registry.red-soft.ru/ubi7/ubi
# Обновляем систему
RUN dnf update -y && dnf upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN dnf install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& dnf clean all
# Устанавливаем yq (автоопределение архитектуры)
# RUN ARCH=$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/') && \
# wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
# chmod +x /usr/local/bin/yq
# Устанавливаем Docker вручную для RED OS
# RUN dnf install -y dnf-plugins-core \
# && dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo \
# && dnf install -y docker-ce docker-ce-cli containerd.io \
# && dnf clean all
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,49 +0,0 @@
# RHEL с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM registry.access.redhat.com/ubi8/ubi
# Обновляем систему
RUN dnf update -y && dnf upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN dnf install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python39 \
python39-pip \
sudo \
&& dnf clean all
# Создаем symlink для python3 -> python3.9
RUN ln -sf /usr/bin/python3.9 /usr/bin/python3
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
# && chmod +x /usr/local/bin/yq
# Устанавливаем Docker
# RUN curl -fsSL https://get.docker.com | sh
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,54 +0,0 @@
# Rocky Linux с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM rockylinux:9
# Обновляем систему
RUN dnf update -y && dnf upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN dnf install -y --allowerasing \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
python3-devel \
sudo \
&& dnf clean all
# Устанавливаем более новую версию Python через pip если нужно
RUN python3 -m pip install --upgrade pip
# Устанавливаем yq (автоматически определяем архитектуру)
# RUN ARCH=$(uname -m) && \
# if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; elif [ "$ARCH" = "aarch64" ]; then ARCH="arm64"; fi && \
# wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
# chmod +x /usr/local/bin/yq
# Устанавливаем Docker
# RUN dnf install -y dnf-plugins-core \
# && dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo \
# && dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,56 +0,0 @@
# Ubuntu 20.04 с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM ubuntu:20.04
# Устанавливаем переменные окружения для автоматического ответа на запросы
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& apt-get clean
# Устанавливаем Docker вручную для Ubuntu
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# lsb-release \
# && mkdir -p /usr/share/keyrings \
# && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
# && apt-get update \
# && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
# && apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,56 +0,0 @@
# Ubuntu 22.04 с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM ubuntu:22.04
# Устанавливаем переменные окружения для автоматического ответа на запросы
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& apt-get clean
# Устанавливаем Docker вручную для Ubuntu
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# lsb-release \
# && mkdir -p /usr/share/keyrings \
# && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
# && apt-get update \
# && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
# && apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,56 +0,0 @@
# Ubuntu 24.04 с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
FROM ubuntu:24.04
# Устанавливаем переменные окружения для автоматического ответа на запросы
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
&& apt-get clean
# Устанавливаем Docker вручную для Ubuntu
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# lsb-release \
# && mkdir -p /usr/share/keyrings \
# && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
# && apt-get update \
# && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
# && apt-get clean
# Устанавливаем Docker Compose
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
# && chmod +x /usr/local/bin/docker-compose
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,169 +0,0 @@
# Пресет all-images - Тестирование всех образов
## Описание
Пресет `all-images` предназначен для комплексного тестирования Ansible ролей на всех доступных операционных системах проекта. Это самый полный пресет, который включает все 16 образов:
### Включенные образы
#### Debian-based системы:
- **Ubuntu 20.04** (ubuntu20-test) - порт 8080
- **Ubuntu 22.04** (ubuntu22-test) - порт 8081
- **Ubuntu 24.04** (ubuntu24-test) - порт 8082
- **Debian 9** (debian9-test) - порт 8083
- **Debian 10** (debian10-test) - порт 8084
- **Debian 11** (debian11-test) - порт 8085
- **Debian 12** (debian12-test) - порт 8086
- **Alt Linux** (alt-test) - порт 8087
- **Astra Linux** (astra-test) - порт 8088
#### RHEL-based системы:
- **CentOS 7** (centos7-test) - порт 8090
- **CentOS 8** (centos8-test) - порт 8091
- **CentOS 9** (centos9-test) - порт 8092
- **RHEL** (rhel-test) - порт 8085
- **AlmaLinux** (alma-test) - порт 8086
- **Rocky Linux** (rocky-test) - порт 8087
- **RedOS** (redos-test) - порт 8088
## Использование
### Запуск тестирования всех образов
```bash
# Тестирование всех образов
make role test all-images
```
### Предварительные требования
1. **Собранные образы** - все образы должны быть собраны:
```bash
make docker build
```
2. **Достаточно ресурсов** - тест запускает 16 контейнеров одновременно, требуется:
- Минимум 16GB RAM
- Минимум 8 CPU cores
- Достаточно места на диске
### Особенности
#### Порты
Каждый контейнер использует уникальный порт для доступа:
- Ubuntu 20.04: `localhost:8080`
- Ubuntu 22.04: `localhost:8081`
- Ubuntu 24.04: `localhost:8082`
- Debian 9: `localhost:8083`
- Debian 10: `localhost:8084`
- Debian 11: `localhost:8085`
- Debian 12: `localhost:8086`
- Alt Linux: `localhost:8087`
- Astra Linux: `localhost:8088`
- CentOS 7: `localhost:8090`
- CentOS 8: `localhost:8091`
- CentOS 9: `localhost:8092`
- RHEL: `localhost:8085`
- AlmaLinux: `localhost:8086`
- Rocky Linux: `localhost:8087`
- RedOS: `localhost:8088`
#### Переменные окружения
Каждый контейнер получает переменные:
- `TEST_OS` - название ОС
- `TEST_FAMILY` - семейство ОС (Debian/RedHat/Altlinux/Astra Linux)
#### Специальные настройки
- **Astra Linux**: автоматическое отключение Parsec
- **Все образы**: предустановленный sudo с настройкой sudoers
- **Systemd**: полная поддержка systemd в контейнерах
## Производительность
### Время выполнения
- **Создание контейнеров**: ~2-3 минуты
- **Тестирование ролей**: зависит от сложности ролей
- **Очистка**: ~30 секунд
### Ресурсы
- **RAM**: 16-32GB (рекомендуется)
- **CPU**: 8-16 cores
- **Диск**: 20-40GB свободного места
## Отладка
### Проверка статуса контейнеров
```bash
# Список запущенных контейнеров
docker ps --filter "network=labnet"
# Логи конкретного контейнера
docker logs ubuntu-test
docker logs astra-test
```
### Проблемы и решения
#### Контейнеры не запускаются
1. Проверьте, что образы собраны:
```bash
docker images | grep inecs/ansible-lab
```
2. Пересоберите образы:
```bash
make docker rebuild
```
#### Astra Linux перезапускается
- Проблема решена в Dockerfile (отключение Parsec)
- Если проблема остается, проверьте логи:
```bash
docker logs astra-test
```
#### Нехватка ресурсов
- Уменьшите количество контейнеров в пресете
- Используйте пресет `minimal` для быстрого тестирования
## Альтернативные пресеты
Если `all-images` слишком ресурсоемкий, используйте:
- `minimal` - 1 контейнер (Debian)
- `default` - 2 контейнера (Debian + RHEL)
- `multi-os` - 12 контейнеров (разные ОС)
## Мониторинг
### Логи тестирования
```bash
# Просмотр логов ansible-controller
docker logs ansible-controller
# Логи конкретного playbook
tail -f /tmp/molecule_workspace/logs/ansible.log
```
### Метрики производительности
- Время выполнения каждого этапа
- Использование ресурсов
- Количество успешных/неудачных тестов
## Интеграция с CI/CD
Пресет `all-images` идеально подходит для:
- **GitHub Actions** - полное тестирование на всех ОС
- **GitLab CI** - комплексная проверка совместимости
- **Jenkins** - автоматическое тестирование релизов
### Пример для GitHub Actions
```yaml
- name: Test all images
run: make role test all-images
timeout-minutes: 30
```
## Заключение
Пресет `all-images` обеспечивает максимальное покрытие тестирования, гарантируя совместимость Ansible ролей со всеми поддерживаемыми операционными системами. Это критически важно для production-окружений с разнородной инфраструктурой.

616
docs/api.md Normal file
View File

@@ -0,0 +1,616 @@
# API Reference
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Описание
Этот документ содержит справочник по API универсальной лаборатории, включая все доступные команды, параметры и конфигурации.
## Содержание
- [Makefile команды](#makefile-команды)
- [Пресеты API](#пресеты-api)
- [Kubernetes API](#kubernetes-api)
- [Docker API](#docker-api)
- [Molecule API](#molecule-api)
- [Отчеты API](#отчеты-api)
- [Скрипты API](#скрипты-api)
## Makefile команды
### Основные команды
| Команда | Описание | Параметры |
|---------|----------|-----------|
| `make lab-up` | Поднять контроллер | - |
| `make lab-down` | Погасить контроллер | - |
| `make lab-sh` | Войти в контроллер | - |
| `make lab-test` | Полный цикл Molecule | `SCENARIO=universal` |
| `make lab-create` | Создать инфраструктуру | - |
| `make lab-converge` | Запустить роли | - |
| `make lab-verify` | Проверить работу | - |
| `make lab-destroy` | Уничтожить инфраструктуру | - |
| `make lab-reset` | Полный сброс | - |
### Kubernetes команды
| Команда | Описание | Параметры |
|---------|----------|-----------|
| `make kube-sh` | Shell с kubectl | - |
| `make kube-cmd` | Выполнить kubectl команду | `CLUSTER=lab CMD="get pods"` |
| `make kube-enter` | Войти в кластер | `CLUSTER=lab` |
| `make kiali-port-forward` | Port-forward Kiali | `CLUSTER=lab` |
| `make istio-gw-port-forward` | Port-forward Istio Gateway | `CLUSTER=lab` |
| `make grafana-port-forward` | Port-forward Grafana | `CLUSTER=lab` |
| `make prom-port-forward` | Port-forward Prometheus | `CLUSTER=lab` |
| `make kube-pf-stop` | Остановить все port-forward | - |
### Отчеты и мониторинг
| Команда | Описание | Параметры |
|---------|----------|-----------|
| `make lab-report` | Сгенерировать HTML отчет | - |
| `make lab-snapshot` | Сохранить снапшот | - |
| `make lab-restore` | Восстановить из снапшота | - |
| `make lab-cleanup` | Очистить лабораторию | - |
| `make bookinfo-url` | Получить URL Bookinfo | - |
| `make grafana-open` | Открыть Grafana | - |
### Pre-commit команды
| Команда | Описание | Параметры |
|---------|----------|-----------|
| `make pre-commit-install` | Установить pre-commit хуки | - |
| `make pre-commit-run` | Запустить pre-commit | - |
## Пресеты API
### Структура пресета
```yaml
---
# ПРЕСЕТ: Название (количество машин)
#
# Описание: Подробное описание пресета
#
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/your-preset.yml
#
# Автор: Ваше имя
# Сайт: https://your-site.com
# Сеть для лаборатории
docker_network: labnet
# Kind кластеры (опционально)
kind_clusters:
- name: cluster-name
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"
# Определение хостов лаборатории
hosts:
- name: host-name
family: debian|rhel
type: systemd|dind|dood
group: group-name
publish:
- "host-port:container-port"
env:
KEY: value
volumes:
- "host-path:container-path"
tmpfs:
- "/tmp"
capabilities:
- "SYS_ADMIN"
```
### Параметры хостов
| Параметр | Тип | Описание | Обязательный |
|----------|-----|----------|--------------|
| `name` | string | Имя хоста | Да |
| `family` | string | Семейство ОС (debian/rhel) | Нет |
| `type` | string | Тип контейнера (systemd/dind/dood) | Нет |
| `group` | string | Группа хоста | Нет |
| `publish` | array | Публикация портов | Нет |
| `env` | object | Переменные окружения | Нет |
| `volumes` | array | Монтирование томов | Нет |
| `tmpfs` | array | Временные файловые системы | Нет |
| `capabilities` | array | Capabilities | Нет |
### Параметры Kind кластеров
| Параметр | Тип | Описание | Обязательный |
|----------|-----|----------|--------------|
| `name` | string | Имя кластера | Да |
| `workers` | integer | Количество worker узлов | Нет |
| `api_port` | integer | Порт API сервера | Нет |
| `addons` | object | Включенные аддоны | Нет |
| `ingress_host_http_port` | integer | HTTP порт для ingress | Нет |
| `ingress_host_https_port` | integer | HTTPS порт для ingress | Нет |
### Аддоны Kind кластеров
| Аддон | Тип | Описание |
|-------|-----|----------|
| `ingress_nginx` | boolean | Ingress NGINX контроллер |
| `metrics_server` | boolean | Metrics Server для метрик |
| `istio` | boolean | Istio service mesh |
| `kiali` | boolean | Kiali для визуализации |
| `prometheus_stack` | boolean | Prometheus + Grafana |
## Kubernetes API
### kubectl команды
```bash
# Получить информацию о кластере
kubectl cluster-info
# Получить ноды
kubectl get nodes
# Получить поды
kubectl get pods -A
# Получить сервисы
kubectl get svc -A
# Получить события
kubectl get events --sort-by=.metadata.creationTimestamp
# Описать ресурс
kubectl describe pod <pod-name>
# Логи пода
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
# Port-forward сервиса
kubectl port-forward svc/<service-name> <local-port>:<remote-port>
# Port-forward пода
kubectl port-forward pod/<pod-name> <local-port>:<remote-port>
# Port-forward в фоне
kubectl port-forward svc/<service-name> <local-port>:<remote-port> &
# Остановить все port-forward
pkill -f "kubectl .* port-forward"
```
### Istio команды
```bash
# Проверить Istio
istioctl version
# Установить Istio
istioctl install --set profile=demo
# Удалить Istio
istioctl uninstall --purge
# Проверить статус
istioctl proxy-status
# Получить конфигурацию
istioctl proxy-config cluster <pod-name>
```
## Docker API
### Docker команды
```bash
# Список контейнеров
docker ps
# Список образов
docker images
# Список сетей
docker network ls
# Список томов
docker volume ls
# Информация о контейнере
docker inspect <container-name>
# Логи контейнера
docker logs <container-name>
# Войти в контейнер
docker exec -it <container-name> /bin/sh
```
### Docker Compose команды
```bash
# Запустить стек
docker-compose up -d
# Остановить стек
docker-compose down
# Логи стека
docker-compose logs
# Масштабирование
docker-compose up --scale service=3
```
### Docker Swarm команды
```bash
# Инициализировать Swarm
docker swarm init
# Присоединиться к Swarm
docker swarm join --token <token> <manager-ip>:2377
# Список нод
docker node ls
# Создать сервис
docker service create --name <service-name> <image>
# Масштабировать сервис
docker service scale <service-name>=3
```
## Molecule API
### Molecule команды
```bash
# Создать сценарий
molecule init scenario <scenario-name>
# Создать роль
molecule init role <role-name>
# Проверить синтаксис
molecule syntax
# Проверить конфигурацию
molecule lint
# Валидация
molecule validate
# Создать инфраструктуру
molecule create
# Запустить роли
molecule converge
# Проверить работу
molecule verify
# Уничтожить инфраструктуру
molecule destroy
# Полный цикл
molecule test
```
### Конфигурация molecule.yml
```yaml
---
driver:
name: docker
platforms:
- name: instance
image: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
privileged: true
pre_build_image: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
capabilities:
- "SYS_ADMIN"
tmpfs:
- "/run"
- "/run/lock"
provisioner:
name: ansible
config_options:
defaults:
stdout_callback: default
callbacks_enabled: profile_tasks
env:
ANSIBLE_STDOUT_CALLBACK: default
dependency:
name: galaxy
enabled: false
verifier:
name: ansible
lint: |-
set -e
ansible-lint
```
## Отчеты API
### HTML отчет
```bash
# Генерация отчета
python3 scripts/report_html.py <input.json> <output.html>
# Параметры
# input.json - JSON файл с данными
# output.html - HTML файл для вывода
```
### JSON структура
```json
{
"timestamp": "2024-01-01T00:00:00Z",
"idempotence_raw": "changed=0",
"haproxy_select1": "1",
"helm_ingress_toolbox_raw": "ingress ready",
"istio_kiali_raw": "istio-system pods running",
"istio_bookinfo_raw": "bookinfo deployed",
"k8s_overview_raw": "nodes ready"
}
```
### HTML структура
```html
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Lab Report</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
/* CSS стили */
</style>
</head>
<body>
<div class="container">
<div class="hdr">
<h1>Ansible Lab Report</h1>
<div class="time">generated: timestamp</div>
</div>
<div class="grid">
<!-- Отчеты -->
</div>
</div>
</body>
</html>
```
## Скрипты API
### snapshot.sh
```bash
#!/usr/bin/env bash
# Создание снапшотов лаборатории (запускается через Docker)
# Параметры
OUT_DIR="/ansible/snapshots"
# Создать директорию
mkdir -p "$OUT_DIR"
# Получить ID контейнеров
ids=$(docker ps -q --filter "label=ansible.lab=true")
# Создать снапшоты
for id in $ids; do
name=$(docker inspect --format '{{.Name}}' "$id" | sed 's#^/##')
img="lab-snap-$name:latest"
echo "[snapshot] $name -> $img"
docker commit "$id" "$img" >/dev/null
echo "$img" > "$OUT_DIR/$name.image"
done
```
### restore.sh
```bash
#!/usr/bin/env bash
# Восстановление из снапшотов (запускается через Docker)
# Параметры
IN_DIR="/ansible/snapshots"
# Проверить директорию
[ -d "$IN_DIR" ] || { echo "No snapshots dir"; exit 1; }
# Восстановить контейнеры
for f in "$IN_DIR"/*.image; do
[ -f "$f" ] || continue
name=$(basename "$f" .image)
img=$(cat "$f")
echo "[restore] $name from $img"
docker rm -f "$name" >/dev/null 2>&1 || true
docker run -d --name "$name" "$img" >/dev/null
done
```
### cleanup.sh
```bash
#!/usr/bin/env bash
# Очистка лаборатории (запускается через Docker)
echo "[cleanup] removing lab containers/volumes/networks"
# Удалить контейнеры
docker ps -aq --filter "label=ansible.lab=true" | xargs -r docker rm -f
# Удалить тома
docker volume ls -q --filter "name=_docker$" | xargs -r docker volume rm
# Удалить сеть
docker network rm labnet >/dev/null 2>&1 || true
echo "done."
```
## Переменные окружения
### Основные переменные
| Переменная | Описание | Значение по умолчанию |
|------------|----------|----------------------|
| `LAB_SPEC` | Путь к пресету | `molecule/presets/minimal.yml` |
| `SCENARIO` | Сценарий Molecule | `universal` |
| `COMPOSE` | Docker Compose команда | `docker compose` |
| `ROLES_DIR` | Директория с ролями | `./roles` |
| `LAB_PAUSE_MINUTES` | Пауза для ручной проверки | `10` |
### Kubernetes переменные
| Переменная | Описание | Значение по умолчанию |
|------------|----------|----------------------|
| `KUBECONFIG` | Путь к kubeconfig | `~/.kube/config` |
| `KUBE_CONTEXT` | Контекст Kubernetes | `kind-lab` |
| `ISTIO_VERSION` | Версия Istio | `1.22.1` |
| `KIND_VERSION` | Версия Kind | `v0.23.0` |
### Docker переменные
| Переменная | Описание | Значение по умолчанию |
|------------|----------|----------------------|
| `DOCKER_HOST` | Docker daemon адрес | `unix:///var/run/docker.sock` |
| `DOCKER_TLS_CERTDIR` | Директория TLS сертификатов | `""` |
| `DOCKER_BUILDKIT` | Использовать BuildKit | `1` |
## Конфигурационные файлы
### docker-compose.yaml
```yaml
version: "3.9"
services:
ansible-controller:
image: quay.io/ansible/creator-ee:latest
container_name: ansible-controller
privileged: true
command: sleep infinity
environment:
DOCKER_HOST: unix:///var/run/docker.sock
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault-password.txt
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./molecule:/ansible/molecule
- ./files:/ansible/files
- ./vault-password.txt:/ansible/vault-password.txt
- ${ROLES_DIR:-./roles}:/ansible/roles:ro
working_dir: /ansible
```
### .pre-commit-config.yaml
```yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/ansible/ansible-lint
rev: v6.17.2
hooks:
- id: ansible-lint
```
## Заключение
Этот справочник содержит все необходимые API для работы с универсальной лабораторией. Для получения дополнительной информации обратитесь к [основной документации](universal-lab.md) и [примерам использования](examples.md).

View File

@@ -1,98 +0,0 @@
# Исправления проблем с Docker Buildx
## Проблема
Команда `docker buildx ls` часто зависает в CI/CD окружениях из-за:
- Мертвых Docker контекстов (tcp://...)
- Проблем с доступом к registry
- Недостаточных привилегий
- Старых/битых builder'ов
## Решение
### 1. Замена `buildx ls` на `buildx inspect`
**Было:**
```bash
if ! docker buildx ls | grep -q $(DOCKER_BUILDX_BUILDER); then
```
**Стало:**
```bash
if docker buildx inspect $(DOCKER_BUILDX_BUILDER) >/dev/null 2>&1; then
```
### 2. Новые надежные функции
#### `docker-check-builder`
- Проверяет существование builder'а через `inspect`
- Не зависает на мертвых контекстах
- Возвращает четкий статус
#### `docker-create-builder`
- Предварительная загрузка образа `moby/buildkit:buildx-stable-1`
- Очистка старых builder'ов
- Явное указание образа buildkit
- Проверка готовности через `inspect --bootstrap`
#### `docker-diagnose-buildx`
- Полная диагностика проблем с buildx
- Проверка версий Docker и Buildx
- Поиск мертвых контекстов
- Проверка доступа к registry
- Проверка Docker socket
- Рекомендации по устранению
#### `docker-reset-builder`
- Полная очистка и пересоздание builder'а
- Удаление buildkit контейнеров
- Создание нового builder'а с предварительной загрузкой
### 3. Обновленные команды
#### `make docker setup-builder`
- Использует `docker-check-builder` вместо `buildx ls`
- Безопасное создание builder'а
- Предварительная загрузка образа
#### `make docker clean-builder`
- Теперь использует `docker-reset-builder`
- Полная очистка buildkit контейнеров
#### Новые команды:
- `make docker diagnose` - диагностика проблем
- `make docker reset-builder` - сброс builder'а
### 4. Преимущества
**Нет зависаний** - не использует `buildx ls`
**Быстрая диагностика** - четкие сообщения об ошибках
**Предварительная загрузка** - избегает проблем с pull в bootstrap
**Полная очистка** - удаляет все связанные контейнеры
**Подробные логи** - понятные сообщения о процессе
### 5. Использование
```bash
# Диагностика проблем
make docker diagnose
# Сброс builder'а при проблемах
make docker reset-builder
# Обычная настройка (теперь безопасная)
make docker setup-builder
# Сборка образов
make docker build
```
### 6. Рекомендации для CI/CD
1. **Используйте `docker-diagnose-buildx`** при проблемах
2. **Настройте прокси** для доступа к registry
3. **Очищайте мертвые контексты** регулярно
4. **Используйте `docker-reset-builder`** при зависаниях
5. **Проверяйте права доступа** к Docker socket
## Автор
Сергей Антропов
Сайт: https://devops.org.ru

View File

@@ -1,913 +0,0 @@
# Настройка CI/CD для AnsibleLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## 🚀 GitHub Actions
### Базовая конфигурация
**`.github/workflows/ansible-test.yml`:**
```yaml
name: Ansible Testing
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run lint
run: make role lint
test:
runs-on: ubuntu-latest
needs: lint
strategy:
matrix:
preset: [minimal, default, performance]
steps:
- uses: actions/checkout@v4
- name: Setup Docker
run: |
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Run tests
run: make role test ${{ matrix.preset }}
deploy-check:
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Check deployment
run: make role deploy
env:
ANSIBLE_HOST_KEY_CHECKING: false
```
### Продвинутая конфигурация
**`.github/workflows/ansible-advanced.yml`:**
```yaml
name: Advanced Ansible Testing
on: [push, pull_request]
env:
ANSIBLE_FORCE_COLOR: 'true'
DOCKER_TLS_CERTDIR: ''
jobs:
detect-roles:
runs-on: ubuntu-latest
outputs:
roles: ${{ steps.detect.outputs.roles }}
steps:
- uses: actions/checkout@v4
- name: Detect new roles
id: detect
run: |
echo "roles=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' ')" >> $GITHUB_OUTPUT
update-playbooks:
runs-on: ubuntu-latest
needs: detect-roles
steps:
- uses: actions/checkout@v4
- name: Update playbooks
run: |
chmod +x scripts/update-playbooks.sh
./scripts/update-playbooks.sh
- name: Commit changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add molecule/default/site.yml roles/deploy.yml
git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
git push
lint:
runs-on: ubuntu-latest
needs: update-playbooks
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run lint
run: make role lint
test:
runs-on: ubuntu-latest
needs: [update-playbooks, lint]
strategy:
matrix:
preset: [minimal, default, performance]
steps:
- uses: actions/checkout@v4
- name: Setup Docker
run: |
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Run tests
run: make role test ${{ matrix.preset }}
deploy-check:
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Check deployment
run: make role deploy
env:
ANSIBLE_HOST_KEY_CHECKING: false
notify:
runs-on: ubuntu-latest
needs: [lint, test, deploy-check]
if: always()
steps:
- name: Notify on success
if: needs.lint.result == 'success' && needs.test.result == 'success'
run: |
echo "✅ All tests passed for new roles"
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
- name: Notify on failure
if: needs.lint.result == 'failure' || needs.test.result == 'failure'
run: |
echo "❌ Tests failed for new roles"
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
```
## 🏢 Azure DevOps
### Базовая конфигурация
**`azure-pipelines.yml`:**
```yaml
trigger:
- main
- develop
pool:
vmImage: 'ubuntu-latest'
variables:
ANSIBLE_FORCE_COLOR: 'true'
DOCKER_TLS_CERTDIR: ''
stages:
- stage: Lint
displayName: 'Lint Stage'
jobs:
- job: LintJob
displayName: 'Run Lint'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
- script: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
make role lint
displayName: 'Run Ansible Lint'
- stage: Test
displayName: 'Test Stage'
dependsOn: Lint
jobs:
- job: TestJob
displayName: 'Run Tests'
strategy:
matrix:
minimal:
preset: minimal
default:
preset: default
performance:
preset: performance
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
- script: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
make role test $(preset)
displayName: 'Run Molecule Tests'
env:
PRESET: $(preset)
- stage: Deploy
displayName: 'Deploy Stage'
dependsOn: Test
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- job: DeployJob
displayName: 'Check Deployment'
steps:
- script: make role deploy
displayName: 'Check Deployment'
env:
ANSIBLE_HOST_KEY_CHECKING: false
```
### Продвинутая конфигурация
**`azure-pipelines-advanced.yml`:**
```yaml
trigger:
- main
- develop
pool:
vmImage: 'ubuntu-latest'
variables:
ANSIBLE_FORCE_COLOR: 'true'
DOCKER_TLS_CERTDIR: ''
stages:
- stage: Detect
displayName: 'Detect Roles'
jobs:
- job: DetectJob
displayName: 'Detect New Roles'
steps:
- script: |
echo "##vso[task.setvariable variable=roles;isOutput=true]$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' ')"
displayName: 'Detect Roles'
name: detect
- stage: Update
displayName: 'Update Playbooks'
dependsOn: Detect
jobs:
- job: UpdateJob
displayName: 'Update Playbooks'
steps:
- script: |
chmod +x scripts/update-playbooks.sh
./scripts/update-playbooks.sh
displayName: 'Update Playbooks'
- script: |
git config --local user.email "action@azure.com"
git config --local user.name "Azure DevOps"
git add molecule/default/site.yml deploy.yml
git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
git push
displayName: 'Commit Changes'
- stage: Lint
displayName: 'Lint Stage'
dependsOn: Update
jobs:
- job: LintJob
displayName: 'Run Lint'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
- script: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
make role lint
displayName: 'Run Ansible Lint'
- stage: Test
displayName: 'Test Stage'
dependsOn: [Update, Lint]
jobs:
- job: TestJob
displayName: 'Run Tests'
strategy:
matrix:
minimal:
preset: minimal
default:
preset: default
performance:
preset: performance
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
- script: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
make role test $(preset)
displayName: 'Run Molecule Tests'
env:
PRESET: $(preset)
- stage: Deploy
displayName: 'Deploy Stage'
dependsOn: [Lint, Test]
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- job: DeployJob
displayName: 'Check Deployment'
steps:
- script: make role deploy
displayName: 'Check Deployment'
env:
ANSIBLE_HOST_KEY_CHECKING: false
- stage: Notify
displayName: 'Notification Stage'
dependsOn: [Lint, Test, Deploy]
condition: always()
jobs:
- job: NotifyJob
displayName: 'Send Notifications'
steps:
- script: |
if [ "$(Lint.result)" == "Succeeded" ] && [ "$(Test.result)" == "Succeeded" ]; then
echo "✅ All tests passed for new roles"
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
$(SLACK_WEBHOOK_URL)
else
echo "❌ Tests failed for new roles"
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
$(SLACK_WEBHOOK_URL)
fi
displayName: 'Send Notifications'
env:
SLACK_WEBHOOK_URL: $(SLACK_WEBHOOK_URL)
```
## 🏭 Jenkins
### Базовая конфигурация
**`Jenkinsfile`:**
```groovy
pipeline {
agent any
environment {
ANSIBLE_FORCE_COLOR = 'true'
DOCKER_TLS_CERTDIR = ''
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install Dependencies') {
steps {
sh '''
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
'''
}
}
stage('Lint') {
steps {
sh 'make role lint'
}
}
stage('Test') {
parallel {
stage('Test Minimal') {
steps {
sh 'make role test minimal'
}
}
stage('Test Default') {
steps {
sh 'make role test default'
}
}
stage('Test Performance') {
steps {
sh 'make role test performance'
}
}
}
}
stage('Deploy Check') {
when {
branch 'main'
}
steps {
sh 'make role deploy'
}
}
}
post {
always {
archiveArtifacts artifacts: 'molecule/**/.molecule/**/*', allowEmptyArchive: true
}
success {
echo 'Pipeline completed successfully!'
}
failure {
echo 'Pipeline failed!'
}
}
}
```
### Продвинутая конфигурация
**`Jenkinsfile-advanced`:**
```groovy
pipeline {
agent any
environment {
ANSIBLE_FORCE_COLOR = 'true'
DOCKER_TLS_CERTDIR = ''
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Detect Roles') {
steps {
script {
env.ROLES = sh(
script: 'find roles/ -name "main.yml" -path "*/tasks/*" | sed "s|roles/||; s|/tasks/main.yml||" | tr "\\n" " "',
returnStdout: true
).trim()
}
echo "Detected roles: ${env.ROLES}"
}
}
stage('Update Playbooks') {
steps {
sh '''
chmod +x scripts/update-playbooks.sh
./scripts/update-playbooks.sh
'''
sh '''
git config --local user.email "jenkins@example.com"
git config --local user.name "Jenkins"
git add molecule/default/site.yml roles/deploy.yml
git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
git push
'''
}
}
stage('Install Dependencies') {
steps {
sh '''
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
'''
}
}
stage('Lint') {
steps {
sh 'make role lint'
}
}
stage('Test') {
parallel {
stage('Test Minimal') {
steps {
sh 'make role test minimal'
}
}
stage('Test Default') {
steps {
sh 'make role test default'
}
}
stage('Test Performance') {
steps {
sh 'make role test performance'
}
}
}
}
stage('Deploy Check') {
when {
branch 'main'
}
steps {
sh 'make role deploy'
}
}
}
post {
always {
archiveArtifacts artifacts: 'molecule/**/.molecule/**/*', allowEmptyArchive: true
}
success {
echo 'Pipeline completed successfully!'
script {
if (env.SLACK_WEBHOOK_URL) {
sh '''
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
${SLACK_WEBHOOK_URL}
'''
}
}
}
failure {
echo 'Pipeline failed!'
script {
if (env.SLACK_WEBHOOK_URL) {
sh '''
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
${SLACK_WEBHOOK_URL}
'''
}
}
}
}
}
```
## 🦊 GitLab CI
### Базовая конфигурация
**`.gitlab-ci.yml`:**
```yaml
stages:
- lint
- test
- deploy
variables:
ANSIBLE_FORCE_COLOR: "true"
DOCKER_TLS_CERTDIR: ""
lint:
stage: lint
image: python:3.11
before_script:
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role lint
test:
stage: test
image: docker:latest
services:
- docker:dind
variables:
DOCKER_TLS_CERTDIR: ""
before_script:
- apk add --no-cache make python3 py3-pip
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role test $PRESET
parallel:
matrix:
- PRESET: [minimal, default, performance]
deploy:
stage: deploy
image: python:3.11
only:
- main
before_script:
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role deploy
variables:
ANSIBLE_HOST_KEY_CHECKING: "false"
```
### Продвинутая конфигурация
**`.gitlab-ci-advanced.yml`:**
```yaml
stages:
- detect
- update
- lint
- test
- deploy
- notify
variables:
ANSIBLE_FORCE_COLOR: "true"
DOCKER_TLS_CERTDIR: ""
detect-roles:
stage: detect
image: alpine:latest
script:
- echo "ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' ')" >> build.env
artifacts:
reports:
dotenv: build.env
update-playbooks:
stage: update
image: alpine:latest
script:
- apk add --no-cache make bash
- chmod +x scripts/update-playbooks.sh
- ./scripts/update-playbooks.sh
- git config --local user.email "gitlab@example.com"
- git config --local user.name "GitLab CI"
- git add molecule/default/site.yml deploy.yml
- git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
- git push
only:
- main
- develop
lint:
stage: lint
image: python:3.11
before_script:
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role lint
test:
stage: test
image: docker:latest
services:
- docker:dind
variables:
DOCKER_TLS_CERTDIR: ""
before_script:
- apk add --no-cache make python3 py3-pip
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role test $PRESET
parallel:
matrix:
- PRESET: [minimal, default, performance]
deploy:
stage: deploy
image: python:3.11
only:
- main
before_script:
- pip install ansible ansible-lint
- ansible-galaxy collection install -r requirements.yml
script:
- make role deploy
variables:
ANSIBLE_HOST_KEY_CHECKING: "false"
notify:
stage: notify
image: alpine:latest
script:
- |
if [ "$CI_JOB_STATUS" == "success" ]; then
echo "✅ All tests passed for new roles"
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
${SLACK_WEBHOOK_URL}
else
echo "❌ Tests failed for new roles"
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
${SLACK_WEBHOOK_URL}
fi
when: always
variables:
SLACK_WEBHOOK_URL: $SLACK_WEBHOOK_URL
```
## 🔔 Настройка уведомлений
### Slack уведомления
```yaml
# .github/workflows/notifications.yml
name: Notifications
on: [workflow_run]
jobs:
notify:
runs-on: ubuntu-latest
if: always()
steps:
- name: Notify Slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
channel: '#ansible'
webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}
```
### Teams уведомления
```yaml
# .github/workflows/teams-notifications.yml
name: Teams Notifications
on: [workflow_run]
jobs:
notify:
runs-on: ubuntu-latest
if: always()
steps:
- name: Notify Teams
uses: skitionek/notify-microsoft-teams@master
with:
webhook_url: ${{ secrets.TEAMS_WEBHOOK_URL }}
status: ${{ job.status }}
title: 'Ansible Role Tests'
```
## 📊 Мониторинг CI/CD
### Метрики производительности
```yaml
# .github/workflows/metrics.yml
name: CI/CD Metrics
on: [workflow_run]
jobs:
metrics:
runs-on: ubuntu-latest
steps:
- name: Collect Metrics
run: |
echo "Build time: $(date)"
echo "Commit: ${{ github.sha }}"
echo "Branch: ${{ github.ref }}"
echo "Actor: ${{ github.actor }}"
```
### Отчеты о тестировании
```yaml
# .github/workflows/reports.yml
name: Test Reports
on: [workflow_run]
jobs:
reports:
runs-on: ubuntu-latest
steps:
- name: Generate Report
run: |
echo "## Test Results" >> $GITHUB_STEP_SUMMARY
echo "- Lint: ✅ Passed" >> $GITHUB_STEP_SUMMARY
echo "- Test: ✅ Passed" >> $GITHUB_STEP_SUMMARY
echo "- Deploy: ✅ Passed" >> $GITHUB_STEP_SUMMARY
```
## 🔧 Настройка секретов
### GitHub Secrets
```bash
# Настройка секретов в GitHub
gh secret set SLACK_WEBHOOK_URL --body "https://hooks.slack.com/services/..."
gh secret set TEAMS_WEBHOOK_URL --body "https://outlook.office.com/webhook/..."
```
### Azure DevOps Variables
```yaml
# azure-pipelines.yml
variables:
- group: ansible-secrets
- name: SLACK_WEBHOOK_URL
value: $(SLACK_WEBHOOK_URL)
```
### Jenkins Credentials
```groovy
// Jenkinsfile
pipeline {
agent any
environment {
SLACK_WEBHOOK_URL = credentials('slack-webhook-url')
}
// ... остальная конфигурация
}
```
## 🚀 Автоматизация
### Автоматическое создание скриптов
```bash
#!/bin/bash
# scripts/setup-cicd.sh
# Автоматическая настройка CI/CD
echo "🔧 Настройка CI/CD для AnsibleLab..."
# Создание директории .github/workflows
mkdir -p .github/workflows
# Создание базового workflow
cat > .github/workflows/ansible-test.yml << 'EOF'
name: Ansible Testing
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: make role test
EOF
# Создание Azure DevOps pipeline
cat > azure-pipelines.yml << 'EOF'
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
stages:
- stage: Test
jobs:
- job: TestJob
steps:
- script: make role test
EOF
# Создание Jenkinsfile
cat > Jenkinsfile << 'EOF'
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'make role test'
}
}
}
}
EOF
# Создание GitLab CI
cat > .gitlab-ci.yml << 'EOF'
stages:
- test
test:
stage: test
script:
- make role test
EOF
echo "✅ CI/CD настроен"
```
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,538 +0,0 @@
# Создание и разработка ролей для AnsibleLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🚀 Быстрый старт
### Интерактивное управление ролями
```bash
# Просмотр всех ролей
make role list
# Создание новой роли (интерактивно)
make role create
# Удаление роли (интерактивно)
make role delete
```
### Автоматическое обновление
При создании или удалении роли система автоматически:
- ✅ Обновляет `roles/deploy.yml`
- ✅ Создает полную структуру папок
- ✅ Генерирует README.md с документацией
- ✅ Настраивает метаданные роли
## 📁 Структура роли
### Стандартная структура
```
roles/my-role/
├── tasks/ # Основные задачи
│ └── main.yml
├── handlers/ # Обработчики
│ └── main.yml
├── templates/ # Шаблоны Jinja2
│ └── my-role.conf.j2
├── files/ # Статические файлы
│ └── my-role.service
├── vars/ # Переменные роли
│ └── main.yml
├── defaults/ # Переменные по умолчанию
│ └── main.yml
├── meta/ # Метаданные роли
│ └── main.yml
└── README.md # Документация роли
```
### Создание структуры
#### Автоматическое создание (рекомендуется)
```bash
# Интерактивное создание роли
make role create
# Введите имя роли: my-role
# Система автоматически:
# - Создаст структуру папок
# - Создаст все необходимые файлы
# - Обновит roles/deploy.yml
# - Создаст README.md с документацией
```
#### Ручное создание
```bash
# Создание директории роли
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
# Создание основных файлов
touch roles/my-role/{tasks,handlers,meta}/main.yml
touch roles/my-role/defaults/main.yml
touch roles/my-role/vars/main.yml
touch roles/my-role/README.md
# Добавление роли в roles/deploy.yml вручную
```
## 📝 Разработка роли
### 1. Основные задачи (tasks/main.yml)
```yaml
---
# Основные задачи для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Установка пакетов
package:
name: "{{ my_role_packages }}"
state: present
when: my_role_enabled | default(true)
tags:
- my-role
- install
- name: Создание пользователя
user:
name: "{{ my_role_user }}"
system: "{{ my_role_system_user | default(false) }}"
shell: "{{ my_role_shell | default('/bin/bash') }}"
home: "{{ my_role_home | default('/home/' + my_role_user) }}"
when: my_role_create_user | default(true)
tags:
- my-role
- user
- name: Настройка конфигурации
template:
src: my-role.conf.j2
dest: "{{ my_role_config_file }}"
owner: "{{ my_role_user }}"
group: "{{ my_role_group | default(my_role_user) }}"
mode: '0644'
backup: "{{ my_role_backup | default(true) }}"
notify: restart my-role
tags:
- my-role
- config
- name: Настройка сервиса
systemd:
name: "{{ my_role_service_name | default('my-role') }}"
enabled: "{{ my_role_enabled | default(true) }}"
state: "{{ 'started' if my_role_enabled | default(true) else 'stopped' }}"
daemon_reload: true
tags:
- my-role
- service
- name: Настройка файрвола
firewalld:
port: "{{ my_role_port | default('8080') }}/tcp"
permanent: true
state: "{{ 'enabled' if my_role_firewall | default(false) else 'disabled' }}"
immediate: true
when: my_role_firewall | default(false)
tags:
- my-role
- firewall
```
### 2. Обработчики (handlers/main.yml)
```yaml
---
# Обработчики для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: restart my-role
systemd:
name: "{{ my_role_service_name | default('my-role') }}"
state: restarted
daemon_reload: true
when: my_role_enabled | default(true)
- name: reload my-role
systemd:
name: "{{ my_role_service_name | default('my-role') }}"
state: reloaded
when: my_role_enabled | default(true)
- name: stop my-role
systemd:
name: "{{ my_role_service_name | default('my-role') }}"
state: stopped
when: not my_role_enabled | default(true)
```
### 3. Переменные по умолчанию (defaults/main.yml)
```yaml
---
# Переменные по умолчанию для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Основные настройки
my_role_enabled: true
my_role_user: my-role
my_role_group: my-role
my_role_system_user: false
my_role_shell: /bin/bash
my_role_home: "{{ '/home/' + my_role_user if not my_role_system_user else '/var/lib/' + my_role_user }}"
# Пакеты
my_role_packages:
- nginx
- curl
- htop
# Конфигурация
my_role_config_file: /etc/my-role/my-role.conf
my_role_log_level: info
my_role_port: 8080
my_role_backup: true
# Сервис
my_role_service_name: my-role
my_role_create_user: true
# Безопасность
my_role_firewall: false
my_role_ssl_enabled: false
my_role_ssl_certificate: /etc/ssl/certs/my-role.crt
my_role_ssl_private_key: /etc/ssl/private/my-role.key
```
### 4. Переменные роли (vars/main.yml)
```yaml
---
# Переменные роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Системные переменные
my_role_system_packages:
- python3
- python3-pip
- python3-venv
# Конфигурационные переменные
my_role_config_template: my-role.conf.j2
my_role_service_template: my-role.service.j2
# Пути
my_role_log_dir: /var/log/my-role
my_role_data_dir: /var/lib/my-role
my_role_cache_dir: /var/cache/my-role
```
### 5. Метаданные (meta/main.yml)
```yaml
---
# Метаданные роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
galaxy_info:
author: Сергей Антропов
description: Моя кастомная роль для AnsibleLab
company: https://devops.org.ru
license: MIT
min_ansible_version: "2.9"
platforms:
- name: Ubuntu
versions:
- focal
- jammy
- name: Debian
versions:
- bullseye
- bookworm
- name: EL
versions:
- 7
- 8
- 9
- name: CentOS
versions:
- 7
- 8
- 9
- name: AlmaLinux
versions:
- 8
- 9
- name: Rocky
versions:
- 8
- 9
galaxy_tags:
- system
- configuration
- my-role
- web
- service
dependencies:
- role: geerlingguy.docker
when: my_role_docker_enabled | default(false)
- role: geerlingguy.kubernetes
when: my_role_k8s_enabled | default(false)
```
### 6. Шаблоны (templates/)
**`templates/my-role.conf.j2`:**
```jinja2
# Конфигурация my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
[main]
enabled = {{ my_role_enabled | default(true) }}
user = {{ my_role_user }}
group = {{ my_role_group | default(my_role_user) }}
log_level = {{ my_role_log_level | default('info') }}
port = {{ my_role_port | default(8080) }}
[logging]
log_file = {{ my_role_log_dir | default('/var/log/my-role') }}/my-role.log
log_level = {{ my_role_log_level | default('info') }}
max_size = {{ my_role_log_max_size | default('100M') }}
max_files = {{ my_role_log_max_files | default('5') }}
[security]
ssl_enabled = {{ my_role_ssl_enabled | default(false) }}
{% if my_role_ssl_enabled | default(false) %}
ssl_certificate = {{ my_role_ssl_certificate }}
ssl_private_key = {{ my_role_ssl_private_key }}
{% endif %}
[network]
host = {{ my_role_host | default('0.0.0.0') }}
port = {{ my_role_port | default(8080) }}
timeout = {{ my_role_timeout | default(30) }}
{% if my_role_web_config | default(false) %}
[web]
enabled = true
{% raw %}
{{ my_role_nginx_config }}
{% endraw %}
{% endif %}
```
**`templates/my-role.service.j2`:**
```ini
[Unit]
Description=My Role Service
After=network.target
[Service]
Type=simple
User={{ my_role_user }}
Group={{ my_role_group | default(my_role_user) }}
ExecStart=/usr/bin/my-role --config {{ my_role_config_file }}
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
### 7. Статические файлы (files/)
**`files/my-role.service`:**
```ini
[Unit]
Description=My Role Service
After=network.target
[Service]
Type=simple
User=my-role
Group=my-role
ExecStart=/usr/bin/my-role --config /etc/my-role/my-role.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
## 🧪 Тестирование роли
### 1. Lint проверка
```bash
# Lint проверка роли
make role lint
# Lint проверка конкретной роли
ansible-lint roles/my-role/
```
### 2. Тестирование в Docker
```bash
# Тестирование с default preset
make role test
# Тестирование с minimal preset
make role test minimal
# Тестирование с custom preset
make role test my-custom-preset
```
### 3. Тестирование на реальных серверах
```bash
# Dry-run развертывания
make role deploy
# Развертывание на продакшн
make role deploy
# Подтвердить развертывание: y
```
## 🔧 Интеграция с системой
### 1. Автоматическое включение в playbook'и
Роль автоматически включается в:
- `molecule/default/site.yml` (для тестирования)
- `roles/deploy.yml` (для продакшн развертывания)
### 2. Обновление playbook'ов
```bash
# Автоматическое обновление playbook'ов
make update-playbooks
# Проверка обновленных playbook'ов
make role test
```
### 3. Создание документации
```bash
# Автоматическое создание документации
make generate-docs
# Проверка созданной документации
ls -la roles/*/README.md
```
## 📚 Документация роли
### README.md для роли
```markdown
# Роль My-Role
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Роль для настройки и конфигурации my-role сервиса.
## Требования
- Ansible >= 2.9
- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux
## Переменные
| Переменная | Тип | По умолчанию | Описание |
|------------|-----|--------------|----------|
| `my_role_enabled` | boolean | `true` | Включить роль |
| `my_role_user` | string | `my-role` | Пользователь для сервиса |
| `my_role_packages` | list | `['nginx', 'curl']` | Пакеты для установки |
| `my_role_port` | integer | `8080` | Порт сервиса |
| `my_role_ssl_enabled` | boolean | `false` | Включить SSL |
## Примеры использования
### Базовое использование
```yaml
- name: Настройка my-role
hosts: all
roles:
- my-role
```
### С кастомными параметрами
```yaml
- name: Настройка my-role с SSL
hosts: all
roles:
- role: my-role
vars:
my_role_ssl_enabled: true
my_role_port: 8443
my_role_packages:
- nginx
- openssl
```
### В playbook
```yaml
---
- name: Настройка web серверов
hosts: web_servers
become: true
roles:
- role: my-role
vars:
my_role_enabled: true
my_role_ssl_enabled: true
my_role_firewall: true
tags:
- web
- my-role
```
## Tags
- `my-role` - выполнение всех задач роли
- `install` - установка пакетов
- `user` - создание пользователя
- `config` - настройка конфигурации
- `service` - управление сервисом
- `firewall` - настройка файрвола
## Поддерживаемые ОС
- Red Hat Enterprise Linux 7/8/9
- CentOS 7/8/Stream
- AlmaLinux 8/9
- Rocky Linux 8/9
- Ubuntu 20.04/22.04
- Debian 10/11/12
## Лицензия
MIT
## Автор
Сергей Антропов - https://devops.org.ru

View File

@@ -1,520 +0,0 @@
# Кастомизация deploy.yml - Полное руководство
## Описание
Файл `roles/deploy.yml` - это основной playbook для развертывания Ansible ролей на продакшн серверах. Этот документ содержит полную сводку по кастомизации и настройке различных сценариев развертывания.
## Базовый пример
```yaml
---
# Playbook для развертывания на продакшн серверах
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Развертывание всех ролей
hosts: all
roles:
- ping
```
## 1. Управление привилегиями (become)
### Базовое использование become
```yaml
- name: Развертывание с sudo правами
hosts: all
become: true
roles:
- nginx
- postgresql
```
### Become с паролем
```yaml
- name: Развертывание с sudo паролем
hosts: all
become: true
become_method: sudo
become_user: root
vars:
ansible_become_pass: "{{ vault_sudo_password }}"
roles:
- nginx
```
### Become для конкретных ролей
```yaml
- name: Развертывание с разными привилегиями
hosts: all
roles:
- role: nginx
become: true
- role: app-config
become: false
```
## 2. Группировка хостов
### Развертывание по группам
```yaml
- name: Развертывание на веб-серверах
hosts: webservers
become: true
roles:
- nginx
- php-fpm
- name: Развертывание на БД серверах
hosts: databases
become: true
roles:
- postgresql
- redis
- name: Развертывание на мониторинг серверах
hosts: monitoring
become: true
roles:
- prometheus
- grafana
```
### Условное развертывание
```yaml
- name: Развертывание на production
hosts: production
become: true
when: environment == "production"
roles:
- nginx
- ssl-certificates
- name: Развертывание на staging
hosts: staging
become: false
when: environment == "staging"
roles:
- nginx
```
## 3. Переменные и конфигурация
### Глобальные переменные
```yaml
- name: Развертывание с переменными
hosts: all
become: true
vars:
nginx_port: 80
nginx_ssl_port: 443
app_name: "my-application"
app_version: "1.0.0"
roles:
- nginx
- application
```
### Переменные для конкретных ролей
```yaml
- name: Развертывание с ролевыми переменными
hosts: all
become: true
roles:
- role: nginx
vars:
nginx_port: 80
nginx_ssl_enabled: true
- role: postgresql
vars:
postgresql_version: "13"
postgresql_max_connections: 200
```
### Использование group_vars и host_vars
```yaml
# group_vars/webservers.yml
nginx_worker_processes: 4
nginx_worker_connections: 1024
# group_vars/databases.yml
postgresql_shared_buffers: "256MB"
postgresql_effective_cache_size: "1GB"
# В deploy.yml
- name: Развертывание с групповыми переменными
hosts: webservers:databases
become: true
roles:
- nginx
- postgresql
```
## 4. Теги (Tags)
### Базовое использование тегов
```yaml
- name: Развертывание с тегами
hosts: all
become: true
roles:
- role: nginx
tags: ['web', 'nginx']
- role: postgresql
tags: ['database', 'postgresql']
- role: monitoring
tags: ['monitoring', 'prometheus']
```
### Запуск с тегами
```bash
# Развертывание только веб-серверов
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web
# Развертывание только БД
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags database
# Развертывание веб + БД
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web,database
# Пропустить мониторинг
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --skip-tags monitoring
```
## 5. Обработчики (Handlers)
### Использование обработчиков
```yaml
- name: Развертывание с обработчиками
hosts: all
become: true
roles:
- nginx
- postgresql
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
listen: "restart nginx"
- name: restart postgresql
service:
name: postgresql
state: restarted
listen: "restart postgresql"
```
## 6. Условное выполнение
### Условия на основе переменных
```yaml
- name: Развертывание с условиями
hosts: all
become: true
roles:
- role: nginx
when: nginx_enabled | default(true)
- role: postgresql
when: database_enabled | default(true)
- role: redis
when: cache_enabled | default(false)
```
### Условия на основе групп
```yaml
- name: Развертывание с групповыми условиями
hosts: all
become: true
roles:
- role: nginx
when: "'webservers' in group_names"
- role: postgresql
when: "'databases' in group_names"
- role: monitoring
when: "'monitoring' in group_names"
```
## 7. Параллельное выполнение
### Настройка параллелизма
```yaml
- name: Развертывание с параллелизмом
hosts: all
become: true
serial: 2 # Выполнять на 2 хостах одновременно
roles:
- nginx
- postgresql
```
### Каскадное развертывание
```yaml
- name: Развертывание БД (первыми)
hosts: databases
become: true
serial: 1
roles:
- postgresql
- name: Развертывание приложений (после БД)
hosts: webservers
become: true
serial: 2
roles:
- nginx
- application
```
## 8. Обработка ошибок
### Игнорирование ошибок
```yaml
- name: Развертывание с игнорированием ошибок
hosts: all
become: true
ignore_errors: true
roles:
- nginx
- postgresql
```
### Обработка ошибок на уровне ролей
```yaml
- name: Развертывание с обработкой ошибок
hosts: all
become: true
roles:
- role: nginx
ignore_errors: true
- role: postgresql
ignore_errors: false
```
## 9. Инвентарь и подключение
### Различные пользователи
```yaml
- name: Развертывание с разными пользователями
hosts: all
become: true
remote_user: "{{ ansible_user | default('ubuntu') }}"
roles:
- nginx
- postgresql
```
### SSH настройки
```yaml
- name: Развертывание с SSH настройками
hosts: all
become: true
gather_facts: true
roles:
- nginx
- postgresql
vars:
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
```
## 10. Полный пример продакшн развертывания
```yaml
---
# Полный пример продакшн развертывания
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# 1. Развертывание инфраструктуры
- name: Развертывание инфраструктуры
hosts: infrastructure
become: true
serial: 1
roles:
- role: nginx
vars:
nginx_ssl_enabled: true
nginx_ssl_cert: "{{ ssl_cert_path }}"
nginx_ssl_key: "{{ ssl_key_path }}"
tags: ['infrastructure', 'nginx']
# 2. Развертывание БД
- name: Развертывание базы данных
hosts: databases
become: true
serial: 1
roles:
- role: postgresql
vars:
postgresql_version: "13"
postgresql_max_connections: 200
postgresql_shared_buffers: "256MB"
tags: ['database', 'postgresql']
# 3. Развертывание приложений
- name: Развертывание приложений
hosts: webservers
become: true
serial: 2
roles:
- role: nginx
vars:
nginx_upstream_servers: "{{ app_servers }}"
tags: ['application', 'nginx']
- role: application
vars:
app_version: "{{ app_version }}"
app_environment: "{{ environment }}"
tags: ['application']
# 4. Развертывание мониторинга
- name: Развертывание мониторинга
hosts: monitoring
become: true
when: monitoring_enabled | default(true)
roles:
- role: prometheus
tags: ['monitoring', 'prometheus']
- role: grafana
tags: ['monitoring', 'grafana']
```
## 11. Команды запуска
### Базовые команды
```bash
# Развертывание всех ролей
make role deploy
# Развертывание с проверкой (dry-run)
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check
# Развертывание с тегами
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web,database
# Развертывание с переменными
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -e "app_version=1.0.0"
# Развертывание с лимитом хостов
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --limit webservers
```
### Продвинутые команды
```bash
# Развертывание с параллелизмом
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --forks 5
# Развертывание с детальным выводом
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -vvv
# Развертывание с обработкой ошибок
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --force-handlers
# Развертывание с тестированием
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check --diff
```
## 12. Переменные окружения
### Использование переменных окружения
```bash
# Установка переменных окружения
export ANSIBLE_HOST_KEY_CHECKING=False
export ANSIBLE_SSH_RETRIES=3
export ANSIBLE_TIMEOUT=30
# Развертывание
make role deploy
```
### Файл переменных
```yaml
# group_vars/all.yml
ansible_user: ubuntu
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
# Переменные приложения
app_name: "my-application"
app_version: "1.0.0"
environment: "production"
# Переменные БД
postgresql_version: "13"
postgresql_max_connections: 200
```
## 13. Безопасность
### Использование Vault
```yaml
# В deploy.yml
- name: Развертывание с секретами
hosts: all
become: true
vars:
db_password: "{{ vault_db_password }}"
ssl_cert: "{{ vault_ssl_cert }}"
roles:
- postgresql
- nginx
```
### Запуск с Vault
```bash
# Развертывание с паролем Vault
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --ask-vault-pass
# Развертывание с файлом пароля
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file .vault_pass
```
## 14. Отладка и логирование
### Включение отладки
```yaml
- name: Развертывание с отладкой
hosts: all
become: true
debug: true
roles:
- nginx
- postgresql
```
### Логирование
```bash
# Развертывание с логированием
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --log-path /var/log/ansible.log
# Развертывание с детальным выводом
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -vvv
```
## 15. Лучшие практики
### Структура файла
1. **Комментарии** - описывайте каждый блок
2. **Группировка** - логически группируйте роли
3. **Переменные** - выносите переменные в отдельные файлы
4. **Теги** - используйте теги для гибкости
5. **Условия** - добавляйте условия для безопасности
### Рекомендации
- Используйте `become: true` для системных ролей
- Группируйте хосты по функциональности
- Применяйте теги для модульности
- Используйте переменные для конфигурации
- Добавляйте условия для безопасности
- Логируйте все операции
- Тестируйте с `--check` перед развертыванием
## Заключение
Файл `roles/deploy.yml` - это центральный элемент развертывания. Правильная его настройка обеспечивает гибкость, безопасность и надежность развертывания Ansible ролей на продакшн серверах.
Для получения дополнительной информации см.:
- [Создание ролей](creating-roles.md)
- [Настройка CI/CD](cicd-setup.md)
- [Мониторинг](monitoring.md)

View File

@@ -1,410 +0,0 @@
# Docker образы AnsibleLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🐳 Обзор
AnsibleLab использует предварительно собранные Docker образы для различных операционных систем с полной поддержкой systemd. Все образы поддерживают multi-arch сборку и автоматически публикуются в Docker Hub под namespace `inecs/ansible-lab`.
## 📁 Структура dockerfiles/
```
dockerfiles/
├── ansible-controller/ # Ansible контроллер
├── alt-linux/ # ALT Linux P9
├── astra-linux/ # Astra Linux 1.7
├── redos/ # RED OS 9
├── rhel/ # Red Hat Enterprise Linux 8
├── centos7/ # CentOS 7
├── centos8/ # CentOS 8
├── centos9/ # CentOS Stream 9
├── alma/ # AlmaLinux 8
├── rocky/ # Rocky Linux 8
├── ubuntu20/ # Ubuntu 20.04 LTS
├── ubuntu22/ # Ubuntu 22.04 LTS
├── ubuntu24/ # Ubuntu 24.04 LTS
├── debian9/ # Debian 9 Stretch
├── debian10/ # Debian 10 Buster
├── debian11/ # Debian 11 Bullseye
└── debian12/ # Debian 12 Bookworm
```
## 🚀 Доступные образы
### ansible-controller
**Базовый образ:** `ubuntu:22.04`
**Теги:** `inecs/ansible-lab:ansible-controller-latest`
**Платформы:** linux/amd64, linux/arm64
Ansible контроллер с предустановленными коллекциями и инструментами для разработки и тестирования.
#### Компоненты:
- Ansible Core с последними коллекциями
- Docker CLI для работы с контейнерами
- kubectl для управления Kubernetes
- Helm для управления пакетами Kubernetes
- Kind для локального Kubernetes
- yq для работы с YAML
- jq для работы с JSON
- Molecule для тестирования ролей
#### Предустановленные коллекции:
```yaml
collections:
- name: community.docker
version: ">=3.0.0"
- name: community.general
version: ">=7.0.0"
- name: ansible.posix
version: ">=1.5.4"
- name: kubernetes.core
version: ">=2.0.0"
```
#### Использование:
```bash
# Запуск контроллера
docker run -it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/workspace \
-w /workspace \
inecs/ansible-lab:ansible-controller-latest
# Выполнение команды
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/workspace \
-w /workspace \
inecs/ansible-lab:ansible-controller-latest \
ansible-playbook site.yml
```
### Ubuntu
**Базовые образы:**
- `ubuntu:20.04``inecs/ansible-lab:ubuntu20-latest`
- `ubuntu:22.04``inecs/ansible-lab:ubuntu22-latest`
- `ubuntu:24.04``inecs/ansible-lab:ubuntu24-latest`
**Платформы:** linux/amd64, linux/arm64
Ubuntu LTS с systemd.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Основные утилиты (curl, wget, git, vim, nano, htop, tree, jq)
- **Примечание**: Docker CE и Docker Compose не установлены (закомментированы в Dockerfile)
#### Использование:
```bash
docker run -d --privileged \
--name ubuntu-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:ubuntu22-latest
```
### Debian
**Базовые образы:**
- `debian:9``inecs/ansible-lab:debian9-latest`
- `debian:10``inecs/ansible-lab:debian10-latest`
- `debian:11``inecs/ansible-lab:debian11-latest`
- `debian:bookworm``inecs/ansible-lab:debian12-latest`
**Платформы:** linux/amd64, linux/arm64
Debian с systemd.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Основные утилиты
- **Примечание**: Docker CE и Docker Compose не установлены
#### Использование:
```bash
docker run -d --privileged \
--name debian-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:debian12-latest
```
### CentOS
**Базовые образы:**
- `centos:7``inecs/ansible-lab:centos7-latest`
- `quay.io/centos/centos:8``inecs/ansible-lab:centos8-latest`
- `quay.io/centos/centos:stream9``inecs/ansible-lab:centos9-latest`
**Платформы:** linux/amd64, linux/arm64
CentOS с systemd.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Основные утилиты
- **Примечание**: Docker CE и Docker Compose не установлены
#### Использование:
```bash
docker run -d --privileged \
--name centos-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:centos9-latest
```
### AlmaLinux
**Базовый образ:** `almalinux:8`
**Тег:** `inecs/ansible-lab:alma-latest`
**Платформы:** linux/amd64, linux/arm64
AlmaLinux 8 с systemd.
### Rocky Linux
**Базовый образ:** `rockylinux:8`
**Тег:** `inecs/ansible-lab:rocky-latest`
**Платформы:** linux/amd64, linux/arm64
Rocky Linux 8 с systemd.
### Red Hat Enterprise Linux
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
**Тег:** `inecs/ansible-lab:rhel-latest`
**Платформы:** linux/amd64, linux/arm64
Red Hat Enterprise Linux 8 с systemd.
### ALT Linux
**Базовый образ:** `altlinux/p9`
**Тег:** `inecs/ansible-lab:alt-linux-latest`
**Платформы:** linux/amd64 (ограничение базового образа)
ALT Linux P9 с systemd.
### Astra Linux
**Базовый образ:** `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2`
**Тег:** `inecs/ansible-lab:astra-linux-latest`
**Платформы:** linux/amd64 (ограничение базового образа)
Astra Linux 1.7 с systemd.
### RED OS
**Базовый образ:** `registry.red-soft.ru/ubi7/ubi`
**Тег:** `inecs/ansible-lab:redos-latest`
**Платформы:** linux/amd64 (ограничение базового образа)
RED OS 9 с systemd.
## 🔨 Сборка образов
### Сборка всех образов
```bash
# Собрать все образы (multi-arch)
make docker build
# Пересборка с очисткой кеша
make docker rebuild
# Сборка конкретного образа
make docker build-image IMAGE=centos7
```
### Поддерживаемые платформы
По умолчанию все образы собираются для следующих платформ:
- `linux/amd64` - 64-bit x86
- `linux/arm64` - 64-bit ARM
Дополнительные платформы (опционально):
- `linux/riscv64` - RISC-V 64-bit
- `linux/ppc64le` - PowerPC 64-bit LE
- `linux/s390x` - IBM Z
- `linux/386` - 32-bit x86
- `linux/arm/v7` - ARM v7
- `linux/arm/v6` - ARM v6
### Тегирование
Все образы автоматически получают теги:
- `inecs/ansible-lab:<имя>-<версия>` - версионированный тег
- `inecs/ansible-lab:<имя>-latest` - последняя версия
Например:
- `inecs/ansible-lab:centos9-9.0`
- `inecs/ansible-lab:centos9-latest`
- `inecs/ansible-lab:ubuntu22-22.04`
- `inecs/ansible-lab:ubuntu22-latest`
## 📤 Публикация в Docker Hub
### Требования
1. Авторизация в Docker Hub:
```bash
docker login
```
2. Настройка билд-ксер (buildx) для multi-arch:
```bash
make docker setup-builder
```
### Публикация
```bash
# Публикация всех образов
make docker push
# Публикация конкретного образа
make docker build-image IMAGE=centos7
# (публикуется автоматически при сборке)
```
## 🧪 Использование в Molecule
### Preset конфигурация
```yaml
# molecule/presets/my-preset.yml
images:
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
centos9: "inecs/ansible-lab:centos9-latest"
debian12: "inecs/ansible-lab:debian12-latest"
hosts:
- name: web1
family: ubuntu22
groups: [web, test]
- name: db1
family: centos9
groups: [database, test]
```
### Тестирование с preset
```bash
# Использование preset в тестах
MOLECULE_PRESET=my-preset make role test
# Или напрямую
make role test my-preset
```
## 🔧 Особенности образов
### Поддержка systemd
Все образы настроены для работы с systemd в контейнере:
```bash
docker run -d --privileged \
--tmpfs /run --tmpfs /run/lock \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--cap-add SYS_ADMIN \
inecs/ansible-lab:ubuntu22-latest
```
### Настройки по умолчанию
- **Пользователь ansible**: пароль `ansible`, sudo без пароля
- **SSH доступ**: включен для пользователя ansible
- **systemd**: multi-user.target по умолчанию
- **Временные файловые системы**: `/run`, `/run/lock`
- **Volumes**: `/sys/fs/cgroup`
### Docker внутри Docker
Все образы поддерживают запуск Docker внутри контейнера:
```bash
docker run -d --privileged \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:centos9-latest
```
## 📋 Матрица совместимости
| Образ | Платформы | systemd | Docker | Python 3 |
|-------|-----------|---------|--------|----------|
| ansible-controller | amd64, arm64 | ✅ | ✅ | ✅ |
| ubuntu20/22/24 | amd64, arm64 | ✅ | ✅ | ✅ |
| debian9/10/11/12 | amd64, arm64 | ✅ | ✅ | ✅ |
| centos7/8/9 | amd64, arm64 | ✅ | ✅ | ✅ |
| alma | amd64, arm64 | ✅ | ✅ | ✅ |
| rocky | amd64, arm64 | ✅ | ✅ | ✅ |
| rhel | amd64, arm64 | ✅ | ✅ | ✅ |
| alt-linux | amd64 | ✅ | ✅ | ✅ |
| astra-linux | amd64 | ✅ | ✅ | ✅ |
| redos | amd64 | ✅ | ✅ | ✅ |
## 🛠️ Управление образами
### Проверка наличия образов
```bash
# Проверка локальных образов
docker images | grep inecs/ansible-lab
# Проверка в Molecule
make custom-images check
```
### Обновление образов
```bash
# Загрузить свежие образы
make docker pull
# Пересобрать с обновлениями
make docker rebuild
# Полное обновление
make docker update
```
### Очистка
```bash
# Удалить локальные образы
make docker clean
# Полная очистка
make docker purge
```
## 📚 Дополнительная информация
- [Структура dockerfiles/](../dockerfiles/)
- [Makefile команды](../README.md#-управление-docker-образами)
- [Preset система](molecule-guide.md#preset-система)
- [CI/CD конфигурация](cicd-setup.md)
## 🔗 Полезные ссылки
- **Docker Hub**: https://hub.docker.com/r/inecs/ansible-lab
- **AnsibleLab**: https://devops.org.ru
- **Документация**: https://github.com/AnsibleLab/docs

View File

@@ -1,325 +1,462 @@
# Примеры использования AnsibleLab
# Примеры использования
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Быстрый старт
## Описание
### Базовое тестирование роли
Этот документ содержит практические примеры использования универсальной лаборатории для различных сценариев тестирования Ansible ролей.
## Содержание
- [Базовые примеры](#базовые-примеры)
- [Kubernetes примеры](#kubernetes-примеры)
- [Docker примеры](#docker-примеры)
- [Смешанные примеры](#смешанные-примеры)
- [Мониторинг и отчеты](#мониторинг-и-отчеты)
- [Troubleshooting](#troubleshooting)
## Базовые примеры
### Пример 1: Тестирование веб-сервера
```bash
# Тестирование роли ping с minimal preset (1 хост)
make role test minimal
# Запустить веб-приложение пресет
make lab-test LAB_SPEC=molecule/presets/webapp.yml
# Тестирование роли docker с default preset (2 хоста)
make role lint docker
make role test docker
# Проверить статус
make lab-verify
# Посмотреть отчет
make lab-report
```
### Просмотр доступных preset'ов
### Пример 2: Тестирование базы данных
```bash
# Список всех preset'ов
make presets list
# Запустить пресет с базой данных
make lab-test LAB_SPEC=molecule/presets/ha.yml
# Информация о конкретном preset'е
make presets info PRESET=default
make presets info PRESET=all-images
# Проверить подключение к БД
make kube-cmd CLUSTER=lab CMD="exec -it postgres-0 -- psql -U postgres -c 'SELECT 1;'"
```
## Пример 1: Тестирование роли Docker
### Описание
Тестирование универсальной роли Docker на разных ОС.
### Пример 3: Тестирование микросервисов
```bash
# Lint проверка
make role lint docker
# Запустить микросервисный пресет
make lab-test LAB_SPEC=molecule/presets/microservices.yml
# Тестирование с minimal preset (1 хост Debian)
make role test minimal
# Тестирование с default preset (Ubuntu + Debian)
make role test default
# Тестирование с preset all-images (16 хостов, все ОС)
make role test all-images
# Проверить API Gateway
curl http://localhost:8000/health
```
### Проверка результатов
## Kubernetes примеры
### Пример 1: Простой Kubernetes кластер
```bash
# Просмотр созданных контейнеров
docker ps -a --filter "network=labnet"
# Запустить одиночный Kind кластер
make lab-test LAB_SPEC=molecule/presets/k8s-single.yml
# Просмотр логов контейнера
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
# Войти в кластер
make kube-sh
# Вход в контейнер для проверки
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
# Проверить ноды
kubectl get nodes
# Проверить поды
kubectl get pods -A
```
## Пример 2: Создание собственной роли
### Создание роли
### Пример 2: Мульти-кластерная конфигурация
```bash
# Интерактивное создание новой роли
make role create
# Введите имя роли: nginx
# Запустить мульти-кластер
make lab-test LAB_SPEC=molecule/presets/k8s-multi.yml
# Редактирование роли
cd roles/nginx
nano tasks/main.yml
# Переключиться между кластерами
kubectl config use-context kind-dev
kubectl get nodes
kubectl config use-context kind-staging
kubectl get nodes
kubectl config use-context kind-prod
kubectl get nodes
```
### Разработка роли
### Пример 3: Istio Service Mesh
**`roles/nginx/tasks/main.yml`:**
```yaml
```bash
# Запустить полный Istio стек
make lab-test LAB_SPEC=molecule/presets/k8s-istio-full.yml
# Port-forward Kiali
make kiali-port-forward CLUSTER=istio-full
# Port-forward Istio Gateway
make istio-gw-port-forward CLUSTER=istio-full
# Открыть Kiali
open http://localhost:20001
# Открыть Bookinfo
open http://localhost:8082/productpage
```
### Пример 4: Мониторинг Kubernetes
```bash
# Port-forward Grafana
make grafana-port-forward CLUSTER=istio-full
# Port-forward Prometheus
make prom-port-forward CLUSTER=istio-full
# Открыть Grafana
open http://localhost:3000
# Открыть Prometheus
open http://localhost:9090
```
## Docker примеры
### Пример 1: Docker-in-Docker
```bash
# Запустить DinD пресет
make lab-test LAB_SPEC=molecule/presets/dind-simple.yml
# Войти в DinD контейнер
docker exec -it dind1 sh
# Внутри контейнера проверить Docker
docker ps
docker images
```
### Пример 2: Docker Swarm
```bash
# Запустить Docker Swarm пресет
make lab-test LAB_SPEC=molecule/presets/dind-swarm.yml
# Войти в manager
docker exec -it swarm-manager sh
# Инициализировать Swarm
docker swarm init
# Присоединить workers
docker node ls
```
### Пример 3: Docker Compose
```bash
# Запустить Compose пресет
make lab-test LAB_SPEC=molecule/presets/dind-compose.yml
# Войти в compose контейнер
docker exec -it compose-web sh
# Создать docker-compose.yml
cat > docker-compose.yml << EOF
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
api:
image: node:alpine
ports:
- "3000:3000"
EOF
# Запустить стек
docker-compose up -d
```
### Пример 4: Docker-outside-of-Docker
```bash
# Запустить DOoD пресет
make lab-test LAB_SPEC=molecule/presets/dood-simple.yml
# Войти в DOoD контейнер
docker exec -it dood1 sh
# Проверить доступ к Docker daemon хоста
docker ps
docker images
```
## Смешанные примеры
### Пример 1: Kubernetes + DinD
```bash
# Запустить смешанный пресет
make lab-test LAB_SPEC=molecule/presets/mixed-k8s-dind.yml
# Проверить Kubernetes
make kube-cmd CLUSTER=hybrid CMD="get nodes"
# Проверить DinD
docker exec -it dind-dev sh
docker ps
```
### Пример 2: Kubernetes + DOoD
```bash
# Запустить смешанный пресет
make lab-test LAB_SPEC=molecule/presets/mixed-k8s-dood.yml
# Проверить Kubernetes
make kube-cmd CLUSTER=hybrid CMD="get pods -A"
# Проверить DOoD
docker exec -it dood-web sh
docker ps
```
### Пример 3: Полная гибридная конфигурация
```bash
# Запустить полный смешанный пресет
make lab-test LAB_SPEC=molecule/presets/mixed-full.yml
# Проверить все компоненты
make kube-cmd CLUSTER=full-stack CMD="get nodes"
docker exec -it dind-dev sh
docker exec -it dood-web sh
```
## Мониторинг и отчеты
### Пример 1: Генерация HTML отчета
```bash
# Запустить тест
make lab-test LAB_SPEC=molecule/presets/enterprise.yml
# Сгенерировать отчет
make lab-report
# Открыть отчет
open reports/lab-report.html
```
### Пример 2: Снапшоты
```bash
# Создать снапшот
make lab-snapshot
# Восстановить из снапшота
make lab-restore
# Очистить лабораторию
make lab-cleanup
```
### Пример 3: Мониторинг в реальном времени
```bash
# Port-forward всех сервисов мониторинга
make grafana-port-forward CLUSTER=lab
make prom-port-forward CLUSTER=lab
make kiali-port-forward CLUSTER=lab
# Открыть все дашборды
open http://localhost:3000 # Grafana
open http://localhost:9090 # Prometheus
open http://localhost:20001 # Kiali
```
## Troubleshooting
### Пример 1: Проблемы с портами
```bash
# Проверить занятые порты
netstat -tulpn | grep :8080
# Остановить все port-forward
make kube-pf-stop
# Перезапустить лабораторию
make lab-reset
```
### Пример 2: Проблемы с Docker
```bash
# Проверить Docker daemon
docker ps
# Перезапустить Docker
sudo systemctl restart docker
# Очистить Docker
docker system prune -a
```
### Пример 3: Проблемы с Kubernetes
```bash
# Проверить Kind кластеры
kind get clusters
# Удалить проблемный кластер
kind delete cluster --name lab
# Пересоздать кластер
make lab-create
```
### Пример 4: Проблемы с ресурсами
```bash
# Проверить использование ресурсов
docker stats
# Ограничить ресурсы
docker run --memory=512m --cpus=1.0 your-image
# Очистить неиспользуемые ресурсы
make lab-cleanup
```
## Продвинутые примеры
### Пример 1: Создание собственного пресета
```bash
# Создать новый пресет
cat > molecule/presets/my-custom.yml << EOF
---
- name: Установка nginx
# ПРЕСЕТ: Мой кастомный пресет
#
# Описание: Кастомная конфигурация для моих нужд
#
# Использование: make lab-test LAB_SPEC=molecule/presets/my-custom.yml
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: my-web
family: debian
group: webservers
publish:
- "8080:80"
- name: my-db
family: rhel
group: databases
publish:
- "5432:5432"
EOF
# Протестировать пресет
make lab-test LAB_SPEC=molecule/presets/my-custom.yml
```
### Пример 2: Создание собственной роли
```bash
# Создать структуру роли
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
# Создать основной task
cat > roles/my-role/tasks/main.yml << EOF
---
- name: Install nginx
package:
name: nginx
state: present
when: ansible_os_family in ['Debian', 'RedHat']
- name: Запуск nginx
systemd:
- name: Start nginx
service:
name: nginx
state: started
enabled: yes
enabled: true
EOF
# Создать playbook
cat > files/playbooks/my-playbook.yml << EOF
---
- name: Deploy my role
hosts: webservers
become: true
roles:
- my-role
EOF
# Протестировать роль
make lab-test LAB_SPEC=molecule/presets/webapp.yml
```
### Тестирование роли
### Пример 3: Интеграция с CI/CD
```bash
# Lint проверка
make role lint nginx
# Создать GitHub Actions workflow
cat > .github/workflows/test.yml << EOF
name: Test Ansible Roles
# Тестирование с minimal preset
make role test minimal
# Проверка работы nginx
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) systemctl status nginx
```
## Пример 3: Использование preset'ов
### Minimal preset (1 хост)
```bash
# Быстрое тестирование на 1 хосте
make role test minimal
# Проверка контейнера
docker ps -a --filter "network=labnet"
```
### Default preset (2 хоста)
```bash
# Тестирование на Ubuntu + Debian
make role test default
# Проверка нескольких контейнеров
docker ps -a --filter "network=labnet"
```
### All-images preset (16 хостов)
```bash
# Полное тестирование всех ОС
make role test all-images
# Проверка всех контейнеров
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}"
```
### Preset'ы по ОС
```bash
# Тестирование на всех версиях Ubuntu
make role test ubuntu-all
# Тестирование на всех версиях Debian
make role test debian-all
# Тестирование на всех версиях CentOS
make role test centos-all
```
## Пример 4: Работа с Ansible Vault
### Создание секретов
```bash
# Инициализация vault
make vault init
# Создание нового файла секретов
make vault create
# Имя файла: secrets
```
### Редактирование секретов
```bash
# Редактирование
make vault edit
# Имя файла: secrets
# Просмотр секретов
make vault show
# Имя файла: secrets
```
### Использование в тестировании
Секреты автоматически расшифровываются при запуске тестов и шифруются обратно после завершения.
## Пример 5: CI/CD интеграция
### GitHub Actions
```yaml
name: Ansible Tests
on: [push, pull_request]
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: |
make role lint
make role test minimal
```
### GitLab CI
```yaml
test:
script:
- make role lint
- make role test minimal
only:
- merge_requests
- main
```
## Пример 6: Диагностика и отладка
### Проверка линтинга
```bash
# Линт всех ролей
make role lint
# Линт конкретной роли
make role lint docker
# Линт с подробным выводом
ansible-lint roles/docker/ -vv
```
### Диагностика тестов
```bash
# Проверка preset'ов
make presets list
make presets info PRESET=default
# Проверка контейнеров
docker ps -a --filter "network=labnet"
docker network inspect labnet
# Просмотр логов
docker logs -f $(docker ps -aq --filter "network=labnet" | head -1)
```
### Очистка
```bash
# Очистка контейнеров Molecule
make clean-containers
# Очистка образов
make docker clean
# Полная очистка
make docker purge
```
## Полезные команды
### Просмотр информации
```bash
# Список всех ролей
make role list
# Список preset'ов
make presets list
# Информация об образах
make docker info
# Справка по командам
make help
```
### Docker операции
```bash
# Проверка builder'а
make docker check-builder
# Диагностика buildx
make docker diagnose
# Настройка builder'а
make docker setup-builder
# Пересборка образов
make docker rebuild
```
### Vault операции
```bash
# Создание vault
make vault init
# Работа с секретами
make vault create
make vault edit
make vault show
# Проверка vault
make vault check
- uses: actions/checkout@v3
- name: Setup Docker
run: |
docker-compose up -d
- name: Run tests
run: |
make lab-test LAB_SPEC=molecule/presets/minimal.yml
- name: Generate report
run: |
make lab-report
- name: Upload report
uses: actions/upload-artifact@v3
with:
name: lab-report
path: reports/lab-report.html
EOF
```
## Заключение
Эти примеры демонстрируют основные возможности AnsibleLab:
1. **Быстрое тестирование** с minimal preset
2. **Полное тестирование** с all-images preset
3. **Создание ролей** через интерактивные команды
4. **Работа с Vault** для секретов
5. **Диагностика** и отладка тестов
6. **Интеграция CI/CD** для автоматизации
Для получения дополнительной информации:
- Используйте `make help` для списка команд
- Читайте документацию в `docs/` директории
- Изучайте примеры в `roles/docker/`
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
Эти примеры демонстрируют основные возможности универсальной лаборатории. Для получения дополнительной информации обратитесь к [основной документации](universal-lab.md) и [описанию пресетов](presets.md).

View File

@@ -1,235 +0,0 @@
# Быстрый старт с AnsibleLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🚀 Установка и настройка
### 1. Клонирование репозитория
```bash
git clone ssh://git@git.antropoff.ru:222/Ansible/AnsibleLab.git
cd AnsibleLab
```
### 2. Проверка структуры проекта
```bash
# Просмотр доступных ролей
make role list
# Просмотр доступных preset'ов
make presets list
```
### 3. Настройка Docker (опционально)
Если вы хотите собрать собственные образы:
```bash
# Настройка multi-arch builder
make docker setup-builder
# Сборка всех образов
make docker build
# Проверка собранных образов
make docker info
```
**Примечание:** Используются готовые образы из Docker Hub `inecs/ansible-lab`.
## 🧪 Первое тестирование
### 1. Просмотр доступных preset'ов
```bash
# Список всех preset'ов
make presets list
# Информация о конкретном preset'е
make presets info PRESET=default
```
### 2. Тестирование роли ping
```bash
# Тестирование с default preset
make role test
# Тестирование с minimal preset (1 хост)
make role test minimal
```
### 3. Проверка результатов
```bash
# Проверка через логи
docker logs ansible-controller 2>/dev/null || echo "Контейнер не запущен"
# Просмотр созданных контейнеров
docker ps -a --filter "network=labnet"
```
## 🔧 Создание первой роли
### 1. Создание новой роли
```bash
# Интерактивное создание роли
make role create
# Введите имя роли (например: nginx)
```
### 2. Редактирование роли
После создания роли будет создана структура в `roles/<имя-роли>/`:
```
roles/my-role/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── defaults/
│ └── main.yml
├── vars/
│ └── main.yml
├── meta/
│ └── main.yml
├── templates/
├── files/
└── README.md
```
### 3. Написание задач роли
**`roles/my-role/tasks/main.yml`:**
```yaml
---
# Основные задачи для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Проверка установленных пакетов
debug:
msg: "Роль {{ role_name }} выполняется на {{ ansible_hostname }}"
- name: Установка пакетов (пример)
package:
name: "{{ my_role_packages | default([]) }}"
state: present
when: my_role_packages is defined
```
### 4. Настройка defaults
**`roles/my-role/defaults/main.yml`:**
```yaml
---
# Переменные по умолчанию для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
my_role_packages: []
my_role_enabled: true
```
### 5. Тестирование роли
```bash
# Проверка синтаксиса
make role lint my-role
# Тестирование с минимальным preset
make role test minimal
```
### 6. Добавление роли в deploy.yml
Роль автоматически добавляется в `roles/deploy.yml` при создании.
## 📚 Доступные роли
### Docker
Универсальная роль для установки Docker и Docker Compose.
```bash
# Тестирование роли docker
make role lint docker
make role test docker
```
**Документация:** [roles/docker/README.md](../roles/docker/README.md)
### DevOps
Роль для установки и настройки инструментов DevOps.
**Документация:** [roles/devops/README.md](../roles/devops/README.md)
### Ping
Простая роль для проверки ping.
```bash
# Тестирование роли ping
make role lint ping
make role test ping
```
**Документация:** [roles/ping/README.md](../roles/ping/README.md)
## 🎯 Preset система
### Базовые preset'ы
- **`default`** - Стандартный preset (2 хоста: Ubuntu + Debian)
- **`minimal`** - Минимальный preset (1 хост: Debian)
- **`test`** - Базовый тест (2 хоста)
### Preset'ы по ОС
- **Ubuntu**: `ubuntu20`, `ubuntu22`, `ubuntu24`, `ubuntu-all`
- **Debian**: `debian9`, `debian10`, `debian11`, `debian12`, `debian-all`
- **CentOS**: `centos7`, `centos8`, `centos9`, `centos-all`
### Специализированные preset'ы
- **`all-images`** - Все образы (16 хостов)
- **`multi-os`** - Multi-OS тестирование (8 хостов)
- **`docker-full`** - Docker тестирование (4 хоста)
- **`performance`** - Тест производительности (8 хостов)
- **`security`** - Тест безопасности (6 хостов)
## 🔐 Работа с секретами
### Инициализация Vault
```bash
# Создание файла с паролем
make vault init
```
### Создание и редактирование секретов
```bash
# Создание нового секрета
make vault create
# Редактирование существующего
make vault edit
# Просмотр секрета
make vault show
```
## 📖 Дополнительная документация
- [Руководство по Molecule](molecule-guide.md)
- [Создание ролей](creating-roles.md)
- [Docker образы](dockerfiles.md)
- [Preset система](presets-by-os.md)
- [Настройка CI/CD](cicd-setup.md)

View File

@@ -1,395 +0,0 @@
# Команды для работы с Kubernetes
Автор: Сергей Антропов
Сайт: https://devops.org.ru
## Содержание
- [Работа с манифестами](#работа-с-манифестами)
- [Работа с Helm](#работа-с-helm)
- [Работа с Helm репозиториями](#работа-с-helm-репозиториями)
## Работа с манифестами
Команды для применения, удаления и обновления манифестов YAML в кластере.
### Синтаксис
```bash
make k8s manifest [команда] [пресет] [URL_или_путь_к_файлу]
```
### Команды
#### `apply` - Применение манифеста
Применяет манифест YAML к кластеру.
```bash
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
```
**Примеры:**
```bash
# Применение манифеста из URL
make k8s manifest apply kubernetes https://example.com/deploy.yaml
# Применение локального манифеста
make k8s manifest apply kubernetes ./manifests/my-app.yaml
```
#### `delete` - Удаление ресурсов
Удаляет ресурсы из кластера по манифесту.
```bash
make k8s manifest delete kubernetes https://example.com/deploy.yaml
```
#### `update` - Обновление манифеста
Обновляет ресурсы в кластере, используя манифест.
```bash
make k8s manifest update kubernetes https://example.com/deploy.yaml
```
### Примеры использования
```bash
# Установка NGINX Ingress Controller
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
# Удаление ресурсов
make k8s manifest delete kubernetes https://example.com/deploy.yaml
# Обновление конфигурации
make k8s manifest update kubernetes https://example.com/deploy.yaml --force
```
## Работа с Helm
Команды для установки, обновления и управления Helm чартами в кластере.
### Синтаксис
```bash
make k8s helm [команда] [пресет] [релиз] [чант]
```
### Команды
#### `apply` - Установка/обновление чарта
Устанавливает новый релиз или обновляет существующий.
```bash
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
```
**Параметры:**
- `пресет` - имя пресета кластера
- `релиз` - имя релиза (например: my-nginx)
- `чарт` - имя чарта (например: nginx/nginx-ingress)
**Примеры:**
```bash
# Установка nginx-ingress
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
# Установка с указанием репозитория
make k8s helm apply kubernetes prometheus prometheus-community/prometheus
```
#### `delete` - Удаление релиза
Удаляет Helm релиз из кластера.
```bash
make k8s helm delete kubernetes my-nginx
```
**Примеры:**
```bash
# Удаление релиза
make k8s helm delete kubernetes nginx-ingress
# Удаление с флагом --keep-history
# (не поддерживается в текущей реализации)
```
#### `update` - Обновление релиза
Обновляет существующий Helm релиз.
```bash
make k8s helm update kubernetes my-nginx nginx/nginx-ingress
```
#### `rollback` - Откат релиза
Откатывает релиз к предыдущей версии.
```bash
make k8s helm rollback kubernetes my-nginx
```
**Примеры:**
```bash
# Откат к предыдущей ревизии
make k8s helm rollback kubernetes my-nginx
# Откат к конкретной ревизии (не поддерживается в текущей реализации)
```
#### `list` - Список релизов
Показывает список всех установленных Helm релизов.
```bash
make k8s helm list kubernetes
```
**Пример вывода:**
```
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx-ingress default 1 2024-01-15 12:00:00.000000 +0000 UTC deployed nginx-ingress-0.1.0 1.0.0
```
#### `status` - Статус релиза
Показывает подробную информацию о статусе релиза.
```bash
make k8s helm status kubernetes my-nginx
```
### Примеры использования
```bash
# 1. Установка NGINX Ingress Controller
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
# 2. Проверка статуса
make k8s helm status kubernetes nginx-ingress
# 3. Обновление релиза
make k8s helm update kubernetes nginx-ingress nginx/nginx-ingress
# 4. Просмотр списка релизов
make k8s helm list kubernetes
# 5. Откат релиза
make k8s helm rollback kubernetes nginx-ingress
# 6. Удаление релиза
make k8s helm delete kubernetes nginx-ingress
```
## Работа с Helm репозиториями
Команды для управления Helm репозиториями.
### Синтаксис
```bash
make k8s helmrepo [команда] [пресет] [имя] [URL]
```
### Команды
#### `add` - Добавление репозитория
Добавляет новый Helm репозиторий.
```bash
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
```
**Примеры:**
```bash
# Добавление официального репозитория Helm
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
# Добавление репозитория Bitnami
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# Добавление репозитория NGINX
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
# Добавление репозитория Prometheus
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
# Добавление пользовательского репозитория
make k8s helmrepo add kubernetes my-repo https://charts.example.com
```
#### `list` - Список репозиториев
Показывает список всех добавленных Helm репозиториев.
```bash
make k8s helmrepo list kubernetes
```
**Пример вывода:**
```
NAME URL
stable https://charts.helm.sh/stable
bitnami https://charts.bitnami.com/bitnami
nginx https://helm.nginx.com/stable
```
#### `delete` - Удаление репозитория
Удаляет Helm репозиторий.
```bash
make k8s helmrepo delete kubernetes stable
```
**Примеры:**
```bash
# Удаление репозитория
make k8s helmrepo delete kubernetes stable
```
#### `update` - Обновление репозиториев
Обновляет информацию о всех Helm репозиториях.
```bash
make k8s helmrepo update kubernetes
```
**Примеры:**
```bash
# Обновление всех репозиториев
make k8s helmrepo update kubernetes
```
#### `packages` - Список пакетов
Показывает список пакетов в указанном репозитории.
```bash
make k8s helmrepo packages kubernetes stable
```
**Примеры:**
```bash
# Просмотр пакетов в репозитории stable
make k8s helmrepo packages kubernetes stable
# Просмотр пакетов в репозитории nginx
make k8s helmrepo packages kubernetes nginx
# Поиск конкретного пакета
make k8s helmrepo packages kubernetes stable | grep nginx
```
### Примеры использования
```bash
# 1. Добавление нескольких репозиториев
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
# 2. Просмотр списка репозиториев
make k8s helmrepo list kubernetes
# 3. Обновление репозиториев
make k8s helmrepo update kubernetes
# 4. Поиск пакетов в репозитории
make k8s helmrepo packages kubernetes stable
# 5. Удаление репозитория
make k8s helmrepo delete kubernetes my-custom-repo
# 6. Установка пакета из добавленного репозитория
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
```
## Полный рабочий пример
```bash
# 1. Создание кластера
make k8s create kubernetes
# 2. Добавление Helm репозиториев
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# 3. Обновление репозиториев
make k8s helmrepo update kubernetes
# 4. Просмотр доступных пакетов
make k8s helmrepo packages kubernetes nginx
# 5. Установка NGINX Ingress Controller
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
# 6. Проверка статуса
make k8s helm status kubernetes nginx-ingress
# 7. Просмотр списка релизов
make k8s helm list kubernetes
# 8. Применение манифеста
make k8s manifest apply kubernetes https://example.com/deploy.yaml
# 9. Откат релиза (если нужно)
make k8s helm rollback kubernetes nginx-ingress
# 10. Удаление релиза
make k8s helm delete kubernetes nginx-ingress
# 11. Удаление репозитория
make k8s helmrepo delete kubernetes nginx
# 12. Удаление кластера
make k8s destroy kubernetes
```
## Обработка ошибок
### Ошибка: Контейнер не запущен
```
❌ Контейнер k8s-kubernetes не запущен
💡 Запустите: make k8s create kubernetes
```
**Решение:** Запустите кластер перед выполнением команд.
### Ошибка: Неизвестная команда
```
❌ Неизвестная команда: unknown
💡 Доступные команды: apply, delete, update
```
**Решение:** Используйте правильную команду из списка доступных.
### Ошибка: Не указаны параметры
```
❌ Ошибка: Укажите имя релиза и чарт
💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress
```
**Решение:** Укажите все необходимые параметры команды.
## Дополнительная информация
- Все команды kubectl и helm выполняются внутри контейнера `k8s-[пресет]`
- Вам не нужно устанавливать kubectl или helm локально
- Подключение к кластеру происходит через имя узла control-plane
- Используется флаг `--insecure-skip-tls-verify` для обхода проблем с сертификатами
## Автор
Сергей Антропов
Сайт: https://devops.org.ru

View File

@@ -1,906 +0,0 @@
# Полное руководство по работе с Kubernetes кластерами
Автор: Сергей Антропов
Сайт: https://devops.org.ru
## Содержание
- [Введение](#введение)
- [Создание кластера](#создание-кластера)
- [Управление кластером](#управление-кластером)
- [Работа с манифестами](#работа-с-манифестами)
- [Работа с Helm](#работа-с-helm)
- [Настройка Ingress](#настройка-ingress)
- [Мониторинг и аддоны](#мониторинг-и-аддоны)
- [Service Mesh с Istio](#service-mesh-с-istio)
- [Примеры полных развертываний](#примеры-полных-развертываний)
## Введение
AnsibleLab предоставляет полную поддержку создания и управления локальными Kubernetes кластерами на основе Kind (Kubernetes in Docker). Kind позволяет запускать Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки, тестирования и обучения.
### Основные возможности
- Создание многоузловых Kubernetes кластеров
- Установка и управление Helm чартами
- Работа с манифестами YAML
- Настройка Ingress контроллеров
- Установка систем мониторинга (Prometheus, Grafana)
- Развертывание Service Mesh (Istio, Kiali)
- Изоляция сети и безопасность
### Преимущества
- Не требует установки локального Kubernetes
- Быстрое создание и удаление кластеров
- Поддержка многоузловых конфигураций
- Полная совместимость с production окружениями
- Контейнеризация всех инструментов
## Создание кластера
### Базовое создание
Простое создание минимального кластера без дополнительных компонентов:
```bash
make k8s create
```
Создаст кластер с пресетом `k8s-minimal` - один control-plane узел без дополнительных компонентов.
### Создание полнофункционального кластера
Создание кластера с предустановленными компонентами:
```bash
make k8s create kubernetes
```
Этот пресет создает кластер со следующими компонентами:
- 1 control-plane узел
- 2 worker узла
- Ingress NGINX Controller
- Metrics Server
- Istio Service Mesh
- Kiali для визуализации Istio
- Prometheus Stack (Prometheus + Grafana)
### Конфигурация пресета
Пресеты находятся в `molecule/presets/k8s/`. Пример конфигурации:
```yaml
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
addon_ports:
prometheus: 9090
grafana: 3000
kiali: 20001
```
### Проверка статуса кластера
```bash
# Показать узлы кластера
make k8s nodes kubernetes
# Вывод:
# NAME STATUS ROLES AGE VERSION
# lab-control-plane Ready control-plane 5m v1.34.0
# lab-worker Ready <none> 4m v1.34.0
# lab-worker2 Ready <none> 4m v1.34.0
# Показать подробный статус
make k8s status kubernetes
```
### Подключение к кластеру
```bash
# Получить kubeconfig
make k8s config kubernetes
# Использовать kubeconfig
export KUBECONFIG=$(pwd)/kubeconfig
kubectl get nodes
```
## Управление кластером
### Остановка и запуск
```bash
# Остановить кластер (без удаления)
make k8s stop kubernetes
# Запустить остановленный кластер
make k8s start kubernetes
# Перезапустить кластер
make k8s stop kubernetes && make k8s start kubernetes
```
### Удаление кластера
```bash
# Полное удаление кластера и контейнера
make k8s destroy kubernetes
```
### Получение shell в контейнере
```bash
# Открыть интерактивный shell
make k8s shell kubernetes
# Теперь доступны все команды kubectl, helm, kind внутри контейнера
kubectl get nodes
helm list
kind get clusters
```
## Работа с манифестами
### Применение манифеста
Применение манифеста из URL:
```bash
make k8s manifest apply kubernetes https://example.com/deploy.yaml
```
Применение локального манифеста:
```bash
# Создайте файл example-deployment.yaml
cat > example-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
EOF
# Применить манифест
make k8s manifest apply kubernetes ./example-deployment.yaml
```
### Удаление ресурсов
```bash
make k8s manifest delete kubernetes https://example.com/deploy.yaml
```
### Обновление ресурсов
```bash
make k8s manifest update kubernetes https://example.com/deploy.yaml
```
## Работа с Helm
### Добавление Helm репозиториев
Список популярных репозиториев:
```bash
# Официальный Helm репозиторий
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
# Bitnami (большая коллекция чартов)
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# NGINX Inc
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
# Prometheus Community
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
# Istio
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
# Информация о репозиториях
make k8s helmrepo list kubernetes
```
### Обновление репозиториев
```bash
make k8s helmrepo update kubernetes
```
### Поиск чартов
```bash
# Просмотр всех чартов в репозитории
make k8s helmrepo packages kubernetes bitnami
# Поиск конкретного чарта
make k8s helmrepo packages kubernetes bitnami | grep nginx
# Поиск в нескольких репозиториях
make k8s helmrepo packages kubernetes bitnami | grep redis
make k8s helmrepo packages kubernetes stable | grep postgresql
```
### Установка Helm чартов
#### Пример 1: Установка Redis
```bash
# Добавить репозиторий
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# Обновить индекс
make k8s helmrepo update kubernetes
# Установить Redis
make k8s helm apply kubernetes redis bitnami/redis
# Проверить статус
make k8s helm status kubernetes redis
# Посмотреть список релизов
make k8s helm list kubernetes
```
#### Пример 2: Установка PostgreSQL
```bash
make k8s helm apply kubernetes postgres bitnami/postgresql
make k8s helm status kubernetes postgres
```
#### Пример 3: Установка Nginx Ingress через Helm
```bash
# Добавить репозиторий (если еще не добавлен)
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
# Обновить индекс
make k8s helmrepo update kubernetes
# Установить NGINX Ingress
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
# Проверить
make k8s helm status kubernetes nginx-ingress
```
### Обновление Helm релизов
```bash
# Обновить релиз до последней версии
make k8s helm update kubernetes redis bitnami/redis
# Проверить после обновления
make k8s helm status kubernetes redis
```
### Откат Helm релизов
```bash
# Откатить к предыдущей версии
make k8s helm rollback kubernetes redis
# Проверить статус после отката
make k8s helm status kubernetes redis
```
### Удаление Helm релизов
```bash
# Удалить релиз
make k8s helm delete kubernetes redis
make k8s helm delete kubernetes postgres
```
## Настройка Ingress
### Установка NGINX Ingress Controller
Ingress контроллер обычно устанавливается при создании кластера с пресетом `kubernetes`. Если нужна переустановка:
```bash
# Через манифест
make k8s manifest apply kubernetes \
https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
# Или через Helm
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
```
### Создание Ingress ресурса
Создайте файл `example-ingress.yaml`:
```yaml
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello
ports:
- port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
replicas: 2
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: hashicorp/http-echo:latest
args:
- "-text=Hello from Kubernetes!"
ports:
- containerPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: hello.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-service
port:
number: 80
```
Примените манифест:
```bash
make k8s manifest apply kubernetes ./example-ingress.yaml
```
Проверьте доступность:
```bash
# Добавьте запись в /etc/hosts
echo "127.0.0.1 hello.local" | sudo tee -a /etc/hosts
# Откройте в браузере или проверьте через curl
curl http://hello.local:8081
```
### TLS Ingress
Создайте TLS сертификат и добавьте в Ingress:
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-tls-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- hello.local
secretName: tls-secret
rules:
- host: hello.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-service
port:
number: 80
```
## Мониторинг и аддоны
### Prometheus Stack
Prometheus Stack устанавливается автоматически при создании кластера с пресетом `kubernetes`.
#### Доступ к Grafana
```bash
# 1. Получите пароль администратора
kubectl --kubeconfig kubeconfig get secret monitoring-grafana \
-n monitoring -o jsonpath="{.data.admin-password}" | base64 -d
# 2. Откройте браузер
# URL: http://localhost:3000
# Username: admin
# Password: [результат из команды выше]
```
#### Доступ к Prometheus
```bash
# URL: http://localhost:9090
# Откройте в браузере для просмотра метрик
```
#### Просмотр метрик
```bash
# Получить список метрик
curl http://localhost:9090/api/v1/label/__name__/values
# Запрос конкретной метрики
curl 'http://localhost:9090/api/v1/query?query=up'
```
### Установка дополнительных инструментов мониторинга
#### Loki для логов
```bash
# Добавить репозиторий Grafana
make k8s helmrepo add kubernetes grafana https://grafana.github.io/helm-charts
# Установить Loki
make k8s helm apply kubernetes loki grafana/loki-stack
# Проверить статус
make k8s helm status kubernetes loki
```
#### Jaeger для трейсинга
```bash
# Добавить репозиторий Jaeger
make k8s helmrepo add kubernetes jaegertracing https://jaegertracing.github.io/helm-charts
# Установить Jaeger
make k8s helm apply kubernetes jaeger jaegertracing/jaeger
# Проверить статус
make k8s helm status kubernetes jaeger
```
## Service Mesh с Istio
### Установка Istio
Istio устанавливается автоматически при создании кластера с пресетом `kubernetes`.
### Ручная установка Istio
```bash
# Добавить репозиторий Istio
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
# Установить Istio base
make k8s helm apply kubernetes istio-base istio/base
# Установить Istiod (control plane)
make k8s helm apply kubernetes istiod istio/istiod \
--set values.global.istiod.enableAnalysis=true
# Установить Istio Ingress Gateway
make k8s helm apply kubernetes istio-ingress istio/gateway
```
### Kiali для визуализации Istio
Kiali устанавливается автоматически с пресетом `kubernetes`.
#### Доступ к Kiali
```bash
# URL: http://localhost:20001
# Откройте в браузере для визуализации Service Mesh
# Настройки доступа
# Username: admin
# Password: admin (если используется анонимный доступ)
```
#### Ручная установка Kiali
```bash
# Добавить репозиторий Kiali
make k8s helmrepo add kubernetes kiali https://kiali.org/helm-charts
# Установить Kiali
make k8s helm apply kubernetes kiali-server kiali/kiali-server \
--set auth.strategy=anonymous \
--set deployment.ingress.enabled=true \
--set server.web_root="/"
# Проверить статус
make k8s helm status kubernetes kiali-server
```
### Пример приложения с Istio
Создайте файл `istio-app.yaml`:
```yaml
apiVersion: v1
kind: Namespace
metadata:
name: bookinfo
labels:
istio-injection: enabled
---
apiVersion: v1
kind: Service
metadata:
name: productpage
namespace: bookinfo
spec:
ports:
- port: 9080
name: http
targetPort: 9080
selector:
app: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage
namespace: bookinfo
spec:
replicas: 1
selector:
matchLabels:
app: productpage
template:
metadata:
labels:
app: productpage
spec:
containers:
- name: productpage
image: istio/examples-bookinfo-productpage-v1:latest
ports:
- containerPort: 9080
```
Примените:
```bash
make k8s manifest apply kubernetes ./istio-app.yaml
```
## Примеры полных развертываний
### Пример 1: WordPress с MySQL
```bash
# 1. Установить MySQL через Helm
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
make k8s helm apply kubernetes mysql bitnami/mysql \
--set auth.rootPassword=secretpassword
# 2. Создать манифест для WordPress
cat > wordpress.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 2
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
env:
- name: WORDPRESS_DB_HOST
value: mysql.default.svc.cluster.local
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
value: secretpassword
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
selector:
app: wordpress
ports:
- port: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress-ingress
spec:
rules:
- host: wordpress.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress
port:
number: 80
EOF
# 3. Применить манифест
make k8s manifest apply kubernetes ./wordpress.yaml
```
### Пример 2: Многоуровневое приложение с мониторингом
```bash
# 1. Установить Redis
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
make k8s helm apply kubernetes redis bitnami/redis
# 2. Установить PostgreSQL
make k8s helm apply kubernetes postgres bitnami/postgresql
# 3. Создать приложение
cat > app.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
version: v1
spec:
containers:
- name: api
image: nginx:alpine
ports:
- containerPort: 80
env:
- name: REDIS_HOST
value: redis-master.default.svc.cluster.local
- name: POSTGRES_HOST
value: postgresql-postgresql.default.svc.cluster.local
---
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- port: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
spec:
rules:
- host: api.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
EOF
# 4. Применить
make k8s manifest apply kubernetes ./app.yaml
```
### Пример 3: CI/CD с Jenkins в Kubernetes
```bash
# 1. Установить Jenkins
make k8s helmrepo add kubernetes jenkins https://charts.jenkins.io
make k8s helm apply kubernetes jenkins jenkins/jenkins \
--set persistence.enabled=true \
--set controller.installPlugins.enabled=true
# 2. Получить пароль администратора
kubectl --kubeconfig kubeconfig exec \
-n default svc/jenkins -c jenkins -- \
cat /run/secrets/additional/chart-admin-password
```
## Полезные команды и советы
### Мониторинг ресурсов
```bash
# Просмотр использования ресурсов узлами
kubectl --kubeconfig kubeconfig top nodes
# Просмотр использования ресурсов подами
kubectl --kubeconfig kubeconfig top pods
# Детальная информация о узле
kubectl --kubeconfig kubeconfig describe node lab-control-plane
```
### Отладка
```bash
# Просмотр логов пода
kubectl --kubeconfig kubeconfig logs <pod-name>
# Просмотр логов с follow
kubectl --kubeconfig kubeconfig logs -f <pod-name>
# Выполнить команду в поде
kubectl --kubeconfig kubeconfig exec -it <pod-name> -- /bin/sh
# Описание ресурса
kubectl --kubeconfig kubeconfig describe pod <pod-name>
kubectl --kubeconfig kubeconfig describe service <service-name>
```
### Масштабирование
```bash
# Масштабировать Deployment
kubectl --kubeconfig kubeconfig scale deployment <deployment-name> --replicas=5
# Автомасштабирование (требует metrics-server)
kubectl --kubeconfig kubeconfig autoscale deployment <deployment-name> \
--cpu-percent=70 --min=2 --max=10
```
### Экспорт конфигурации
```bash
# Экспортировать ресурс в YAML
kubectl --kubeconfig kubeconfig get deployment <name> -o yaml > exported.yaml
# Экспортировать все ресурсы namespace
kubectl --kubeconfig kubeconfig get all -n <namespace> -o yaml > all-resources.yaml
```
## Безопасность
### Использование Secrets
```bash
# Создать Secret из файла
kubectl --kubeconfig kubeconfig create secret generic my-secret \
--from-file=username=./username.txt \
--from-file=password=./password.txt
# Создать Secret из литерала
kubectl --kubeconfig kubeconfig create secret generic my-secret \
--from-literal=username=admin \
--from-literal=password=secret123
```
### Network Policies
Создайте файл `network-policy.yaml`:
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: api
ports:
- protocol: TCP
port: 5432
egress:
- to:
- podSelector:
matchLabels:
role: api
ports:
- protocol: TCP
port: 5432
```
Примените:
```bash
make k8s manifest apply kubernetes ./network-policy.yaml
```
## Заключение
AnsibleLab предоставляет полный набор инструментов для работы с Kubernetes кластерами локально. Вы можете:
- Создавать и управлять кластерами
- Устанавливать и настраивать приложения
- Работать с мониторингом и Service Mesh
- Тестировать перед развертыванием в production
Все инструменты работают внутри Docker контейнеров, что обеспечивает изоляцию и переносимость.
## Автор
Сергей Антропов
Сайт: https://devops.org.ru

View File

@@ -1,297 +0,0 @@
# Kubernetes Kind Кластеры
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе [Kind](https://kind.sigs.k8s.io/) для тестирования в изолированной лабораторной среде.
## Возможности
- Создание Kind кластеров с настраиваемым количеством worker-узлов
- Автоматическая установка аддонов:
- Ingress NGINX Controller
- Metrics Server
- Istio Service Mesh
- Kiali (визуализация Istio)
- Prometheus Stack (Prometheus + Grafana)
- Настройка портов для внешнего доступа к аддонам
- Интеграция с Docker контейнерами в одной лабораторной сети
## Команды
### Создание кластера
```bash
# Создание минимального кластера (без аддонов)
make k8s create
# Создание кластера с полным набором аддонов
make k8s create kubernetes
# Использование пользовательского пресета
make k8s create my-custom-preset
```
### Управление кластером
```bash
# Удаление кластера
make k8s destroy [preset]
# Остановка кластера (без удаления)
make k8s stop [cluster]
# Запуск остановленного кластера
make k8s start [cluster]
# Проверка статуса кластера
make k8s status [cluster]
# Получение kubeconfig для подключения
make k8s config [cluster]
# Открытие shell в контейнере
make k8s shell
```
## Конфигурация
### Пресеты Kubernetes хранятся в `molecule/presets/k8s/`
#### Минимальный кластер (`k8s-minimal.yml`)
```yaml
kind_clusters:
- name: minimal
workers: 0 # Только control-plane узел
api_port: 6443
```
#### Полный кластер с аддонами (`kubernetes.yml`)
```yaml
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
# Порты для внешнего доступа к аддонам
addon_ports:
prometheus: 9090
grafana: 3000
kiali: 20001
```
## Доступ к аддонам
После создания кластера с аддонами, они доступны на следующих портах:
### Prometheus
```bash
# Web UI доступна на порту 9090
http://localhost:9090
```
### Grafana
```bash
# Web UI доступна на порту 3000
http://localhost:3000
# Пароль администратора
kubectl get secret -n monitoring monitoring-grafana \
-o jsonpath="{.data.admin-password}" | base64 -d
# Логин: admin
# Пароль: (получен выше)
```
### Kiali
```bash
# Web UI доступна на порту 20001
http://localhost:20001
# Аутентификация: anonymous (отключена по умолчанию)
```
### Istio Ingress
```bash
# HTTP доступен на порту 8081
http://localhost:8081
# HTTPS доступен на порту 8443
https://localhost:8443
```
## Примеры использования
### Создание и настройка кластера
```bash
# 1. Создать кластер с аддонами
make k8s create kubernetes
# 2. Проверить статус
make k8s status
# 3. Получить kubeconfig
make k8s config lab
# 4. Использовать kubeconfig
export KUBECONFIG=kubeconfig
kubectl get nodes
kubectl get pods -A
# 5. Открыть Grafana в браузере
open http://localhost:3000
# Логин: admin
# Пароль: (получить командой выше)
```
### Управление кластером
```bash
# Остановить кластер (без удаления)
make k8s stop lab
# Запустить остановленный кластер
make k8s start lab
# Проверить конкретный кластер
make k8s status lab
# Получить kubeconfig для конкретного кластера
make k8s config lab
# Удалить кластер
make k8s destroy kubernetes
```
### Работа внутри контейнера
```bash
# Открыть shell в контейнере ansible-controller
make k8s shell
# Внутри контейнера:
kind get clusters
kubectl --context kind-lab get nodes
istioctl --context kind-lab proxy-status
kubectl --context kind-lab get pods -n monitoring
```
## Архитектура
```
┌─────────────────────────────────────────────────────────┐
│ Docker Network: labnet │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Ubuntu22 │ │ Debian12 │ │ Ansible │ │
│ │ Container │ │ Container │ │ Controller │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Kind Cluster: "lab" │ │
│ │ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Control Plane│ │ Worker 1 │ │ │
│ │ │ Port 6443 │ │ │ │ │
│ │ └──────────────┘ └──────────────┘ │ │
│ │ ┌──────────────┐ │ │
│ │ │ Worker 2 │ │ │
│ │ └──────────────┘ │ │
│ │ │ │
│ │ NodePort Services: │ │
│ │ - Prometheus :9090 │ │
│ │ - Grafana :3000 │ │
│ │ - Kiali :20001 │ │
│ │ - Ingress :8081 (HTTP), :8443 (HTTPS) │ │
│ └──────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
```
## Настройка портов аддонов
Вы можете настроить порты для внешнего доступа в пресете:
```yaml
kind_clusters:
- name: lab
workers: 2
addons:
prometheus_stack: true
kiali: true
addon_ports:
prometheus: 9090 # Prometheus UI
grafana: 3000 # Grafana UI
kiali: 20001 # Kiali UI
```
## Best Practices
1. **Минимальные ресурсы:** Для быстрого тестирования используйте `workers: 0` (только control-plane)
2. **Production-like:** Для реалистичных тестов используйте `workers: 2-3`
3. **Аддоны:** Включайте только необходимые аддоны для уменьшения времени создания
4. **Изоляция:** Каждый preset может иметь свой уникальный кластер с разными настройками
5. **Порты:** Используйте разные порты для разных кластеров, если запускаете несколько
## Troubleshooting
### Кластер не создается
```bash
# Проверить логи
docker logs ansible-controller
# Проверить доступное место на диске
df -h
# Проверить Docker ресурсы
docker system df
```
### Проблемы с аддонами
```bash
# Проверить статус подов
kubectl get pods -A
# Проверить сервисы
kubectl get svc -A
# Проверить порты
kubectl get svc -n monitoring
```
### Проблемы с Istio
```bash
# Переустановить Istio
istioctl uninstall -y --context kind-lab
istioctl install -y --set profile=demo --context kind-lab
```
### Проблемы с Prometheus Stack
```bash
# Переустановить
helm uninstall monitoring -n monitoring
helm upgrade --install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --kube-context kind-lab
```
## Дополнительные ресурсы
- [Kind Documentation](https://kind.sigs.k8s.io/docs/)
- [Istio Documentation](https://istio.io/latest/docs/)
- [Kiali Documentation](https://kiali.io/documentation/)
- [Prometheus Operator](https://prometheus-operator.dev/)

View File

@@ -1,226 +0,0 @@
# 🔍 Руководство по линтингу ролей
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Обзор
Линтинг ролей - это автоматическая проверка синтаксиса, стиля и соответствия лучшим практикам Ansible. В AnsibleLab используется `ansible-lint` для обеспечения качества кода.
## Команды линтинга
### Проверка всех ролей
```bash
make role lint
```
- Проверяет все роли в директории `roles/`
- Использует конфигурацию из `.ansible-lint`
- Показывает все найденные ошибки и предупреждения
### Проверка конкретной роли
```bash
make role lint devops
make role lint ping
```
- Проверяет только указанную роль
- Автоматически валидирует существование роли
- Показывает доступные роли при ошибке
## Профили линтинга
Ansible-lint использует несколько профилей для разных уровней строгости:
### Production (по умолчанию)
- Самый строгий профиль
- Проверяет все правила
- Рекомендуется для продакшн кода
### Basic
- Базовые правила
- Подходит для разработки
- Менее строгий чем production
### Min
- Минимальные правила
- Только критичные ошибки
- Для быстрой проверки
## Конфигурация
Линтинг настраивается через файл `.ansible-lint`:
```yaml
---
# Профиль по умолчанию
profile: production
# Исключения
skip_list:
- yaml[line-length] # Исключить проверку длины строк
# Дополнительные правила
enable_list:
- name[casing] # Включить проверку именования
# Игнорирование файлов
exclude_paths:
- .cache/
- .github/
- tests/
```
## Типы ошибок
### Синтаксические ошибки
- Неправильный YAML синтаксис
- Ошибки в Jinja2 шаблонах
- Неправильная структура playbook
### Стилистические ошибки
- Trailing spaces (лишние пробелы)
- Неправильные комментарии
- Неправильное форматирование
### Лучшие практики
- Использование устаревших модулей
- Неправильное использование become
- Отсутствие changed_when для command
## Примеры исправлений
### Trailing spaces
```yaml
# ❌ Неправильно
groups: ["sudo", "docker"]
# Лишние пробелы в конце строки
# ✅ Правильно
groups: ["sudo", "docker"]
```
### Комментарии
```yaml
# ❌ Неправильно
#Комментарий без пробела
# ✅ Правильно
# Комментарий с пробелом
```
### Changed when
```yaml
# ❌ Неправильно
- name: "Проверка статуса"
command: "systemctl status nginx"
# ✅ Правильно
- name: "Проверка статуса"
command: "systemctl status nginx"
changed_when: false
```
## Автоматическое исправление
Некоторые ошибки можно исправить автоматически:
```bash
# Исправить trailing spaces
sed -i 's/[[:space:]]*$//' roles/*/tasks/*.yml
# Исправить комментарии
sed -i 's/^#\([^ ]\)/# \1/' roles/*/tasks/*.yml
```
## Интеграция с CI/CD
Линтинг автоматически запускается в CI/CD пайплайне:
```yaml
# .github/workflows/lint.yml
name: Lint
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run lint
run: make role lint
```
## Лучшие практики
### 1. Регулярная проверка
```bash
# Проверяйте код перед коммитом
make role lint
# Проверяйте конкретную роль при разработке
make role lint devops
```
### 2. Исправляйте ошибки сразу
- Не накапливайте ошибки
- Исправляйте по мере обнаружения
- Используйте автоматические исправления
### 3. Настройте IDE
- Включите поддержку YAML
- Настройте автоформатирование
- Используйте расширения для Ansible
### 4. Используйте pre-commit hooks
```yaml
# .pre-commit-config.yaml
repos:
- repo: https://github.com/ansible/ansible-lint
rev: v6.0.0
hooks:
- id: ansible-lint
```
## Устранение неполадок
### Ошибка "Role not found"
```bash
❌ Роль 'nonexistent' не найдена в roles/
📋 Доступные роли:
- devops
- ping
```
**Решение**: Проверьте правильность имени роли
### Ошибка "Docker image not found"
```bash
Unable to find image 'ansible-controller:latest' locally
```
**Решение**: Соберите Docker образы:
```bash
make docker build
```
### Ошибка "Permission denied"
```bash
Permission denied: /workspace/roles/
```
**Решение**: Проверьте права доступа к файлам
## Дополнительные ресурсы
- [Ansible Lint Documentation](https://ansible.readthedocs.io/projects/lint/)
- [Ansible Best Practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html)
- [YAML Style Guide](https://yaml.org/spec/1.2/spec.html)
## Поддержка
Если у вас возникли вопросы или проблемы с линтингом:
1. Проверьте документацию выше
2. Запустите `make role lint` для диагностики
3. Обратитесь к команде разработки
---
**Последнее обновление**: $(date)
**Версия**: 1.0.0

View File

@@ -1,859 +0,0 @@
# Подробное руководство по файлам Molecule
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## 📋 Обзор
Molecule - это инструмент для тестирования Ansible ролей в изолированных окружениях. В проекте AnsibleLab используется универсальная конфигурация Molecule с поддержкой множества операционных систем и различных preset'ов для тестирования.
### 🔧 Fallback значения
**Важная особенность:** Все файлы Molecule содержат fallback значения, что обеспечивает работоспособность системы даже без preset файлов. Это означает, что:
- **Система всегда работает** - даже если preset файл не найден
- **Быстрый старт** - можно запустить тестирование без настройки
- **Надежность** - меньше точек отказа в системе
- **Отладка** - легче диагностировать проблемы с preset'ами
## 🏗️ Структура файлов Molecule
```
molecule/
├── default/ # Основная конфигурация Molecule
│ ├── molecule.yml # Главный конфигурационный файл
│ ├── create.yml # Создание тестовых контейнеров
│ ├── converge.yml # Выполнение ролей в контейнерах
│ ├── verify.yml # Проверка результатов тестирования
│ ├── destroy.yml # Удаление тестовых контейнеров
│ └── site.yml # Основной playbook для тестирования
└── presets/ # Preset конфигурации для разных сценариев
├── minimal.yml # Минимальный preset (1 хост)
├── performance.yml # Performance preset (12 хостов)
├── security.yml # Security preset (10 хостов)
├── etcd-patroni.yml # etcd-patroni preset
└── ... # Другие preset'ы
```
## 📄 Детальное описание файлов
### 1. `molecule/default/molecule.yml` - Главный конфигурационный файл
**Назначение:** Основная конфигурация Molecule с настройками драйвера, платформ, provisioner'а и verifier'а.
#### Основные секции:
**Driver (Драйвер):**
```yaml
driver:
name: docker
```
- **Назначение:** Определяет использование Docker в качестве драйвера
- **Функция:** Создание и управление тестовыми контейнерами
**Platforms (Платформы):**
```yaml
platforms:
- name: placeholder
image: ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy
pre_build_image: true
- name: ansible-controller
image: inecs/ansible-lab:ansible-controller-latest
pre_build_image: true
# ... другие образы
```
- **Назначение:** Определяет доступные Docker образы для тестирования
- **Поддерживаемые ОС:** Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux, Alt Linux, Astra Linux, RedOS
- **Собственные образы:** AnsibleLab создает собственные образы для тестирования
**Provisioner (Провижнер):**
```yaml
provisioner:
name: ansible
config_options:
defaults:
stdout_callback: yaml
env:
ANSIBLE_STDOUT_CALLBACK: yaml
inventory:
links:
hosts: "${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini"
playbooks:
create: create.yml
converge: converge.yml
destroy: destroy.yml
```
- **Назначение:** Настройка Ansible как provisioner'а
- **Функции:**
- Настройка вывода в YAML формате
- Связывание инвентори файла
- Определение playbook'ов для разных этапов
**Dependency (Зависимости):**
```yaml
dependency:
name: galaxy
```
- **Назначение:** Установка зависимостей через Ansible Galaxy
- **Функция:** Автоматическая установка коллекций из `requirements.yml`
**Verifier (Верификатор):**
```yaml
verifier:
name: ansible
```
- **Назначение:** Использование Ansible для проверки результатов
- **Функция:** Выполнение `verify.yml` для проверки состояния системы
**Lint (Линтер):**
```yaml
lint: |-
set -e
ansible-lint /workspace/roles/
```
- **Назначение:** Проверка синтаксиса ролей
- **Функция:** Запуск `ansible-lint` для всех ролей в директории `roles/`
### 2. `molecule/default/create.yml` - Создание тестовых контейнеров
**Назначение:** Создание и настройка тестовых контейнеров согласно выбранному preset'у с fallback значениями.
#### Переменные и конфигурация:
**Fallback значения (по умолчанию):**
```yaml
vars:
# Получаем preset из переменной окружения или используем default
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
# Fallback значения если preset файл не найден
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos: "inecs/ansible-lab:centos-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu: "inecs/ansible-lab:ubuntu-latest"
debian: "inecs/ansible-lab:debian-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
- name: u1
family: debian
groups: [test]
```
- **Назначение:** Определение fallback значений для случаев когда preset файл не найден
- **Функция:** Обеспечение работоспособности даже без preset файлов
- **Образы:** Собственные образы AnsibleLab для всех поддерживаемых ОС
- **Systemd настройки:** Стандартные настройки для systemd контейнеров
#### Основные задачи:
**Load preset configuration:**
```yaml
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
```
- **Назначение:** Загрузка конфигурации preset'а (перезаписывает fallback значения)
- **Функция:** Динамическое определение тестового окружения
- **Переменные:** `MOLECULE_PRESET` определяет какой preset использовать
- **Fallback:** Если preset файл не найден, используются значения по умолчанию
#### Преимущества fallback значений:
1. **Надежность:** Система работает даже без preset файлов
2. **Быстрый старт:** Можно запустить тестирование без настройки preset'ов
3. **Стандартизация:** Единые настройки для всех ОС
4. **Отладка:** Легче диагностировать проблемы с preset файлами
5. **Разработка:** Удобно для разработки новых preset'ов
**Ensure network exists:**
```yaml
- name: Ensure network exists
community.docker.docker_network:
name: "{{ docker_network }}"
state: present
```
- **Назначение:** Создание Docker сети для тестирования
- **Функция:** Обеспечение сетевого взаимодействия между контейнерами
- **По умолчанию:** Сеть `labnet`
**Pull systemd images:**
```yaml
- name: Pull systemd images
community.docker.docker_image:
name: "{{ images[item.family] }}"
source: pull
loop: "{{ hosts | selectattr('type','undefined') | list }}"
```
- **Назначение:** Загрузка Docker образов для systemd контейнеров
- **Функция:** Подготовка образов для создания контейнеров
- **Поддержка:** Различные семейства ОС (debian, rhel, alt, astra)
**Start systemd nodes:**
```yaml
- name: Start systemd nodes
community.docker.docker_container:
name: "{{ item.name }}"
image: "{{ images[item.family] }}"
networks:
- name: "{{ docker_network }}"
privileged: "{{ systemd_defaults.privileged }}"
command: "{{ systemd_defaults.command }}"
volumes: "{{ systemd_defaults.volumes | default([]) + (item.volumes | default([])) }}"
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
published_ports: "{{ item.publish | default([]) }}"
env: "{{ item.env | default({}) }}"
state: started
restart_policy: unless-stopped
```
- **Назначение:** Создание и запуск systemd контейнеров
- **Функции:**
- Создание контейнеров с systemd поддержкой
- Настройка привилегированного режима
- Монтирование cgroup для systemd
- Настройка tmpfs для /run
- Публикация портов
- Настройка переменных окружения
**Start DinD nodes (Docker-in-Docker):**
```yaml
- name: Start DinD nodes (docker:27-dind)
community.docker.docker_container:
name: "{{ item.name }}"
image: "docker:27-dind"
networks:
- name: "{{ docker_network }}"
privileged: true
env:
DOCKER_TLS_CERTDIR: ""
published_ports: "{{ item.publish | default([]) }}"
volumes: "{{ (item.volumes | default([])) + [item.name + '-docker:/var/lib/docker'] }}"
state: started
restart_policy: unless-stopped
```
- **Назначение:** Создание Docker-in-Docker контейнеров
- **Функции:**
- Тестирование Docker Compose
- Тестирование Dockerfile'ов
- Изолированная Docker среда
- Отдельные volumes для Docker данных
**Start DOoD nodes (Docker-out-of-Docker):**
```yaml
- name: Start DOoD nodes (systemd + docker.sock mount)
community.docker.docker_container:
name: "{{ item.name }}"
image: "{{ images[item.family] }}"
networks:
- name: "{{ docker_network }}"
privileged: "{{ systemd_defaults.privileged }}"
command: "{{ systemd_defaults.command }}"
volumes: "{{ (systemd_defaults.volumes | default([])) + ['/var/run/docker.sock:/var/run/docker.sock'] + (item.volumes | default([])) }}"
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
published_ports: "{{ item.publish | default([]) }}"
env: "{{ item.env | default({}) }}"
state: started
restart_policy: unless-stopped
```
- **Назначение:** Создание Docker-out-of-Docker контейнеров
- **Функции:**
- Доступ к Docker daemon хоста
- Тестирование Docker операций
- Комбинация systemd + Docker
**Build groups map:**
```yaml
- name: Initialize groups map
set_fact:
groups_map: {}
- name: Append hosts to groups
set_fact:
groups_map: "{{ groups_map | combine({ item_group: (groups_map[item_group] | default([])) + [item_name] }) }}"
loop: "{{ hosts | subelements('groups', skip_missing=True) }}"
```
- **Назначение:** Создание карты групп для инвентори
- **Функция:** Группировка хостов по назначению (servers, database, cache, etc.)
**Render inventory ini:**
```yaml
- name: Render inventory ini
set_fact:
inv_content: |
[all:vars]
ansible_connection=community.docker.docker
ansible_python_interpreter=/usr/bin/python3
{% for group, members in (groups_map | dictsort) %}
[{{ group }}]
{% for h in members %}{{ h }}
{% endfor %}
{% endfor %}
[all]
{% for h in hosts %}{{ h.name }}
{% endfor %}
```
- **Назначение:** Генерация инвентори файла
- **Функция:** Создание динамического инвентори для Ansible
- **Формат:** INI формат с группами и переменными
**Write inventory file:**
```yaml
- name: Write inventory file
copy:
dest: "{{ generated_inventory }}"
content: "{{ inv_content }}"
mode: "0644"
```
- **Назначение:** Сохранение инвентори файла
- **Функция:** Запись сгенерированного инвентори в файл
**Display inventory summary:**
```yaml
- name: Display inventory summary
debug:
msg: |
📋 Inventory Summary:
- Total hosts: {{ hosts | length }}
- Groups: {{ groups_map.keys() | list | join(', ') }}
- Systemd nodes: {{ hosts | selectattr('type','undefined') | list | length }}
- DinD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- DOoD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
```
- **Назначение:** Отображение сводки по созданным контейнерам
- **Функция:** Информация о количестве и типах контейнеров
### 3. `molecule/default/converge.yml` - Выполнение ролей
**Назначение:** Выполнение Ansible ролей в созданных контейнерах.
#### Основные задачи:
**Load preset configuration:**
```yaml
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
```
- **Назначение:** Загрузка конфигурации preset'а
- **Функция:** Применение настроек preset'а для выполнения
**Preflight vault — normalize state:**
```yaml
- 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
[ -f "$f" ] || continue;
if head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;"; then
echo "[vault] already encrypted: $f";
else
echo "[vault] plaintext -> encrypt: $f";
ansible-vault encrypt --encrypt-vault-id default --vault-password-file /workspace/vault/.vault "$f";
fi
echo "[vault] decrypt for run: $f";
ansible-vault decrypt --vault-password-file /workspace/vault/.vault "$f";
done
done
'
```
- **Назначение:** Подготовка vault файлов для выполнения
- **Функции:**
- Шифрование незашифрованных файлов
- Расшифровка файлов для выполнения
- Нормализация состояния vault файлов
**Run lab playbook:**
```yaml
- name: Run lab playbook
community.docker.docker_container_exec:
container: ansible-controller
command: >
bash -lc "
ANSIBLE_ROLES_PATH=/workspace/roles
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.ini /workspace/molecule/default/site.yml
"
```
- **Назначение:** Выполнение основного playbook'а
- **Функции:**
- Запуск `site.yml` в ansible-controller контейнере
- Использование сгенерированного инвентори
- Установка пути к ролям
**Post-run — re-encrypt secrets:**
```yaml
- name: Post-run — re-encrypt secrets
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
[ -f "$f" ] || continue;
if head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;"; then
echo "[vault] ok (encrypted): $f";
else
echo "[vault] encrypt back: $f";
ansible-vault encrypt --encrypt-vault-id default --vault-password-file /workspace/vault/.vault "$f" || true;
fi
done
done
'
ignore_errors: true
```
- **Назначение:** Повторное шифрование секретов после выполнения
- **Функция:** Обеспечение безопасности vault файлов
### 4. `molecule/default/verify.yml` - Проверка результатов
**Назначение:** Проверка состояния системы после выполнения ролей.
#### Основные задачи:
**Load preset configuration:**
```yaml
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
```
- **Назначение:** Загрузка конфигурации preset'а
- **Функция:** Применение настроек для проверки
**Check systemd nodes status:**
```yaml
- name: Check systemd nodes status
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: systemctl is-system-running
loop: "{{ hosts | selectattr('type','undefined') | list }}"
register: systemd_status
ignore_errors: true
```
- **Назначение:** Проверка состояния systemd в контейнерах
- **Функция:** Убедиться что systemd работает корректно
**Check DinD nodes docker daemon:**
```yaml
- name: Check DinD nodes docker daemon
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: docker version --format '{{.Server.Version}}'
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
register: dind_status
ignore_errors: true
```
- **Назначение:** Проверка Docker daemon в DinD контейнерах
- **Функция:** Убедиться что Docker работает в контейнерах
**Check DOoD nodes docker access:**
```yaml
- name: Check DOoD nodes docker access
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: docker ps --format '{{.Names}}'
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
register: dood_status
ignore_errors: true
```
- **Назначение:** Проверка доступа к Docker в DOoD контейнерах
- **Функция:** Убедиться что контейнеры могут обращаться к Docker daemon
**Test network connectivity between nodes:**
```yaml
- name: Test network connectivity between nodes
community.docker.docker_container_exec:
container: "{{ item.0.name }}"
command: ping -c 1 {{ item.1.name }}
loop: "{{ hosts | subelements(hosts, 'name') }}"
when: item.0.name != item.1.name
register: ping_results
ignore_errors: true
```
- **Назначение:** Проверка сетевого взаимодействия между контейнерами
- **Функция:** Убедиться что контейнеры могут общаться друг с другом
**Check published ports:**
```yaml
- name: Check published ports
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: netstat -tlnp
loop: "{{ hosts | selectattr('publish','defined') | list }}"
register: port_status
ignore_errors: true
```
- **Назначение:** Проверка опубликованных портов
- **Функция:** Убедиться что порты доступны
**Display verification summary:**
```yaml
- name: Display verification summary
debug:
msg: |
✅ Verification Summary:
- Total hosts: {{ hosts | length }}
- Systemd nodes: {{ hosts | selectattr('type','undefined') | list | length }}
- DinD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- DOoD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
- Groups: {{ groups_map.keys() | list | join(', ') }}
- Network: {{ docker_network }}
```
- **Назначение:** Отображение итоговой сводки проверки
- **Функция:** Информация о состоянии всех компонентов
### 5. `molecule/default/destroy.yml` - Удаление контейнеров
**Назначение:** Очистка тестовых контейнеров и ресурсов.
#### Основные задачи:
**Load preset configuration:**
```yaml
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
```
- **Назначение:** Загрузка конфигурации preset'а
- **Функция:** Определение какие ресурсы нужно удалить
**Stop and remove containers:**
```yaml
- name: Stop and remove containers
community.docker.docker_container:
name: "{{ item.name }}"
state: absent
force_kill: true
loop: "{{ hosts }}"
ignore_errors: true
```
- **Назначение:** Остановка и удаление всех контейнеров
- **Функция:** Полная очистка тестовых контейнеров
**Remove DinD volumes:**
```yaml
- name: Remove DinD volumes
community.docker.docker_volume:
name: "{{ item.name }}-docker"
state: absent
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
ignore_errors: true
```
- **Назначение:** Удаление volumes для DinD контейнеров
- **Функция:** Очистка Docker данных
**Remove custom volumes:**
```yaml
- name: Remove custom volumes
community.docker.docker_volume:
name: "{{ item.volumes | default([]) | select('match', '^[^:]+$') | list }}"
state: absent
loop: "{{ hosts }}"
ignore_errors: true
when: item.volumes is defined
```
- **Назначение:** Удаление пользовательских volumes
- **Функция:** Очистка дополнительных volumes
**Remove network:**
```yaml
- name: Remove network
community.docker.docker_network:
name: "{{ docker_network }}"
state: absent
ignore_errors: true
```
- **Назначение:** Удаление Docker сети
- **Функция:** Очистка сетевых ресурсов
**Display cleanup summary:**
```yaml
- name: Display cleanup summary
debug:
msg: |
🧹 Cleanup Summary:
- Removed containers: {{ hosts | length }}
- Removed DinD volumes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- Network: {{ docker_network }}
```
- **Назначение:** Отображение сводки по очистке
- **Функция:** Информация о удаленных ресурсах
### 6. `molecule/default/site.yml` - Основной playbook
**Назначение:** Основной playbook для тестирования ролей.
#### Структура:
**Подготовка окружения:**
- Обновление пакетов для всех ОС
- Установка common tools
- Настройка пользователей
- Создание рабочих директорий
**Импорт deploy.yml:**
```yaml
- import_playbook: ../../roles/deploy.yml
```
- **Назначение:** Импорт playbook'а с ролями
- **Функция:** Разделение логики подготовки и выполнения ролей
## 🎯 Preset файлы
### `molecule/presets/minimal.yml` - Минимальный preset
**Назначение:** Быстрое тестирование с одним хостом.
**Характеристики:**
- **Количество хостов:** 1
- **ОС:** Debian
- **Группы:** test
- **Использование:** Быстрая проверка ролей
### `molecule/presets/performance.yml` - Performance preset
**Назначение:** Нагрузочное тестирование с множеством хостов.
**Характеристики:**
- **Количество хостов:** 12
- **Серверы:** 5 узлов (web, app)
- **База данных:** 3 узла
- **Кэш:** 3 узла Redis
- **Load balancer:** 1 узел HAProxy
- **DinD:** 1 узел для Docker Compose
**Группы:**
- `servers` - веб-серверы
- `database` - базы данных
- `cache` - кэш серверы
- `loadbalancer` - балансировщик нагрузки
- `apps` - приложения
### `molecule/presets/security.yml` - Security preset
**Назначение:** Тестирование безопасности с изолированными сетями.
**Характеристики:**
- **Количество хостов:** 10
- **Bastion хосты:** 2 (точки входа)
- **Внутренние серверы:** 3
- **База данных:** 2 (изолированная сеть)
- **Мониторинг:** 2
- **Firewall:** 2
- **DOoD:** 1 для Docker безопасности
**Группы:**
- `bastion` - точки входа
- `internal` - внутренние серверы
- `database` - базы данных
- `monitoring` - мониторинг
- `firewall` - сетевые компоненты
- `security` - компоненты безопасности
## 🚀 Использование
### Базовые команды:
```bash
# Тестирование с минимальным preset'ом
make role test minimal
# Тестирование с performance preset'ом
make role test performance
# Тестирование с security preset'ом
make role test security
# Тестирование конкретной роли
make role test minimal ping
# Тестирование без preset'а (используются fallback значения)
make role test
# Тестирование с несуществующим preset'ом (используются fallback значения)
MOLECULE_PRESET=nonexistent make role test
```
### Продвинутое использование:
```bash
# Тестирование с кастомным preset'ом
MOLECULE_PRESET=custom make role test
# Отладка с подробным выводом
make role test minimal --verbose
# Проверка только создания контейнеров
molecule create -s default
# Проверка только выполнения ролей
molecule converge -s default
# Проверка только верификации
molecule verify -s default
# Очистка контейнеров
molecule destroy -s default
```
## 🔧 Настройка
### Создание собственного preset'а:
```yaml
# molecule/presets/custom.yml
---
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
images:
ubuntu: "inecs/ansible-lab:ubuntu-latest"
rhel: "inecs/ansible-lab:rhel-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
- name: web1
family: ubuntu
groups: [web, servers]
publish: ["80:80"]
- name: db1
family: rhel
groups: [database, internal]
```
### Использование fallback значений:
```bash
# Тестирование без preset'а (используются fallback значения из create.yml)
make role test
# Тестирование с несуществующим preset'ом (используются fallback значения)
MOLECULE_PRESET=nonexistent make role test
# Проверка fallback значений
molecule create -s default --debug
```
### Использование кастомного preset'а:
```bash
MOLECULE_PRESET=custom make role test
```
## 🐛 Troubleshooting
### Проблемы с контейнерами:
**Ошибка:** Контейнер не запускается
**Решение:** Проверить доступность Docker образа и ресурсы системы
**Ошибка:** Systemd не работает
**Решение:** Убедиться что контейнер запущен с `privileged: true` и правильными volumes
**Ошибка:** Сетевое взаимодействие не работает
**Решение:** Проверить создание Docker сети и настройки firewall
### Проблемы с preset файлами:
**Ошибка:** Preset файл не найден
**Решение:** Система автоматически использует fallback значения из `create.yml`
**Ошибка:** Неправильная конфигурация preset'а
**Решение:** Проверить синтаксис YAML и доступность образов в preset файле
**Ошибка:** Preset файл не загружается
**Решение:** Убедиться что файл находится в `molecule/presets/` и имеет правильное имя
### Проблемы с ролями:
**Ошибка:** Роль не найдена
**Решение:** Проверить путь к роли в `roles/deploy.yml`
**Ошибка:** Ошибка выполнения роли
**Решение:** Проверить совместимость роли с ОС и зависимости
### Проблемы с vault:
**Ошибка:** Не удается расшифровать vault файлы
**Решение:** Проверить наличие файла `.vault` и правильность пароля
**Ошибка:** Vault файлы остались расшифрованными
**Решение:** Проверить права доступа и настройки vault
## 📊 Мониторинг
### Логи выполнения:
```bash
# Просмотр логов Molecule
molecule test -s default --debug
# Логи конкретного этапа
molecule create -s default --debug
molecule converge -s default --debug
molecule verify -s default --debug
```
### Проверка состояния:
```bash
# Статус контейнеров
docker ps
# Статус сети
docker network ls
# Статус volumes
docker volume ls
```
## 🎯 Лучшие практики
1. **Используйте подходящие preset'ы** для разных типов тестирования
2. **Проверяйте совместимость ролей** с различными ОС
3. **Используйте теги** для разделения задач в ролях
4. **Документируйте зависимости** ролей
5. **Тестируйте на разных preset'ах** перед коммитом
6. **Используйте vault** для секретных данных
7. **Очищайте ресурсы** после тестирования
8. **Используйте fallback значения** для быстрого старта без preset'ов
9. **Проверяйте доступность образов** перед созданием preset'ов
10. **Документируйте кастомные preset'ы** для команды
## 🔗 Связанные файлы
- `roles/deploy.yml` - playbook с ролями
- `inventory/hosts.ini` - статический инвентори
- `vault/.vault` - пароль для vault
- `requirements.yml` - зависимости Ansible
- `Makefile` - команды для запуска тестов

View File

@@ -1,424 +0,0 @@
# Мониторинг и диагностика AnsibleLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🔍 Диагностика Docker
### Проверка состояния Docker
```bash
# Проверка статуса Docker
docker info
# Проверка запущенных контейнеров
docker ps -a
# Проверка образов AnsibleLab
docker images | grep inecs/ansible-lab
# Проверка сетей
docker network ls | grep labnet
```
### Диагностика buildx проблем
```bash
# Полная диагностика buildx
make docker diagnose
# Проверка builder'а
make docker check-builder
# Сброс builder'а при проблемах
make docker reset-builder
# Настройка builder'а
make docker setup-builder
```
### Логи Docker
```bash
# Логи Docker daemon (Linux)
sudo journalctl -u docker.service -f
# Логи Docker (macOS)
tail -f ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
# Логи конкретного контейнера
docker logs ansible-controller
# Логи с временными метками
docker logs -t ansible-controller
# Следить за логами в реальном времени
docker logs -f ansible-controller
# Последние 100 строк логов
docker logs --tail 100 ansible-controller
```
## 🧪 Диагностика тестирования
### Проверка preset'ов
```bash
# Список доступных preset'ов
make presets list
# Информация о конкретном preset'е
make presets info PRESET=default
# Проверка файлов preset'ов
ls -la molecule/presets/
# Проверка всех preset'ов
find molecule/presets -name "*.yml" -exec echo "=== {} ===" \; -exec cat {} \;
```
### Проверка инвентори
```bash
# Проверка продакшн инвентори
cat inventory/hosts.ini
# Тестирование подключения
ansible all -i inventory/hosts.ini -m ping
# Проверка доступности хостов
ansible all -i inventory/hosts.ini -m shell -a "uname -a"
```
### Логи тестирования
```bash
# Проверка созданных контейнеров
docker ps -a --filter "network=labnet"
# Логи всех контейнеров Molecule
docker ps -a --filter "network=labnet" --format "{{.Names}}" | while read name; do
echo "=== $name ==="
docker logs $name 2>&1 | tail -20
done
# Очистка контейнеров Molecule
make clean-containers
```
## 📊 Мониторинг ресурсов
### Мониторинг Docker
```bash
# Статистика использования ресурсов контейнерами
docker stats --no-stream
# Использование диска Docker
docker system df
# Детальная информация о диске
docker system df -v
# Очистка неиспользуемых ресурсов
docker system prune -a
```
### Мониторинг системы
```bash
# Использование диска
df -h
# Использование памяти
free -h # Linux
vm_stat # macOS
# Процессы Docker
ps aux | grep docker
# CPU и память в реальном времени
top
# или
htop
```
### Мониторинг сети
```bash
# Инспекция сети labnet
docker network inspect labnet
# Статистика сети
docker network inspect labnet --format '{{json .Containers}}' | jq
# Просмотр портов
netstat -tulpn | grep docker
# Просмотр установленных соединений
ss -tulpn | grep docker
```
## 🔧 Диагностика ролей
### Проверка синтаксиса
```bash
# Lint проверка всех ролей
make role lint
# Lint проверка конкретной роли
make role lint docker
make role lint devops
make role lint ping
# Проверка синтаксиса файлов роли
ansible-playbook --syntax-check roles/docker/tasks/main.yml
```
### Проверка переменных
```bash
# Просмотр всех переменных для хоста
ansible-inventory --list -i inventory/hosts.ini
# Проверка переменных конкретного хоста
ansible-inventory --host web1.example.com -i inventory/hosts.ini
# Просмотр всех групп
ansible-inventory --list | jq 'keys'
```
### Тестирование ролей
```bash
# Тестирование с подробным выводом
make role test 2>&1 | tee test-output.log
# Тестирование конкретной роли
make role test docker
# Тестирование с minimal preset
make role test minimal
# Просмотр результатов теста
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
```
## 🚨 Решение проблем
### Проблемы с Docker
#### Docker не запускается
```bash
# Проверка статуса (Linux)
sudo systemctl status docker
# Запуск Docker (Linux)
sudo systemctl start docker
# Проверка логов (Linux)
sudo journalctl -u docker.service -f
# Перезапуск Docker Desktop (macOS/Windows)
# Use Docker Desktop interface
```
#### Buildx зависает
```bash
# Диагностика
make docker diagnose
# Сброс builder'а
make docker reset-builder
# Очистка контейнеров buildkit
docker ps -a --filter "name=buildx_buildkit" --format "{{.Names}}" | xargs -r docker rm -f
```
#### Образы не собираются
```bash
# Очистка builder'а
make docker clean-builder
# Пересоздание builder'а
make docker setup-builder
# Полная пересборка
make docker rebuild
```
### Проблемы с тестированием
#### Preset'ы не работают
```bash
# Проверка preset файлов
ls -la molecule/presets/
# Проверка синтаксиса preset'а
yamllint molecule/presets/default.yml
# Информация о preset'е
make presets info PRESET=default
```
#### Контейнеры не запускаются
```bash
# Проверка созданных контейнеров
docker ps -a --filter "network=labnet"
# Логи контейнера
docker logs <container-name>
# Перезапуск контейнера
docker restart <container-name>
# Удаление всех контейнеров Molecule
make clean-containers
```
#### Роли не выполняются
```bash
# Проверка синтаксиса
make role lint
# Тест с verbose выводом
ansible-playbook -i inventory/hosts.ini site.yml -vvv
# Проверка переменных
ansible-inventory --list -i inventory/hosts.ini
# Dry-run без выполнения
ansible-playbook -i inventory/hosts.ini site.yml --check
```
### Проблемы с ролями
#### Синтаксические ошибки
```bash
# Lint проверка
make role lint
# Проверка конкретной роли
ansible-lint roles/docker/
# Проверка YAML синтаксиса
yamllint roles/docker/tasks/main.yml
```
#### Логика не работает
```bash
# Проверка переменных
ansible-playbook -i inventory/hosts.ini site.yml --list-tags
ansible-playbook -i inventory/hosts.ini site.yml --list-tasks
# Выполнение конкретной задачи
ansible-playbook -i inventory/hosts.ini site.yml --tags docker
# Debug режим
ansible-playbook -i inventory/hosts.ini site.yml -vvv
```
## 📈 Сбор диагностической информации
### Скрипт диагностики
```bash
#!/bin/bash
# Создание отчета для диагностики
echo "🔍 Сбор диагностической информации..."
# Создание директории для логов
mkdir -p debug-logs
# Docker информация
docker info > debug-logs/docker-info.txt 2>&1
docker images > debug-logs/docker-images.txt 2>&1
docker ps -a > debug-logs/docker-containers.txt 2>&1
docker network ls > debug-logs/docker-networks.txt 2>&1
# Системная информация
df -h > debug-logs/disk-usage.txt 2>&1
free -h > debug-logs/memory-usage.txt 2>&1 2>/dev/null || vm_stat > debug-logs/memory-usage.txt 2>&1
ps aux | grep docker > debug-logs/docker-processes.txt 2>&1
# Информация о проекте
ls -la roles/ > debug-logs/roles-list.txt 2>&1
ls -la molecule/presets/ > debug-logs/presets-list.txt 2>&1
cat inventory/hosts.ini > debug-logs/inventory.txt 2>&1
# Создание архива
tar -czf debug-logs-$(date +%Y%m%d-%H%M%S).tar.gz debug-logs/
echo "✅ Диагностическая информация собрана в: debug-logs-$(date +%Y%m%d-%H%M%S).tar.gz"
```
### Команды для быстрой диагностики
```bash
# Быстрая проверка состояния
echo "=== Docker Status ===" && docker info | head -5
echo "=== AnsibleLab Images ===" && docker images | grep inecs/ansible-lab
echo "=== Roles ===" && ls -1 roles/ | grep -v "\.yml"
echo "=== Presets ===" && ls -1 molecule/presets/*.yml 2>/dev/null | wc -l
echo "=== Disk Usage ===" && df -h . | tail -1
```
## 🔧 Полезные команды
### Очистка
```bash
# Очистка контейнеров Molecule
make clean-containers
# Очистка Docker образов AnsibleLab
make docker clean
# Очистка всего Docker
make docker purge
# Очистка buildx
make docker clean-builder
```
### Проверка
```bash
# Проверка наличия образов
make custom-images check
# Проверка builder'а
make docker check-builder
# Информация об образах
make docker info
```
### Тестирование
```bash
# Быстрый тест
make role test minimal
# Полный тест
make role test all-images
# Тест с конкретным preset'ом
make role test docker-full
```
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,148 +0,0 @@
# Поддержка платформ в пресетах
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## Описание
AnsibleLab поддерживает указание конкретных платформ для хостов в пресетах. Это позволяет автоматически фильтровать хосты, которые не поддерживаются на текущей архитектуре системы.
## Обязательные требования
**Для Astra Linux и RedOS** во всех пресетах **обязательно** должно быть указано `supported_platforms: ["linux/amd64"]`, так как эти системы не поддерживают arm64 архитектуру. Без этого указания могут возникать ошибки при запуске на ARM-системах.
## Как это работает
### Определение платформы
Система автоматически определяет архитектуру хоста при запуске:
- `x86_64``linux/amd64`
- `aarch64` / `arm64``linux/arm64`
- `armv7l``linux/arm/v7`
### Синтаксис в пресетах
В файлах пресетов (molecule/presets/*.yml) можно указать поле `supported_platforms` для каждого хоста:
```yaml
hosts:
- name: ubuntu-test
family: ubuntu
groups: [test]
# Без supported_platforms - работает на всех платформах
publish:
- "8080:80"
- name: astra-test
family: astra
groups: [test]
supported_platforms: ["linux/amd64"] # Только amd64
publish:
- "8083:80"
- name: multi-test
family: ubuntu
groups: [test]
supported_platforms: ["linux/amd64", "linux/arm64"] # Несколько платформ
publish:
- "8084:80"
```
### Правила фильтрации
1. **Если `supported_platforms` не указано** - хост будет запущен на всех платформах
2. **Если `supported_platforms: ["linux/amd64"]`** - хост запустится только на amd64
3. **Если `supported_platforms: ["linux/amd64", "linux/arm64"]`** - хост запустится на обеих платформах
### Примеры использования
#### Универсальный хост (работает везде)
```yaml
- name: universal-test
family: ubuntu
groups: [test]
# supported_platforms не указано = работает на всех платформах
```
#### Только для amd64
```yaml
- name: amd64-only-test
family: astra
groups: [test]
supported_platforms: ["linux/amd64"]
```
#### Для нескольких платформ
```yaml
- name: multi-platform-test
family: debian
groups: [test]
supported_platforms: ["linux/amd64", "linux/arm64"]
```
## Реализация
Фильтрация происходит в файле `molecule/default/create.yml`:
1. Система определяет текущую платформу
2. Загружается пресет
3. Хосты фильтруются по `supported_platforms`
4. Отображается количество хостов для текущей платформы
```yaml
# Фильтрация хостов по поддерживаемым платформам
- name: Filter hosts by supported platforms
set_fact:
filtered_hosts: "{{ filtered_hosts | default([]) + [item] }}"
loop: "{{ hosts }}"
when: |
item.supported_platforms is not defined or
ansible_architecture in item.supported_platforms
```
## Текущее состояние
### Хосты с ограничениями по платформе
- **Astra Linux** - только `linux/amd64` (нет нативной поддержки arm64)
- Во всех пресетах имеет `supported_platforms: ["linux/amd64"]`
- Базовый образ `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2` доступен только для amd64
- **RedOS** - только `linux/amd64` (нет нативной поддержки arm64)
- Во всех пресетах имеет `supported_platforms: ["linux/amd64"]`
- Базовый образ `registry.red-soft.ru/ubi7/ubi` доступен только для amd64
**Важно:** При запуске на arm64 системе эти хосты будут автоматически исключены из списка, что предотвратит ошибки при сборке и запуске контейнеров.
### Универсальные хосты
Следующие системы работают на всех платформах:
- Ubuntu 20.04, 22.04, 24.04
- Debian 9, 10, 11, 12
- Alt Linux
- CentOS 7, 8, 9
- RHEL
- AlmaLinux
- Rocky Linux
## Примеры запуска
### На amd64 (все 9 хостов)
```bash
make role test all-images
# Platform linux/amd64: 9 hosts will be deployed
```
### На arm64 (7 хостов, без Astra и RedOS)
```bash
make role test all-images
# Platform linux/arm64: 7 hosts will be deployed
```
## Дополнительная информация
- Все образы загружаются с принудительным указанием платформы
- Система автоматически адаптирует количество контейнеров под текущую платформу
- Информация о количестве хостов отображается при запуске

View File

@@ -1,183 +0,0 @@
# Пресеты по операционным системам
Этот документ описывает специализированные пресеты для тестирования на конкретных версиях операционных систем.
## 🐧 Ubuntu пресеты
### ubuntu-all.yml
**Описание:** Пресет со всеми версиями Ubuntu (20.04, 22.04, 24.04)
**Хосты:** 6 хостов (по 2 на каждую версию)
**Порты:** 8020-8025
**Использование:**
```bash
make role test ubuntu-all
```
### ubuntu20.yml
**Описание:** Пресет для Ubuntu 20.04 LTS
**Хосты:** 3 хоста (web, db, app)
**Порты:** 8020-8022
**Использование:**
```bash
make role test ubuntu20
```
### ubuntu22.yml
**Описание:** Пресет для Ubuntu 22.04 LTS
**Хосты:** 3 хоста (web, db, app)
**Порты:** 8220-8222
**Использование:**
```bash
make role test ubuntu22
```
### ubuntu24.yml
**Описание:** Пресет для Ubuntu 24.04 LTS
**Хосты:** 3 хоста (web, db, app)
**Порты:** 8240-8242
**Использование:**
```bash
make role test ubuntu24
```
## 🐧 Debian пресеты
### debian-all.yml
**Описание:** Пресет со всеми версиями Debian (9, 10, 11, 12)
**Хосты:** 8 хостов (по 2 на каждую версию)
**Порты:** 9009-9016
**Использование:**
```bash
make role test debian-all
```
### debian9.yml
**Описание:** Пресет для Debian 9 Stretch
**Хосты:** 3 хоста (web, db, app)
**Порты:** 9090-9092
**Использование:**
```bash
make role test debian9
```
### debian10.yml
**Описание:** Пресет для Debian 10 Buster
**Хосты:** 3 хоста (web, db, app)
**Порты:** 9100-9102
**Использование:**
```bash
make role test debian10
```
### debian11.yml
**Описание:** Пресет для Debian 11 Bullseye
**Хосты:** 3 хоста (web, db, app)
**Порты:** 9110-9112
**Использование:**
```bash
make role test debian11
```
### debian12.yml
**Описание:** Пресет для Debian 12 Bookworm
**Хосты:** 3 хоста (web, db, app)
**Порты:** 9120-9122
**Использование:**
```bash
make role test debian12
```
## 🐧 CentOS пресеты
### centos-all.yml
**Описание:** Пресет со всеми версиями CentOS (7, 8, 9)
**Хосты:** 6 хостов (по 2 на каждую версию)
**Порты:** 7007-7012
**Использование:**
```bash
make role test centos-all
```
### centos7.yml
**Описание:** Пресет для CentOS 7
**Хосты:** 3 хоста (web, db, app)
**Порты:** 7070-7072
**Использование:**
```bash
make role test centos7
```
### centos8.yml
**Описание:** Пресет для CentOS 8
**Хосты:** 3 хоста (web, db, app)
**Порты:** 7080-7082
**Использование:**
```bash
make role test centos8
```
### centos9.yml
**Описание:** Пресет для CentOS 9 Stream
**Хосты:** 3 хоста (web, db, app)
**Порты:** 7090-7092
**Использование:**
```bash
make role test centos9
```
## 📊 Сравнение пресетов
| Пресет | ОС | Версии | Хостов | Порты | Назначение |
|--------|----|---------|---------|--------|------------|
| ubuntu-all | Ubuntu | 20.04, 22.04, 24.04 | 6 | 8020-8025 | Тестирование всех версий Ubuntu |
| debian-all | Debian | 9, 10, 11, 12 | 8 | 9009-9016 | Тестирование всех версий Debian |
| centos-all | CentOS | 7, 8, 9 | 6 | 7007-7012 | Тестирование всех версий CentOS |
| ubuntu20 | Ubuntu | 20.04 | 3 | 8020-8022 | Тестирование Ubuntu 20.04 |
| ubuntu22 | Ubuntu | 22.04 | 3 | 8220-8222 | Тестирование Ubuntu 22.04 |
| ubuntu24 | Ubuntu | 24.04 | 3 | 8240-8242 | Тестирование Ubuntu 24.04 |
| debian9 | Debian | 9 | 3 | 9090-9092 | Тестирование Debian 9 |
| debian10 | Debian | 10 | 3 | 9100-9102 | Тестирование Debian 10 |
| debian11 | Debian | 11 | 3 | 9110-9112 | Тестирование Debian 11 |
| debian12 | Debian | 12 | 3 | 9120-9122 | Тестирование Debian 12 |
| centos7 | CentOS | 7 | 3 | 7070-7072 | Тестирование CentOS 7 |
| centos8 | CentOS | 8 | 3 | 7080-7082 | Тестирование CentOS 8 |
| centos9 | CentOS | 9 | 3 | 7090-7092 | Тестирование CentOS 9 |
## 🎯 Рекомендации по использованию
### Для разработки:
- Используйте `ubuntu22` или `debian12` для быстрого тестирования
- Используйте `ubuntu-all` для проверки совместимости с разными версиями Ubuntu
### Для продакшена:
- Используйте `centos-all` для проверки RHEL-совместимых систем
- Используйте `debian-all` для проверки Debian-совместимых систем
### Для CI/CD:
- Используйте отдельные пресеты для изолированного тестирования
- Используйте `*-all` пресеты для комплексной проверки совместимости
## 🔧 Настройка портов
Все пресеты используют уникальные диапазоны портов:
### Ubuntu пресеты:
- **ubuntu-all:** 8020-8025 (все версии)
- **ubuntu20:** 8020-8022
- **ubuntu22:** 8220-8222
- **ubuntu24:** 8240-8242
### Debian пресеты:
- **debian-all:** 9009-9016 (все версии)
- **debian9:** 9090-9092
- **debian10:** 9100-9102
- **debian11:** 9110-9112
- **debian12:** 9120-9122
### CentOS пресеты:
- **centos-all:** 7007-7012 (все версии)
- **centos7:** 7070-7072
- **centos8:** 7080-7082
- **centos9:** 7090-7092
Это позволяет запускать несколько пресетов одновременно без конфликтов портов.

196
docs/presets.md Normal file
View File

@@ -0,0 +1,196 @@
# Пресеты универсальной лаборатории
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Описание
Этот каталог содержит готовые пресеты для различных сценариев тестирования Ansible ролей. Каждый пресет оптимизирован для определенного типа инфраструктуры и количества машин.
## Доступные пресеты
### 🏗️ Классические пресеты (systemd контейнеры)
#### 1. Минимальная лаборатория (1-3 машины)
**Файл:** `minimal.yml`
**Описание:** Базовая конфигурация для простых тестов Ansible ролей
**Компоненты:** 1 контроллер, 1 веб-сервер, 1 база данных
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/minimal.yml`
### 2. Веб-приложение (3-5 машин)
**Файл:** `webapp.yml`
**Описание:** Классическая архитектура веб-приложения
**Компоненты:** 2 веб-сервера, 1 БД, 1 кэш, 1 балансировщик
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/webapp.yml`
### 3. Микросервисы (5-8 машин)
**Файл:** `microservices.yml`
**Описание:** Архитектура микросервисов с разделением ответственности
**Компоненты:** API Gateway, микросервисы, БД, кэш, очередь, мониторинг
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/microservices.yml`
### 4. Высокая доступность (6-10 машин)
**Файл:** `ha.yml`
**Описание:** Кластер высокой доступности с репликацией
**Компоненты:** 2 веб-сервера, 2 БД, 2 кэша, балансировщик, мониторинг
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/ha.yml`
### 5. Kubernetes кластер (8-12 машин)
**Файл:** `k8s-cluster.yml`
**Описание:** Полноценный Kubernetes кластер с различными ролями
**Компоненты:** 3 master, 3 worker, 3 etcd, ingress, мониторинг
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-cluster.yml`
### 6. CI/CD пайплайн (10-15 машин)
**Файл:** `cicd.yml`
**Описание:** Полноценный CI/CD пайплайн с различными инструментами
**Компоненты:** Git, Jenkins, Nexus, Docker Registry, среды, мониторинг, ELK
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/cicd.yml`
### 7. Big Data кластер (12-18 машин)
**Файл:** `bigdata.yml`
**Описание:** Кластер для обработки больших данных
**Компоненты:** Hadoop, Spark, Kafka, Zookeeper, Elasticsearch, Kibana
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/bigdata.yml`
### 8. Service Mesh (15-20 машин)
**Файл:** `servicemesh.yml`
**Описание:** Полноценный service mesh с Istio и множественными сервисами
**Компоненты:** Istio, Frontend, Backend, БД, кэш, мониторинг, трассировка
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/servicemesh.yml`
### 9. Enterprise (18-20 машин)
**Файл:** `enterprise.yml`
**Описание:** Полноценная enterprise инфраструктура с высокой доступностью
**Компоненты:** LB, Web, API Gateway, App, БД, кэш, очереди, поиск, мониторинг, логи, backup
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/enterprise.yml`
### 10. Максимальный (20 машин)
**Файл:** `maximum.yml`
**Описание:** Максимально сложная инфраструктура для экстремальных условий
**Компоненты:** Все компоненты enterprise + трассировка + визуализация
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/maximum.yml`
### ☸️ Kubernetes пресеты
#### 11. Kubernetes Single Node (1 кластер)
**Файл:** `k8s-single.yml`
**Описание:** Одиночный Kind кластер для простого тестирования K8s ролей
**Компоненты:** 1 Kind кластер с 1 worker, базовые аддоны
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-single.yml`
#### 12. Kubernetes Multi-Cluster (3 кластера)
**Файл:** `k8s-multi.yml`
**Описание:** Несколько Kind кластеров для тестирования мульти-кластерных сценариев
**Компоненты:** 3 кластера (dev, staging, prod) с различными конфигурациями
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-multi.yml`
#### 13. Kubernetes + Istio Full Stack (1 кластер с полным стеком)
**Файл:** `k8s-istio-full.yml`
**Описание:** Полноценный Kubernetes кластер с полным стеком Istio
**Компоненты:** 1 Kind кластер с 3 workers, Istio, Kiali, Prometheus, Grafana, Jaeger
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-istio-full.yml`
### 🐳 Docker-in-Docker (DinD) пресеты
#### 14. DinD Simple (3 DinD контейнера)
**Файл:** `dind-simple.yml`
**Описание:** Простая конфигурация DinD для тестирования Docker ролей
**Компоненты:** 3 DinD контейнера с изолированными Docker средами
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-simple.yml`
#### 15. DinD Swarm (5 DinD контейнеров)
**Файл:** `dind-swarm.yml`
**Описание:** Docker Swarm кластер для тестирования оркестрации
**Компоненты:** 1 Manager + 4 Worker узла в Docker Swarm режиме
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-swarm.yml`
#### 16. DinD Compose (4 DinD контейнера)
**Файл:** `dind-compose.yml`
**Описание:** DinD контейнеры для тестирования Docker Compose стека
**Компоненты:** 4 DinD контейнера с различными стеками
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-compose.yml`
### 🔗 Docker-outside-of-Docker (DOoD) пресеты
#### 17. DOoD Simple (3 DOoD контейнера)
**Файл:** `dood-simple.yml`
**Описание:** Простая конфигурация DOoD для тестирования Docker ролей
**Компоненты:** 3 DOoD контейнера с доступом к Docker daemon хоста
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dood-simple.yml`
#### 18. DOoD Mixed (5 DOoD + 2 systemd)
**Файл:** `dood-mixed.yml`
**Описание:** Смешанная конфигурация DOoD и systemd контейнеров
**Компоненты:** 5 DOoD контейнеров для Docker операций + 2 systemd для системных ролей
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dood-mixed.yml`
### 🔀 Смешанные пресеты
#### 19. Mixed Kubernetes + DinD (1 K8s + 3 DinD)
**Файл:** `mixed-k8s-dind.yml`
**Описание:** Смешанная конфигурация Kubernetes и Docker-in-Docker
**Компоненты:** 1 Kind кластер + 3 DinD контейнера
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-k8s-dind.yml`
#### 20. Mixed Kubernetes + DOoD (1 K8s + 3 DOoD)
**Файл:** `mixed-k8s-dood.yml`
**Описание:** Смешанная конфигурация Kubernetes и Docker-outside-of-Docker
**Компоненты:** 1 Kind кластер + 3 DOoD контейнера
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-k8s-dood.yml`
#### 21. Mixed Full Stack (1 K8s + 2 DinD + 2 DOoD + 2 systemd)
**Файл:** `mixed-full.yml`
**Описание:** Полная смешанная конфигурация для комплексного тестирования
**Компоненты:** 1 Kind кластер + 2 DinD + 2 DOoD + 2 systemd контейнера
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-full.yml`
## Использование
### Быстрый старт
```bash
# Выбрать пресет
export LAB_SPEC=molecule/presets/minimal.yml
# Запустить тестирование
make lab-test
```
### Создание собственного пресета
1. Скопировать существующий пресет: `cp minimal.yml my-preset.yml`
2. Отредактировать под ваши нужды
3. Использовать: `make lab-test LAB_SPEC=molecule/presets/my-preset.yml`
### Переменные окружения
```bash
# Установить пресет по умолчанию
export LAB_SPEC=molecule/presets/webapp.yml
# Или использовать в команде
make lab-test LAB_SPEC=molecule/presets/ha.yml
```
## Рекомендации
- **Для начинающих:** используйте `minimal.yml` или `webapp.yml`
- **Для микросервисов:** `microservices.yml` или `servicemesh.yml`
- **Для Kubernetes:** `k8s-cluster.yml`
- **Для enterprise:** `enterprise.yml` или `maximum.yml`
- **Для Big Data:** `bigdata.yml`
## Кастомизация
Каждый пресет можно настроить под ваши нужды:
- Изменить количество машин
- Добавить/убрать группы
- Изменить семейства ОС (debian/rhel)
- Настроить порты и переменные
## Troubleshooting
Если пресет не работает:
1. Проверьте доступность Docker образов
2. Убедитесь в достаточности ресурсов
3. Проверьте логи: `make lab-verify`
4. Очистите лабораторию: `make lab-cleanup`

372
docs/roles.md Normal file
View File

@@ -0,0 +1,372 @@
# Управление ролями Ansible
Полное руководство по созданию, управлению и использованию ролей в универсальной лаборатории.
## Создание роли
### Интерактивное создание
```bash
make role create NAME=my-role
```
**Что происходит:**
1. **Запрашивается описание роли** - краткое описание функциональности
2. **Настраивается основной пакет** - имя пакета для установки
3. **Настраивается сервис** - имя сервиса для управления
4. **Выбираются платформы** - поддерживаемые ОС (ubuntu, centos, rhel)
5. **Указываются теги** - теги для Ansible Galaxy
6. **Создается универсальная структура роли** с поддержкой RHEL и Debian семейств
7. **Создается папка `playbooks/`** для playbooks роли
### Структура созданной роли
```
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
---
# Задачи для 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
when: ansible_os_family == 'Debian'
```
#### RHEL/CentOS (tasks/redhat.yml)
```yaml
---
# Задачи для 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 роли
### Создание playbook
```bash
make role playbook NAME=my-role
# Выберите: create
# Введите имя: deploy
```
**Создается файл:** `roles/my-role/playbooks/deploy.yml`
```yaml
---
# Playbook: deploy для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: deploy
hosts: all
become: true
gather_facts: true
vars:
# Переменные для роли my-role
my_role_enabled: true
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
make role playbook NAME=my-role
# Выберите: list
```
### Редактирование 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)
### 2. Структура роли
- **`tasks/main.yml`** - общая логика и включение OS-специфичных задач
- **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
- **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
- **`handlers`** - для перезапуска сервисов
- **`templates`** - для конфигурационных файлов
- **`files`** - для статических файлов
### 3. Переменные
- **`defaults/main.yml`** - значения по умолчанию
- **`vars/main.yml`** - внутренние переменные роли
- **Используйте префиксы** для переменных роли
- **Создавайте OS-специфичные переменные** при необходимости
### 4. Playbooks
- **`gather_facts: true`** - всегда собирайте информацию об ОС
- **`pre_tasks`** - отображайте информацию об ОС
- **`post_tasks`** - проверяйте успешное развертывание
- **Используйте переменные** для настройки
### 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
---
- name: Deploy my-role
hosts: all
become: true
roles:
- role: my-role
vars:
my_role_enabled: true
my_role_package: custom-package
```
## Автор
Сергей Антропов
Сайт: https://devops.org.ru

View File

@@ -1,248 +0,0 @@
# Руководство по файлу site.yml
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## 📋 Описание
Файл `molecule/default/site.yml` является **универсальным playbook'ом для тестирования Ansible ролей** в контейнерах. Этот файл отвечает за подготовку окружения и установку необходимых утилит внутри контейнеров при запуске тестов.
## 🎯 Назначение
### Основные функции:
1. **Обновление пакетов** в контейнерах при запуске тестов
2. **Установка common tools** для корректной работы тестов
3. **Подготовка окружения** для тестирования ролей
4. **Импорт roles/deploy.yml** для запуска ролей
## 🏗️ Структура файла
### 1. Подготовка окружения для тестирования
```yaml
- name: Подготовка окружения для тестирования
hosts: all
become: true
tasks:
# Задачи подготовки...
```
**Что делает:**
- Обновляет кеш пакетов для всех поддерживаемых ОС
- Устанавливает необходимые утилиты
- Настраивает пользователя для тестирования
- Создает рабочие директории
### 2. Импорт deploy.yml
```yaml
- import_playbook: ../../roles/deploy.yml
```
**Что делает:**
- Импортирует `roles/deploy.yml` для запуска ролей
- Разделяет логику: `site.yml` - подготовка, `deploy.yml` - роли
- Обеспечивает единую точку управления ролями
## 🐧 Поддерживаемые ОС
### Debian/Ubuntu
- **Менеджер пакетов:** `apt`
- **Обновление:** `apt update`
- **Утилиты:** `curl`, `jq`, `ca-certificates`, `iproute2`, `iputils-ping`, `procps`, `net-tools`, `sudo`, `vim`, `wget`, `unzip`, `git`
### RHEL/CentOS/AlmaLinux/Rocky
- **Менеджер пакетов:** `yum`
- **Обновление:** `yum update_cache`
- **Утилиты:** `curl`, `jq`, `ca-certificates`, `iproute`, `iputils`, `procps-ng`, `net-tools`, `sudo`, `vim`, `wget`, `unzip`, `git`
### Alt Linux
- **Менеджер пакетов:** `apt` (специальная версия)
- **Обновление:** `apt update`
- **Утилиты:** `curl`, `jq`, `ca-certificates`, `iproute2`, `iputils`, `procps`, `net-tools`, `sudo`, `vim`, `wget`, `unzip`, `git`
## 🏷️ Теги (Tags)
### setup
- Обновление пакетов
- Установка утилит
- Настройка пользователей
- Создание директорий
### update
- Обновление кеша пакетов
- Обновление списка пакетов
### tools
- Установка common tools
- Установка системных утилит
### python
- Установка Python 3
- Установка pip
- Установка venv
### user
- Создание тестового пользователя
- Настройка домашней директории
### sudo
- Настройка sudo для тестового пользователя
- Конфигурация прав доступа
### directory
- Создание рабочих директорий
- Настройка прав доступа
### roles
- Запуск тестирования ролей
- Выполнение функциональных тестов
### test
- Тестирование функциональности
- Проверка работоспособности
## 🚀 Использование
### Запуск полного тестирования
```bash
make role test
```
### Запуск только подготовки окружения
```bash
make role test --tags setup
```
### Запуск только обновления пакетов
```bash
make role test --tags update
```
### Запуск только установки утилит
```bash
make role test --tags tools
```
### Запуск только тестирования ролей
```bash
make role test --tags roles
```
## 🔧 Настройка
### Переменные окружения
```bash
# Настройка тестового пользователя
export TEST_USER=testuser
# Настройка рабочей директории
export TEST_DIR=/tmp/ansible-test
# Настройка прав доступа
export TEST_MODE=0755
```
### Кастомизация утилит
Для добавления дополнительных утилит отредактируйте соответствующие секции:
```yaml
# Для Debian/Ubuntu
- name: Install common tools (Debian/Ubuntu)
apt:
name:
- curl
- jq
- your-custom-tool # Добавьте сюда
state: present
```
## 🐛 Troubleshooting
### Проблема: Ошибка обновления пакетов
**Решение:** Проверьте доступность репозиториев и интернет-соединение
### Проблема: Не удается установить утилиты
**Решение:** Проверьте названия пакетов для конкретной ОС
### Проблема: Ошибка создания пользователя
**Решение:** Проверьте права доступа и существование пользователя
### Проблема: Ошибка настройки sudo
**Решение:** Проверьте синтаксис файла sudoers
## 📊 Мониторинг
### Логи выполнения
```bash
# Просмотр логов тестирования
make role test 2>&1 | tee test.log
# Фильтрация по тегам
grep "TASK \[.*\]" test.log
```
### Проверка установленных утилит
```bash
# В контейнере
which curl jq vim git
```
### Проверка пользователя
```bash
# В контейнере
id testuser
sudo -l -U testuser
```
## 🔄 Автоматическое обновление
Файл `site.yml` автоматически обновляется при добавлении новых ролей:
```bash
# Автоматическое обновление
make update-playbooks
```
**Что происходит:**
1. Обнаруживаются все роли в директории `roles/`
2. Обновляется секция "Тестирование всех ролей"
3. Добавляются новые роли в список
## 📝 Примеры использования
### Тестирование конкретной роли
```bash
# Тестирование только роли ping
make role test minimal ping
```
### Тестирование с конкретным preset'ом
```bash
# Тестирование с preset'ом performance
make role test performance
```
### Отладка проблем
```bash
# Запуск с подробным выводом
make role test --verbose
```
## 🎯 Лучшие практики
1. **Всегда используйте теги** для разделения задач
2. **Проверяйте совместимость** утилит с ОС
3. **Тестируйте на разных образах** перед коммитом
4. **Используйте idempotent задачи** для стабильности
5. **Документируйте изменения** в комментариях
## 🔗 Связанные файлы
- `molecule/default/molecule.yml` - конфигурация Molecule
- `roles/deploy.yml` - playbook для продакшн развертывания
- `inventory/hosts.ini` - инвентори для тестирования
- `Makefile` - команды для запуска тестов

View File

@@ -1,99 +0,0 @@
# Тестирование vs Развертывание
## Автор: Сергей Антропов
## Сайт: https://devops.org.ru
## Различие между тестированием и развертыванием
### 🧪 Тестирование (molecule)
**Команда:** `make role test [preset]`
**Использует:**
- Динамический inventory, создаваемый в `molecule/default/create.yml`
- Preset файлы из `molecule/presets/`
- Docker контейнеры для изоляции тестов
- Временные контейнеры (u1, u2, u3)
**Процесс:**
1. Загружается preset конфигурация
2. Создаются Docker контейнеры согласно preset
3. Генерируется временный inventory файл
4. Запускаются тесты на контейнерах
5. Контейнеры удаляются после тестов
**Пример:**
```bash
make role test standart # Тестирование в 3 контейнерах
make role test minimal # Тестирование в 1 контейнере
```
### 🚀 Развертывание (deploy)
**Команда:** `make role deploy`
**Использует:**
- Статический inventory файл `inventory/hosts.ini`
- Реальные серверы
- SSH подключение
**Процесс:**
1. Проверяется наличие `inventory/hosts.ini`
2. Показывается содержимое inventory
3. Запускается dry-run (--check)
4. Запрашивается подтверждение
5. Выполняется развертывание на реальные серверы
**Пример:**
```bash
make role deploy # Развертывание на реальные серверы
```
## Конфигурация
### Для тестирования
- Preset файлы: `molecule/presets/*.yml`
- Динамический inventory создается в `create.yml`
- Контейнеры: Docker
### Для развертывания
- Inventory файл: `inventory/hosts.ini`
- Серверы: Реальные хосты
- Подключение: SSH
## Примеры конфигурации
### Preset для тестирования (molecule/presets/standart.yml)
```yaml
hosts:
- name: u1
family: debian
groups: [test]
- name: u2
family: rhel
groups: [test]
- name: u3
family: debian
groups: [test]
```
### Inventory для развертывания (inventory/hosts.ini)
```ini
[web_servers]
web1 ansible_host=192.168.1.10 ansible_user=ubuntu
web2 ansible_host=192.168.1.11 ansible_user=ubuntu
[db_servers]
db1 ansible_host=192.168.1.20 ansible_user=ubuntu
[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
```
## Рекомендации
1. **Сначала тестируйте** с помощью `make role test [preset]`
2. **Затем развертывайте** с помощью `make role deploy`
3. **Используйте разные preset'ы** для разных сценариев тестирования
4. **Настройте inventory** для ваших реальных серверов

652
docs/troubleshooting.md Normal file
View File

@@ -0,0 +1,652 @@
# Troubleshooting
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Описание
Этот документ содержит решения наиболее распространенных проблем при работе с универсальной лабораторией.
## Содержание
- [Общие проблемы](#общие-проблемы)
- [Проблемы с Docker](#проблемы-с-docker)
- [Проблемы с Kubernetes](#проблемы-с-kubernetes)
- [Проблемы с портами](#проблемы-с-портами)
- [Проблемы с ресурсами](#проблемы-с-ресурсами)
- [Проблемы с сетью](#проблемы-с-сетью)
- [Проблемы с Ansible](#проблемы-с-ansible)
- [Проблемы с Molecule](#проблемы-с-molecule)
- [Проблемы с пресетами](#проблемы-с-пресетами)
- [Проблемы с отчетами](#проблемы-с-отчетами)
## Общие проблемы
### Проблема: Лаборатория не запускается
**Симптомы:**
- Команда `make lab-up` завершается с ошибкой
- Контейнеры не создаются
- Ошибки в логах Docker
**Решение:**
```bash
# Проверить статус Docker
docker ps
docker version
# Перезапустить Docker
sudo systemctl restart docker
# Очистить Docker
docker system prune -a
# Перезапустить лабораторию
make lab-reset
```
### Проблема: Команды Make не работают
**Симптомы:**
- `make: command not found`
- Ошибки в Makefile
**Решение:**
```bash
# Установить Make
# Ubuntu/Debian
sudo apt-get install make
# CentOS/RHEL
sudo yum install make
# macOS
brew install make
# Проверить версию
make --version
```
### Проблема: Недостаточно прав
**Симптомы:**
- `Permission denied`
- Ошибки доступа к файлам
**Решение:**
```bash
# Проверить права на файлы
ls -la
# Установить права
chmod +x scripts/*.sh
chmod 644 *.yml
# Добавить пользователя в группу docker
sudo usermod -aG docker $USER
newgrp docker
```
## Проблемы с Docker
### Проблема: Docker daemon не запущен
**Симптомы:**
- `Cannot connect to the Docker daemon`
- `docker: command not found`
**Решение:**
```bash
# Запустить Docker daemon
sudo systemctl start docker
sudo systemctl enable docker
# Проверить статус
sudo systemctl status docker
# Проверить доступ
docker ps
```
### Проблема: Недостаточно места на диске
**Симптомы:**
- `No space left on device`
- Ошибки создания контейнеров
**Решение:**
```bash
# Проверить использование диска
df -h
# Очистить Docker
docker system prune -a
docker volume prune
docker network prune
# Удалить неиспользуемые образы
docker image prune -a
```
### Проблема: Конфликты портов
**Симптомы:**
- `Port is already in use`
- Ошибки привязки портов
**Решение:**
```bash
# Найти процесс, использующий порт
sudo netstat -tulpn | grep :8080
sudo lsof -i :8080
# Убить процесс
sudo kill -9 <PID>
# Или изменить порт в пресете
publish:
- "8081:80" # Вместо 8080:80
```
### Проблема: DinD контейнеры не работают
**Симптомы:**
- DinD контейнеры не запускаются
- Ошибки Docker-in-Docker
**Решение:**
```bash
# Проверить privileged режим
docker run --privileged -d docker:dind
# Проверить доступ к Docker socket
docker run -v /var/run/docker.sock:/var/run/docker.sock docker:latest ps
# Перезапустить с правильными параметрами
make lab-reset
make lab-create
```
## Проблемы с Kubernetes
### Проблема: Kind кластер не создается
**Симптомы:**
- `kind create cluster` завершается с ошибкой
- Кластер не доступен
**Решение:**
```bash
# Проверить Kind
kind version
# Удалить существующие кластеры
kind delete cluster --name lab
# Очистить Docker
docker system prune -a
# Пересоздать кластер
make lab-create
```
### Проблема: kubectl не работает
**Симптомы:**
- `kubectl: command not found`
- Ошибки подключения к кластеру
**Решение:**
```bash
# Установить kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# Проверить конфигурацию
kubectl config get-contexts
# Переключиться на правильный контекст
kubectl config use-context kind-lab
```
### Проблема: Pods не запускаются
**Симптомы:**
- Pods в состоянии Pending
- Ошибки в логах pods
**Решение:**
```bash
# Проверить статус pods
kubectl get pods -A
kubectl describe pod <pod-name>
# Проверить события
kubectl get events --sort-by=.metadata.creationTimestamp
# Проверить ресурсы
kubectl top nodes
kubectl top pods
```
### Проблема: Istio не устанавливается
**Симптомы:**
- Istio компоненты не запускаются
- Ошибки в Istio логах
**Решение:**
```bash
# Проверить Istio
istioctl version
# Переустановить Istio
istioctl uninstall --purge
istioctl install --set profile=demo
# Проверить статус
kubectl get pods -n istio-system
```
## Проблемы с портами
### Проблема: Порт уже используется
**Симптомы:**
- `bind: address already in use`
- Ошибки привязки портов
**Решение:**
```bash
# Найти процесс
sudo lsof -i :8080
# Убить процесс
sudo kill -9 <PID>
# Или изменить порт в пресете
publish:
- "8081:80"
```
### Проблема: Port-forward не работает
**Симптомы:**
- Port-forward не устанавливается
- Ошибки подключения
**Решение:**
```bash
# Остановить все port-forward
make kube-pf-stop
# Проверить доступность сервиса
kubectl get svc -n istio-system
# Перезапустить port-forward
make kiali-port-forward CLUSTER=lab
```
## Проблемы с ресурсами
### Проблема: Недостаточно памяти
**Симптомы:**
- `Out of memory`
- Контейнеры завершаются
**Решение:**
```bash
# Проверить память
free -h
docker stats
# Ограничить ресурсы
docker run --memory=512m your-image
# Или уменьшить количество контейнеров в пресете
```
### Проблема: Недостаточно CPU
**Симптомы:**
- Медленная работа
- Высокая нагрузка на CPU
**Решение:**
```bash
# Проверить CPU
top
htop
# Ограничить CPU
docker run --cpus=1.0 your-image
# Или использовать более легкие образы
```
### Проблема: Недостаточно места на диске
**Симптомы:**
- `No space left on device`
- Ошибки записи
**Решение:**
```bash
# Проверить место
df -h
# Очистить Docker
docker system prune -a
docker volume prune
# Удалить неиспользуемые образы
docker image prune -a
```
## Проблемы с сетью
### Проблема: Контейнеры не могут связаться
**Симптомы:**
- Ping не работает между контейнерами
- Ошибки сети
**Решение:**
```bash
# Проверить сеть
docker network ls
docker network inspect labnet
# Пересоздать сеть
docker network rm labnet
docker network create labnet
# Перезапустить лабораторию
make lab-reset
```
### Проблема: DNS не работает
**Симптомы:**
- Не удается разрешить имена
- Ошибки DNS
**Решение:**
```bash
# Проверить DNS
nslookup google.com
# Перезапустить Docker
sudo systemctl restart docker
# Проверить resolv.conf
cat /etc/resolv.conf
```
## Проблемы с Ansible
### Проблема: Ansible не найден
**Симптомы:**
- `ansible: command not found`
- Ошибки выполнения playbook
**Решение:**
```bash
# Установить Ansible
pip install ansible
# Или через пакетный менеджер
sudo apt-get install ansible
# Проверить версию
ansible --version
```
### Проблема: Ошибки в playbook
**Симптомы:**
- Синтаксические ошибки
- Ошибки выполнения задач
**Решение:**
```bash
# Проверить синтаксис
ansible-playbook --syntax-check playbook.yml
# Запустить в режиме отладки
ansible-playbook -vvv playbook.yml
# Проверить инвентарь
ansible-inventory --list
```
### Проблема: Ошибки подключения
**Симптомы:**
- `Connection refused`
- Ошибки SSH
**Решение:**
```bash
# Проверить подключение
ansible all -m ping
# Проверить SSH ключи
ssh-keygen -t rsa -b 4096
ssh-copy-id user@host
# Или использовать пароль
ansible all -m ping -k
```
## Проблемы с Molecule
### Проблема: Molecule не найден
**Симптомы:**
- `molecule: command not found`
- Ошибки выполнения molecule
**Решение:**
```bash
# Установить Molecule
pip install molecule
# Или через пакетный менеджер
sudo apt-get install molecule
# Проверить версию
molecule --version
```
### Проблема: Ошибки в molecule.yml
**Симптомы:**
- Синтаксические ошибки в конфигурации
- Ошибки валидации
**Решение:**
```bash
# Проверить синтаксис
molecule syntax
# Проверить конфигурацию
molecule lint
# Исправить ошибки
molecule validate
```
### Проблема: Ошибки драйвера
**Симптомы:**
- Ошибки Docker драйвера
- Проблемы с контейнерами
**Решение:**
```bash
# Проверить драйвер
molecule driver list
# Установить Docker драйвер
pip install molecule-docker
# Перезапустить Molecule
molecule destroy
molecule create
```
## Проблемы с пресетами
### Проблема: Пресет не найден
**Симптомы:**
- `File not found`
- Ошибки загрузки пресета
**Решение:**
```bash
# Проверить путь
ls -la molecule/presets/
# Проверить синтаксис YAML
yamllint molecule/presets/your-preset.yml
# Исправить ошибки
molecule validate
```
### Проблема: Ошибки в пресете
**Симптомы:**
- Синтаксические ошибки
- Ошибки валидации
**Решение:**
```bash
# Проверить синтаксис
yamllint molecule/presets/your-preset.yml
# Проверить структуру
molecule validate
# Исправить ошибки
molecule syntax
```
## Проблемы с отчетами
### Проблема: HTML отчет не генерируется
**Симптомы:**
- `File not found`
- Ошибки генерации отчета
**Решение:**
```bash
# Проверить JSON файл
ls -la reports/
cat reports/lab-health.json
# Перезапустить верификацию
make lab-verify
# Сгенерировать отчет
make lab-report
```
### Проблема: Отчет пустой
**Симптомы:**
- Отчет не содержит данных
- Ошибки в JSON
**Решение:**
```bash
# Проверить JSON
jq . reports/lab-health.json
# Перезапустить тест
make lab-test
# Проверить логи
make lab-verify
```
## Полезные команды для диагностики
### Общие команды
```bash
# Проверить статус системы
docker ps
docker images
docker network ls
docker volume ls
# Проверить ресурсы
free -h
df -h
top
# Проверить сеть
netstat -tulpn
ss -tulpn
```
### Команды для Kubernetes
```bash
# Проверить кластеры
kind get clusters
kubectl config get-contexts
# Проверить ресурсы
kubectl get nodes
kubectl get pods -A
kubectl get svc -A
# Проверить события
kubectl get events --sort-by=.metadata.creationTimestamp
```
### Команды для Ansible
```bash
# Проверить инвентарь
ansible-inventory --list
ansible all -m ping
# Проверить playbook
ansible-playbook --syntax-check playbook.yml
ansible-playbook --check playbook.yml
```
## Получение помощи
Если проблема не решается:
1. **Проверьте логи:**
```bash
docker logs <container-name>
kubectl logs <pod-name>
```
2. **Создайте issue:**
- Опишите проблему
- Приложите логи
- Укажите версии компонентов
3. **Обратитесь к сообществу:**
- GitHub Discussions
- Discord/Slack каналы
- Форумы Ansible
4. **Проверьте документацию:**
- [Основная документация](universal-lab.md)
- [Примеры использования](examples.md)
- [API Reference](api.md)

295
docs/universal-lab.md Normal file
View File

@@ -0,0 +1,295 @@
# Универсальная лаборатория для тестирования Ansible ролей
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Описание
Это универсальная лаборатория для тестирования Ansible ролей, созданная на основе предложений ChatGPT. Лаборатория поддерживает:
- **Docker-in-Docker (DinD)** - полная изоляция контейнеров
- **Docker-outside-of-Docker (DOoD)** - использование хостового Docker
- **Kind кластеры** - локальные Kubernetes кластеры
- **Helm charts** - nginx, prometheus-stack
- **Istio service mesh** - с Kiali для мониторинга
- **Prometheus + Grafana** - с автопровижинингом дашбордов
- **HTML отчеты** - красивые отчеты о результатах тестирования
## Структура проекта
```
molecule/
├── universal/ # Универсальная лаборатория
│ ├── molecule.yml # Конфигурация Molecule
│ ├── vars.yml # Переменные лаборатории
│ ├── create.yml # Создание инфраструктуры
│ ├── converge.yml # Запуск ролей
│ ├── verify.yml # Проверка работы
│ └── destroy.yml # Очистка
├── presets/ # Пресеты для разных сценариев
│ └── k8s-kind.yml # Пресет для Kubernetes
└── default/ # Старый сценарий (для совместимости)
files/
├── requirements.yml # Коллекции Ansible
├── playbooks/
│ └── site.yml # Основной playbook
└── k8s/ # Kubernetes манифесты
└── istio/ # Istio конфигурации
roles/ # Ваши Ansible роли
```
## Использование
### 1. Подготовка
```bash
# Создать файл с паролем для vault
echo "test" > vault-password.txt
# Создать каталог для ролей
mkdir -p roles
# Скопировать переменные окружения
cp env.example .env
# Отредактировать .env под ваши нужды
```
### 2. Запуск лаборатории
```bash
# Поднять контроллер
make lab-up
# Создать инфраструктуру
make lab-create
# Запустить роли
make lab-converge
# Проверить работу
make lab-verify
# Сгенерировать HTML отчет
make lab-report
# Уничтожить лабораторию
make lab-destroy
```
### 3. Управление лабораторией
```bash
# Полный цикл тестирования
make lab-test
# Снапшоты и восстановление
make lab-snapshot # Сохранить состояние
make lab-restore # Восстановить из снапшота
make lab-cleanup # Очистить все
# Сброс лаборатории
make lab-reset
```
### 4. Пресеты для разных сценариев
#### 🏗️ Классические пресеты (systemd контейнеры)
```bash
# Минимальная лаборатория (1-3 машины)
make lab-test LAB_SPEC=molecule/presets/minimal.yml
# Веб-приложение (3-5 машин)
make lab-test LAB_SPEC=molecule/presets/webapp.yml
# Микросервисы (5-8 машин)
make lab-test LAB_SPEC=molecule/presets/microservices.yml
# Высокая доступность (6-10 машин)
make lab-test LAB_SPEC=molecule/presets/ha.yml
# Kubernetes кластер (8-12 машин)
make lab-test LAB_SPEC=molecule/presets/k8s-cluster.yml
# CI/CD пайплайн (10-15 машин)
make lab-test LAB_SPEC=molecule/presets/cicd.yml
# Big Data кластер (12-18 машин)
make lab-test LAB_SPEC=molecule/presets/bigdata.yml
# Service Mesh (15-20 машин)
make lab-test LAB_SPEC=molecule/presets/servicemesh.yml
# Enterprise (18-20 машин)
make lab-test LAB_SPEC=molecule/presets/enterprise.yml
# Максимальный (20 машин)
make lab-test LAB_SPEC=molecule/presets/maximum.yml
```
#### ☸️ Kubernetes пресеты
```bash
# Kubernetes Single Node (1 кластер)
make lab-test LAB_SPEC=molecule/presets/k8s-single.yml
# Kubernetes Multi-Cluster (3 кластера)
make lab-test LAB_SPEC=molecule/presets/k8s-multi.yml
# Kubernetes + Istio Full Stack (1 кластер с полным стеком)
make lab-test LAB_SPEC=molecule/presets/k8s-istio-full.yml
```
#### 🐳 Docker-in-Docker (DinD) пресеты
```bash
# DinD Simple (3 DinD контейнера)
make lab-test LAB_SPEC=molecule/presets/dind-simple.yml
# DinD Swarm (5 DinD контейнеров)
make lab-test LAB_SPEC=molecule/presets/dind-swarm.yml
# DinD Compose (4 DinD контейнера)
make lab-test LAB_SPEC=molecule/presets/dind-compose.yml
```
#### 🔗 Docker-outside-of-Docker (DOoD) пресеты
```bash
# DOoD Simple (3 DOoD контейнера)
make lab-test LAB_SPEC=molecule/presets/dood-simple.yml
# DOoD Mixed (5 DOoD + 2 systemd)
make lab-test LAB_SPEC=molecule/presets/dood-mixed.yml
```
#### 🔀 Смешанные пресеты
```bash
# Mixed Kubernetes + DinD (1 K8s + 3 DinD)
make lab-test LAB_SPEC=molecule/presets/mixed-k8s-dind.yml
# Mixed Kubernetes + DOoD (1 K8s + 3 DOoD)
make lab-test LAB_SPEC=molecule/presets/mixed-k8s-dood.yml
# Mixed Full Stack (1 K8s + 2 DinD + 2 DOoD + 2 systemd)
make lab-test LAB_SPEC=molecule/presets/mixed-full.yml
```
### 3. Работа с Kubernetes
```bash
# Войти в контейнер с kubectl
make kube-sh
# Выполнить команду kubectl
make kube-cmd CLUSTER=lab CMD="get pods -A"
# Войти в toolbox pod
make kube-enter CLUSTER=lab
# Port-forward для Kiali
make kiali-port-forward CLUSTER=lab
# Port-forward для Istio Gateway
make istio-gw-port-forward CLUSTER=lab
```
## Конфигурация
### Переменные лаборатории (molecule/universal/vars.yml)
```yaml
# Сеть для лаборатории
docker_network: labnet
# Образы для разных семейств ОС
images:
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
rhel: "quay.io/centos/centos:stream9-systemd"
# Определение хостов
hosts:
- name: etcd1
group: etcd
family: debian
- name: app-dind
group: apps
type: dind
publish:
- "8080:8080"
# Kind кластеры
kind_clusters:
- name: lab
workers: 2
addons:
ingress_nginx: true
istio: true
kiali: true
```
## Особенности
### 1. Автогенерация инвентаря
Инвентарь генерируется автоматически на основе определения хостов в `vars.yml`.
### 2. Поддержка DinD и DOoD
- **DinD**: Полная изоляция, каждый хост имеет свой Docker daemon
- **DOoD**: Использование хостового Docker, меньше ресурсов
### 3. Kubernetes интеграция
- Автоматическое создание Kind кластеров
- Установка Ingress NGINX, Metrics Server
- Поддержка Istio и Kiali
- Prometheus Stack с Grafana
### 4. Мониторинг и отчеты
- Автоматическая генерация HTML отчетов
- Интеграция с Prometheus и Grafana
- Дашборды для Istio
## Troubleshooting
### Проблемы с образами
Если возникают проблемы с загрузкой образов, обновите `vars.yml`:
```yaml
images:
debian: "ubuntu:22.04" # Используйте стандартные образы
rhel: "centos:8"
```
### Проблемы с Docker
Убедитесь, что Docker socket доступен:
```bash
ls -la /var/run/docker.sock
```
### Проблемы с Molecule
Если возникают проблемы с Molecule, попробуйте:
```bash
# Очистить кэш
make lab-reset
# Проверить конфигурацию
docker exec ansible-controller bash -lc 'molecule lint -s universal'
```
## Дальнейшее развитие
1. **Добавить поддержку Terraform** для создания инфраструктуры
2. **Интегрировать с GitLab CI/CD** для автоматического тестирования
3. **Добавить поддержку ARM64** для тестирования на Apple Silicon
4. **Создать веб-интерфейс** для управления лабораторией
5. **Добавить поддержку OpenShift** для enterprise сценариев
## Лицензия
MIT License
## Контакты
- Автор: Сергей Антропов
- Сайт: https://devops.org.ru
- Email: [ваш email]

View File

@@ -1,282 +0,0 @@
# Универсальная система тестирования Ansible ролей
## Обзор
Эта система предоставляет универсальную среду для тестирования и деплоя Ansible ролей с поддержкой различных типов контейнеров, автоматической генерации инвентаря и интеграции с Ansible Vault.
## Основные возможности
### 🐳 Типы контейнеров
#### Systemd контейнеры (по умолчанию)
- Полная поддержка systemd сервисов
- Работа как виртуальные машины
- Подходит для тестирования ролей
#### DinD (Docker-in-Docker)
- Изолированный Docker daemon
- Подходит для тестирования Docker Compose
- Полная изоляция от хостового Docker
#### DOoD (Docker-out-of-Docker)
- Доступ к хостовому Docker daemon
- Быстрое тестирование
- Подходит для CI/CD
### 📋 Preset'ы
#### etcd-patroni
- Кластер etcd (5 узлов)
- Кластер PostgreSQL с Patroni (3 узла)
- HAProxy для балансировки
- DinD узел для тестирования
#### performance
- 5 серверов приложений
- 3 узла базы данных
- 3 узла кэша Redis
- Load balancer
- DinD узел для тестирования
#### security
- Bastion хосты
- Внутренние серверы
- Изолированная база данных
- Мониторинг и логирование
- Firewall компоненты
- DOoD узел для тестирования
#### multi-os
- Тестирование на разных ОС
- Ubuntu, Debian, RHEL, CentOS
- Смешанные конфигурации
- DinD узел для тестирования
### 🔐 Ansible Vault интеграция
- Автоматическая расшифровка перед тестированием
- Безопасное хранение секретов
- Автоматическая повторная шифровка после тестирования
- Поддержка множественных vault'ов
## Использование
### Базовые команды
```bash
# Показать все preset'ы
make preset-list
# Информация о preset'е
make preset-info PRESET=etcd-patroni
# Тестирование с preset'ом
make preset-test PRESET=etcd-patroni
# Типы контейнеров
make container-types
# Информация о контейнерах
make container-info
# Проверка vault файлов
make vault-check
# Поиск секретов
make vault-scan
```
### Тестирование ролей
```bash
# С default preset
make role test
# С конкретным preset'ом
make role test etcd-patroni
make role test performance
make role test security
make role test multi-os
```
### Работа с Ansible Vault
```bash
# Создать файл секретов
make vault create
# Редактировать секреты
make vault edit
# Показать секреты
make vault show
# Зашифровать файл
make vault encrypt
# Расшифровать файл
make vault decrypt
```
## Структура проекта
```
.
├── molecule/
│ ├── default/
│ │ ├── create.yml # Создание контейнеров
│ │ ├── destroy.yml # Удаление контейнеров
│ │ ├── converge.yml # Запуск плейбуков
│ │ └── verify.yml # Проверка результатов
│ └── presets/
│ ├── etcd-patroni.yml
│ ├── performance.yml
│ ├── security.yml
│ └── multi-os.yml
├── files/
│ ├── requirements.yml
│ └── playbooks/
│ └── site.yml
├── vault/
│ └── secrets.yml
└── Makefile
```
## Создание собственных preset'ов
### Пример preset'а
```yaml
---
# Пресет для тестирования кластера etcd + PostgreSQL + Patroni
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
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:
# Systemd узлы
- name: server1
family: debian
groups: [servers, web]
publish: ["80:80"]
# DinD узел
- name: app-dind
type: dind
groups: [apps, docker]
publish: ["8080:8080"]
# DOoD узел
- name: docker-secure
type: dood
family: debian
groups: [docker, security]
publish: ["8081:8081"]
env:
DOCKER_HOST: "unix:///var/run/docker.sock"
```
### Параметры хостов
- `name` - имя хоста
- `family` - семейство ОС (debian, rhel, ubuntu, centos)
- `type` - тип контейнера (dind, dood)
- `groups` - группы для инвентаря
- `publish` - порты для публикации
- `env` - переменные окружения
- `volumes` - дополнительные тома
- `capabilities` - дополнительные возможности
## Лучшие практики
### 1. Использование групп
```yaml
hosts:
- name: web1
groups: [web, servers, production]
- name: db1
groups: [database, servers, production]
```
### 2. Безопасность
```yaml
# Используйте Ansible Vault для секретов
vault_targets:
- /ansible/vault/secrets.yml
- /ansible/files/playbooks/group_vars/*/vault.yml
- /ansible/files/playbooks/host_vars/*/vault.yml
```
### 3. Тестирование
```yaml
# Проверяйте различные сценарии
- name: Test web servers
hosts: web
tasks:
- name: Check nginx status
systemd:
name: nginx
state: started
```
## Troubleshooting
### Проблемы с контейнерами
```bash
# Проверить статус контейнеров
make container-info
# Очистить Docker ресурсы
make docker clean
```
### Проблемы с Vault
```bash
# Проверить vault файлы
make vault-check
# Найти потенциальные секреты
make vault-scan
```
### Проблемы с preset'ами
```bash
# Показать все preset'ы
make preset-list
# Информация о preset'е
make preset-info PRESET=имя_пресета
```
## Заключение
Универсальная система тестирования Ansible ролей предоставляет мощные инструменты для тестирования ролей в различных сценариях. Используйте preset'ы для быстрого создания тестовых сред, различные типы контейнеров для изоляции и Ansible Vault для безопасности.
Для получения дополнительной информации используйте:
- `make help` - общая справка
- `make role` - команды для ролей
- `make molecule` - команды Molecule
- `make vault` - команды Vault

View File

@@ -1,249 +0,0 @@
# Руководство по работе с Ansible Vault
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Описание
Это руководство описывает работу с зашифрованными секретами в Ansible Vault для проекта AnsibleLab.
## Безопасность
⚠️ **ВАЖНО**: Зашифрованные файлы содержат секретные данные и должны храниться в безопасности!
## Команды для работы с Vault
### Инициализация Vault
```bash
# Создание файла с паролем для vault
make vault init
```
### Основные операции
```bash
# Создание нового файла секретов
make vault create
# Редактирование существующих секретов
make vault edit
# Просмотр содержимого секретов
make vault show
# Шифрование существующего файла
make vault encrypt
# Расшифровка файла
make vault decrypt
# Смена пароля шифрования
make vault rekey
# Удаление файла секретов
make vault delete
# Проверка vault файлов
make vault check
```
## Структура файлов
```
vault/
├── .vault # Файл с паролем для vault (НЕ коммитится в git)
├── secrets.yml # Зашифрованный файл с секретами
└── secrets/ # Директория для незашифрованных секретов
└── *.yml # Незашифрованные файлы секретов
```
## Примеры использования
### 1. Создание нового файла секретов
```bash
# Создать новый файл
make vault create
# Введите имя файла (без .yml): my-secrets
```
### 2. Редактирование секретов
```bash
# Редактировать существующий файл
make vault edit
# Введите имя файла (без .yml): secrets
```
### 3. Просмотр секретов
```bash
# Показать содержимое файла
make vault show
# Введите имя файла (без .yml): secrets
```
### 4. Шифрование файла
```bash
# Зашифровать незашифрованный файл
make vault encrypt
# Введите имя файла (без .yml): secrets
```
### 5. Расшифровка файла
```bash
# Расшифровать файл для редактирования
make vault decrypt
# Введите имя файла (без .yml): secrets
```
## Использование в Playbook
### Передача пароля vault
```bash
# Запуск playbook с паролем vault
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --ask-vault-pass
# Использование файла с паролем
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file vault/.vault
```
### Переменные из vault
```yaml
# В playbook
- name: "Использование секретов из vault"
hosts: all
vars_files:
- vault/secrets.yml
tasks:
- name: "Использование SSH ключа"
authorized_key:
user: "{{ devops_user.name }}"
key: "{{ devops_ssh_keys.public_key }}"
```
## Безопасность и лучшие практики
### 1. Защита пароля vault
```bash
# Установка правильных прав на файл пароля
chmod 600 vault/.vault
# Добавление в .gitignore
echo "vault/.vault" >> .gitignore
```
### 2. Ротация паролей
```bash
# Смена пароля vault
make vault rekey
# Введите имя файла (без .yml): secrets
```
### 3. Резервное копирование
```bash
# Создание резервной копии зашифрованного файла
cp vault/secrets.yml vault/secrets.yml.backup
# Создание резервной копии пароля
cp vault/.vault vault/.vault.backup
```
### 4. Проверка целостности
```bash
# Проверка vault файлов
make vault check
```
## Troubleshooting
### Проблема: "Unable to read source file"
```bash
# Убедитесь, что файл существует
ls -la vault/*.yml
# Проверьте права доступа
ls -la vault/
```
### Проблема: "Vault password not provided"
```bash
# Убедитесь, что файл .vault существует
ls -la vault/.vault
# Проверьте содержимое файла
cat vault/.vault
```
### Проблема: "Invalid vault password"
```bash
# Проверьте пароль в файле .vault
cat vault/.vault
# Пересоздайте файл пароля
rm vault/.vault
make vault init
```
## Интеграция с CI/CD
### GitHub Actions
```yaml
# .github/workflows/deploy.yml
- name: "Deploy with Vault"
run: |
echo "${{ secrets.VAULT_PASSWORD }}" > vault/.vault
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file vault/.vault
```
### GitLab CI
```yaml
# .gitlab-ci.yml
deploy:
script:
- echo "$VAULT_PASSWORD" > vault/.vault
- ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file vault/.vault
```
## Мониторинг и логирование
### Проверка статуса vault
```bash
# Проверка всех vault файлов
make vault check
# Проверка конкретного файла
ansible-vault view vault/secrets.yml --vault-password-file vault/.vault
```
### Логирование операций
```bash
# Включение подробного логирования
export ANSIBLE_VERBOSITY=4
# Запуск с логированием
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file vault/.vault -vvv
```
## Поддержка
- 📧 Email: через сайт https://devops.org.ru
- 📖 Документация: `docs/`
- 🧪 Тесты: `roles/*/tests/`

69
env.example Normal file
View File

@@ -0,0 +1,69 @@
# =============================================================================
# Ansible Template Environment Configuration
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# =============================================================================
# Основные настройки проекта
PROJECT_NAME=ansible-template
VERSION=0.1.0
AUTHOR="Сергей Антропов"
SITE="https://devops.org.ru"
# Docker настройки
DOCKER_IMAGE=quay.io/ansible/creator-ee:latest
DOCKER_NETWORK=labnet
DOCKER_COMPOSE=docker compose
# 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

View File

@@ -0,0 +1,69 @@
{
"id": null,
"uid": "istio-overview",
"title": "Istio • Overview",
"schemaVersion": 36,
"version": 1,
"timezone": "browser",
"tags": ["istio", "sre", "mesh"],
"panels": [
{
"type": "stat",
"title": "Global RPS",
"gridPos": {"h": 4, "w": 6, "x": 0, "y": 0},
"targets": [
{
"expr": "sum(rate(istio_requests_total{reporter=\"destination\"}[5m]))",
"legendFormat": "rps"
}
]
},
{
"type": "stat",
"title": "Success Rate",
"gridPos": {"h": 4, "w": 6, "x": 6, "y": 0},
"targets": [
{
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",response_code!~\"5..\"}[5m])) / sum(rate(istio_requests_total{reporter=\"destination\"}[5m]))",
"legendFormat": "success"
}
],
"options": {"reduceOptions":{"calcs":["lastNotNull"]},"colorMode":"value","graphMode":"none"},
"fieldConfig":{"defaults":{"unit":"percentunit","min":0,"max":1}}
},
{
"type": "timeseries",
"title": "Latency (ms) p50/p95/p99",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 4},
"targets": [
{
"expr": "histogram_quantile(0.5, sum(rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\"}[5m])) by (le))",
"legendFormat": "p50"
},
{
"expr": "histogram_quantile(0.95, sum(rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\"}[5m])) by (le))",
"legendFormat": "p95"
},
{
"expr": "histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\"}[5m])) by (le))",
"legendFormat": "p99"
}
],
"fieldConfig":{"defaults":{"unit":"ms"}}
},
{
"type": "timeseries",
"title": "RPS by Workload",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 12},
"targets": [
{
"expr": "sum by (destination_workload) (rate(istio_requests_total{reporter=\"destination\"}[5m]))",
"legendFormat": "{{destination_workload}}"
}
]
}
],
"templating": {
"list": []
}
}

View File

@@ -0,0 +1,80 @@
{
"id": null,
"uid": "service-sli",
"title": "Service • SLI",
"schemaVersion": 36,
"version": 1,
"timezone": "browser",
"tags": ["istio", "sre", "sli"],
"templating": {
"list": [
{
"name": "namespace",
"type": "query",
"datasource": "${DS_PROMETHEUS}",
"query": "label_values(istio_requests_total, destination_namespace)",
"refresh": 1
},
{
"name": "workload",
"type": "query",
"datasource": "${DS_PROMETHEUS}",
"query": "label_values(istio_requests_total{destination_namespace=\"$namespace\"}, destination_workload)",
"refresh": 1
}
]
},
"panels": [
{
"type": "stat",
"title": "Success Rate",
"gridPos": {"h": 4, "w": 6, "x": 0, "y": 0},
"targets": [
{
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\",response_code!~\"5..\"}[5m])) / sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\"}[5m]))",
"legendFormat": "success"
}
],
"fieldConfig":{"defaults":{"unit":"percentunit","min":0,"max":1}}
},
{
"type": "timeseries",
"title": "Latency (ms) p50/p95/p99",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 4},
"targets": [
{
"expr": "histogram_quantile(0.5, sum by (le) (rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\"}[5m])))",
"legendFormat": "p50"
},
{
"expr": "histogram_quantile(0.95, sum by (le) (rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\"}[5m])))",
"legendFormat": "p95"
},
{
"expr": "histogram_quantile(0.99, sum by (le) (rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\"}[5m])))",
"legendFormat": "p99"
}
],
"fieldConfig":{"defaults":{"unit":"ms"}}
},
{
"type": "timeseries",
"title": "RPS (2xx/4xx/5xx)",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 12},
"targets": [
{
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\",response_code=~\"2..\"}[5m]))",
"legendFormat": "2xx"
},
{
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\",response_code=~\"4..\"}[5m]))",
"legendFormat": "4xx"
},
{
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\",response_code=~\"5..\"}[5m]))",
"legendFormat": "5xx"
}
]
}
]
}

View File

@@ -0,0 +1,39 @@
---
# Istio Telemetry для сбора метрик
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: mesh-default
namespace: istio-system
spec:
selector: {}
metrics:
- providers:
- name: prometheus
overrides:
- match:
metric: REQUEST_DURATION
tagOverrides:
"destination_workload": { operation: UPSERT, value: "%DESTINATION_WORKLOAD%" }
"destination_namespace": { operation: UPSERT, value: "%DESTINATION_NAMESPACE%" }
"request_host": { operation: UPSERT, value: "%REQUEST_HOST%" }
histogram:
buckets:
- 1
- 5
- 10
- 25
- 50
- 100
- 250
- 500
- 1000
- 2000
- 5000
- match:
metric: REQUEST_COUNT
tagOverrides:
"response_code": { operation: UPSERT, value: "%RESPONSE_CODE%" }

View File

@@ -0,0 +1,66 @@
---
# Istio Traffic Policy для управления трафиком
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# mesh-wide mTLS STRICT
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
---
# Пример строгой политики для bookinfo (pool + outlier)
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: productpage-policy
namespace: bookinfo
spec:
host: productpage.bookinfo.svc.cluster.local
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 1000
maxRequestsPerConnection: 100
outlierDetection:
consecutive5xx: 5
interval: 5s
baseEjectionTime: 30s
maxEjectionPercent: 50
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: reviews-policy
namespace: bookinfo
spec:
host: reviews.bookinfo.svc.cluster.local
subsets:
- name: v1
labels: { version: v1 }
- name: v2
labels: { version: v2 }
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 1000
maxRequestsPerConnection: 100
outlierDetection:
consecutive5xx: 3
interval: 5s
baseEjectionTime: 30s
maxEjectionPercent: 50

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

45
files/playbooks/site.yml Normal file
View File

@@ -0,0 +1,45 @@
---
# Основной playbook для универсальной лаборатории
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Base deps
hosts: all
become: true
tasks:
- name: Update apt cache (Debian)
apt:
update_cache: true
when: ansible_os_family == 'Debian'
changed_when: false
- name: Update yum cache (RHEL)
yum:
update_cache: true
when: ansible_os_family == 'RedHat'
changed_when: false
- name: Common tools
package:
name:
- curl
- jq
- ca-certificates
- iproute2
- iputils-ping
- procps
- net-tools
- sudo
- vim
- wget
- unzip
state: present
# Развертывание инфраструктуры
- name: Deploy infrastructure
hosts: all
become: true
tasks:
- name: Infrastructure placeholder
debug:
msg: "Инфраструктура готова для настройки"

8
files/requirements.yml Normal file
View File

@@ -0,0 +1,8 @@
---
# Коллекции Ansible для универсальной лаборатории
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
collections:
- name: community.docker
- name: community.general

View File

@@ -1,16 +0,0 @@
# Инвентори для развертывания на реальные серверы
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Примеры серверов (замените на ваши реальные серверы)
[web_servers]
# web1 ansible_host=192.168.1.10 ansible_user=ubuntu
# web2 ansible_host=192.168.1.11 ansible_user=ubuntu
[db_servers]
# db1 ansible_host=192.168.1.20 ansible_user=ubuntu
[all:vars]
# Общие переменные для всех серверов
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_common_args='-o StrictHostKeyChecking=no'

0
molecule/.gitkeep Normal file
View File

View File

@@ -1,75 +0,0 @@
---
- hosts: localhost
gather_facts: false
vars:
# Получаем preset из переменной окружения или используем default
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
# перечисли файлы/глобы, которые нужно временно расшифровать
vault_targets:
- /workspace/vault/secrets.yml
- /workspace/files/playbooks/group_vars/*/vault.yml
- /workspace/files/playbooks/host_vars/*/vault.yml
- /workspace/roles/**/vars/vault.yml
tasks:
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
# - name: Install collections
# community.docker.docker_container_exec:
# container: ansible-controller
# command: bash -lc "ansible-galaxy collection install -r /workspace/requirements.yml --force --no-deps --upgrade >/dev/null 2>&1 || true"
- 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
[ -f "$f" ] || continue;
if head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;"; then
echo "[vault] already encrypted: $f";
else
echo "[vault] plaintext -> encrypt: $f";
ansible-vault encrypt --encrypt-vault-id default --vault-password-file /workspace/vault/.vault "$f";
fi
echo "[vault] decrypt for run: $f";
ansible-vault decrypt --vault-password-file /workspace/vault/.vault "$f";
done
done
'
- name: Run lab playbook
community.docker.docker_container_exec:
container: ansible-controller
command: >
bash -lc "
ANSIBLE_ROLES_PATH=/workspace/roles
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.ini /workspace/molecule/default/site.yml
"
- name: Post-run — re-encrypt secrets
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
[ -f "$f" ] || continue;
if head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;"; then
echo "[vault] ok (encrypted): $f";
else
echo "[vault] encrypt back: $f";
ansible-vault encrypt --encrypt-vault-id default --vault-password-file /workspace/vault/.vault "$f" || true;
fi
done
done
'
ignore_errors: true

View File

@@ -1,286 +0,0 @@
---
- hosts: localhost
gather_facts: false
vars:
# Получаем preset из переменной окружения или используем default
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
# Проверяем сначала в папке k8s, затем в основной папке presets
preset_file: "{{ '/workspace/molecule/presets/k8s/' + preset_name + '.yml' if (preset_name in ['k8s-minimal', 'kubernetes', 'k8s-full'] or preset_name.startswith('k8s-')) else '/workspace/molecule/presets/' + preset_name + '.yml' }}"
# Fallback значения если preset файл не найден
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos: "inecs/ansible-lab:centos-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu: "inecs/ansible-lab:ubuntu-latest"
debian: "inecs/ansible-lab:debian-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
- name: u1
family: debian
groups: [test]
kind_clusters: []
tasks:
# - name: Install required collections
# command: ansible-galaxy collection install -r /workspace/requirements.yml
# delegate_to: localhost
# ignore_errors: true
# register: collections_install
# changed_when: false
# run_once: true
# become: true
# vars:
# ansible_python_interpreter: /usr/bin/python3
# environment:
# ANSIBLE_COLLECTIONS_PATH: /usr/share/ansible/collections
# Определяем архитектуру системы для корректной загрузки образов
- name: Detect system architecture
shell: |
arch=$(uname -m)
case $arch in
x86_64) echo "linux/amd64" ;;
aarch64|arm64) echo "linux/arm64" ;;
armv7l) echo "linux/arm/v7" ;;
*) echo "linux/amd64" ;;
esac
register: detected_platform
changed_when: false
- name: Set ansible_architecture variable
set_fact:
ansible_architecture: "{{ detected_platform.stdout }}"
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
# Фильтрация хостов по поддерживаемым платформам
- name: Filter hosts by supported platforms
set_fact:
filtered_hosts: "{{ filtered_hosts | default([]) + [item] }}"
loop: "{{ hosts }}"
when: |
item.supported_platforms is not defined or
ansible_architecture in item.supported_platforms
- name: Update hosts list with filtered results
set_fact:
hosts: "{{ filtered_hosts | default(hosts) }}"
- name: Display filtered hosts
debug:
msg: "Platform {{ ansible_architecture }}: {{ hosts | length }} hosts will be deployed"
- name: Ensure network exists
community.docker.docker_network:
name: "{{ docker_network }}"
state: present
# SYSTEMD nodes
- name: Pull systemd images with correct platform
command: "docker pull --platform {{ ansible_architecture }} {{ images[item.family] }}"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
register: pull_result
ignore_errors: yes
- name: Display pull results
debug:
msg: "Pulled {{ item.item.name }}: {{ 'OK' if (item.rc is defined and item.rc == 0) else 'SKIPPED (not available for this platform)' }}"
loop: "{{ pull_result.results | default([]) }}"
loop_control:
label: "{{ item.item.name }}"
- name: Start systemd nodes
community.docker.docker_container:
name: "{{ item.name }}"
image: "{{ images[item.family] }}"
networks:
- name: "{{ docker_network }}"
privileged: "{{ systemd_defaults.privileged }}"
command: "{{ systemd_defaults.command }}"
volumes: "{{ systemd_defaults.volumes | default([]) + (item.volumes | default([])) }}"
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
published_ports: "{{ item.publish | default([]) }}"
env: "{{ item.env | default({}) }}"
# Специальные настройки для Astra Linux и RedOS (для совместимости с amd64 базовыми образами)
security_opts: "{{ ['seccomp=unconfined', 'apparmor=unconfined'] if item.family in ['astra', 'redos'] else [] }}"
platform: "{{ 'linux/amd64' if item.family in ['astra', 'redos'] else omit }}"
state: started
restart_policy: unless-stopped
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
# Ожидание стабилизации контейнеров
- name: Wait for containers to be ready
pause:
seconds: 5
when: hosts | length > 0
# Создание tmp директории в контейнерах
- name: Create Ansible tmp directory in containers
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: "mkdir -p /tmp/.ansible-tmp && chmod 755 /tmp/.ansible-tmp"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
ignore_errors: true
retries: 3
delay: 2
# DinD nodes
- name: Start DinD nodes (docker:27-dind)
community.docker.docker_container:
name: "{{ item.name }}"
image: "docker:27-dind"
networks:
- name: "{{ docker_network }}"
privileged: true
env:
DOCKER_TLS_CERTDIR: ""
published_ports: "{{ item.publish | default([]) }}"
volumes: "{{ (item.volumes | default([])) + [item.name + '-docker:/var/lib/docker'] }}"
state: started
restart_policy: unless-stopped
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
loop_control: { label: "{{ item.name }}" }
# DOoD nodes (mount docker.sock)
- name: Start DOoD nodes (systemd + docker.sock mount)
community.docker.docker_container:
name: "{{ item.name }}"
image: "{{ images[item.family] }}"
networks:
- name: "{{ docker_network }}"
privileged: "{{ systemd_defaults.privileged }}"
command: "{{ systemd_defaults.command }}"
volumes: "{{ (systemd_defaults.volumes | default([])) + ['/var/run/docker.sock:/var/run/docker.sock'] + (item.volumes | default([])) }}"
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
published_ports: "{{ item.publish | default([]) }}"
env: "{{ item.env | default({}) }}"
state: started
restart_policy: unless-stopped
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
# Build groups map
- name: Initialize groups map
set_fact:
groups_map: {}
- name: Append hosts to groups
set_fact:
groups_map: "{{ groups_map | combine({ item_group: (groups_map[item_group] | default([])) + [item_name] }) }}"
loop: "{{ hosts | subelements('groups', skip_missing=True) }}"
loop_control:
label: "{{ item.0.name }}"
vars:
item_name: "{{ item.0.name }}"
item_group: "{{ item.1 }}"
# Render inventory
- name: Render inventory ini
set_fact:
inv_content: |
[all:vars]
ansible_connection=community.docker.docker
ansible_remote_tmp=/tmp/.ansible-tmp
{% for group, members in (groups_map | dictsort) %}
[{{ group }}]
{% for h in members %}{{ h }}
{% endfor %}
{% endfor %}
[all]
{% for h in hosts %}{{ h.name }}
{% endfor %}
{# Группа с Debian-based системами (Debian, Ubuntu, Alt) - используем /usr/bin/python3 #}
{% set debian_hosts = [] %}
{% for h in hosts %}
{% if h.family in ['ubuntu', 'debian', 'alt'] %}
{% set _ = debian_hosts.append(h.name) %}
{% endif %}
{% endfor %}
{% if debian_hosts %}
[debian_family:vars]
ansible_python_interpreter=/usr/bin/python3
[debian_family]
{% for h in debian_hosts %}{{ h }}
{% endfor %}
{% endif %}
{# Группа с RHEL-based системами (RHEL, CentOS, Alma, Rocky, RedOS) #}
{% set rhel_hosts = [] %}
{% for h in hosts %}
{% if h.family in ['rhel', 'centos', 'alma', 'rocky', 'redos'] %}
{% set _ = rhel_hosts.append(h.name) %}
{% endif %}
{% endfor %}
{% if rhel_hosts %}
[rhel_family:vars]
ansible_python_interpreter=/usr/bin/python3
[rhel_family]
{% for h in rhel_hosts %}{{ h }}
{% endfor %}
{% endif %}
{# Astra Linux - используем /usr/bin/python3 #}
{% set astra_hosts = [] %}
{% for h in hosts %}
{% if h.family == 'astra' %}
{% set _ = astra_hosts.append(h.name) %}
{% endif %}
{% endfor %}
{% if astra_hosts %}
[astra_family:vars]
ansible_python_interpreter=/usr/bin/python3
[astra_family]
{% for h in astra_hosts %}{{ h }}
{% endfor %}
{% endif %}
{# Глобальный fallback для остальных хостов #}
[unmatched_hosts:vars]
ansible_python_interpreter=auto_silent
- name: Write inventory file
copy:
dest: "{{ generated_inventory }}"
content: "{{ inv_content }}"
mode: "0644"
- name: Display inventory summary
debug:
msg: |
📋 Inventory Summary:
- Total hosts: {{ hosts | length }}
- Groups: {{ groups_map.keys() | list | join(', ') }}
- Systemd nodes: {{ hosts | selectattr('type','undefined') | list | length }}
- DinD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- DOoD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}

View File

@@ -1,86 +0,0 @@
---
- hosts: localhost
gather_facts: false
vars:
# Получаем preset из переменной окружения или используем default
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
# Проверяем сначала в папке k8s, затем в основной папке presets
preset_file: "{{ '/workspace/molecule/presets/k8s/' + preset_name + '.yml' if (preset_name in ['k8s-minimal', 'kubernetes', 'k8s-full'] or preset_name.startswith('k8s-')) else '/workspace/molecule/presets/' + preset_name + '.yml' }}"
# Fallback значения если preset файл не найден
docker_network: labnet
hosts:
- name: u1
family: debian
groups: [test]
kind_clusters: []
tasks:
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
- name: Stop and remove containers
community.docker.docker_container:
name: "{{ item.name }}"
state: absent
force_kill: true
cleanup: true
loop: "{{ hosts }}"
loop_control: { label: "{{ item.name }}" }
ignore_errors: true
- name: Force remove any remaining containers
shell: |
docker ps -a --filter "name={{ item.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f
loop: "{{ hosts }}"
loop_control: { label: "{{ item.name }}" }
ignore_errors: true
- name: Remove DinD volumes
community.docker.docker_volume:
name: "{{ item.name }}-docker"
state: absent
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
loop_control: { label: "{{ item.name }}" }
ignore_errors: true
- name: Remove custom volumes
community.docker.docker_volume:
name: "{{ item.volumes | default([]) | select('match', '^[^:]+$') | list }}"
state: absent
loop: "{{ hosts }}"
loop_control: { label: "{{ item.name }}" }
ignore_errors: true
when: item.volumes is defined
- name: Remove network
community.docker.docker_network:
name: "{{ docker_network }}"
state: absent
ignore_errors: true
- name: Force cleanup all project containers
shell: |
# Удаляем все контейнеры из загруженного пресета
{% for host in hosts %}
docker ps -a --filter "name={{ host.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true
{% endfor %}
# Удаляем все контейнеры с образами ansible-lab
docker ps -a --filter "ancestor=inecs/ansible-lab" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true
# Удаляем все контейнеры с сетью labnet
docker ps -a --filter "network=labnet" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true
ignore_errors: true
vars:
# Используем переменную hosts из загруженного пресета
hosts: "{{ hosts }}"
- name: Display cleanup summary
debug:
msg: |
🧹 Cleanup Summary:
- Removed containers: {{ hosts | length }}
- Removed DinD volumes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- Network: {{ docker_network }}
- Removed kind clusters: {{ kind_clusters | default([]) | length }}

View File

@@ -1,73 +0,0 @@
---
# Универсальная конфигурация Molecule
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
driver:
name: docker
platforms:
# Платформы будут созданы динамически через preset файлы
# Поддержка собственных образов AnsibleLab
- name: placeholder
image: ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy
pre_build_image: true
# Собственные образы (будут использоваться через presets)
- name: ansible-controller
image: inecs/ansible-lab:ansible-controller-latest
pre_build_image: true
- name: alt-linux
image: inecs/ansible-lab:alt-linux-latest
pre_build_image: true
- name: astra-linux
image: inecs/ansible-lab:astra-linux-latest
pre_build_image: true
- name: redos
image: inecs/ansible-lab:redos-latest
pre_build_image: true
- name: rhel
image: inecs/ansible-lab:rhel-latest
pre_build_image: true
- name: centos
image: inecs/ansible-lab:centos-latest
pre_build_image: true
- name: alma
image: inecs/ansible-lab:alma-latest
pre_build_image: true
- name: rocky
image: inecs/ansible-lab:rocky-latest
pre_build_image: true
- name: ubuntu
image: inecs/ansible-lab:ubuntu-latest
pre_build_image: true
- name: debian
image: inecs/ansible-lab:debian-latest
pre_build_image: true
provisioner:
name: ansible
config_options:
defaults:
stdout_callback: yaml
remote_tmp: /tmp/.ansible-tmp
interpreter_python: auto_silent
env:
ANSIBLE_STDOUT_CALLBACK: yaml
ANSIBLE_REMOTE_TMP: /tmp/.ansible-tmp
inventory:
links:
hosts: "${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini"
playbooks:
create: create.yml
converge: converge.yml
destroy: destroy.yml
dependency:
name: galaxy
verifier:
name: ansible
lint: |-
set -e
ansible-lint /workspace/roles/

View File

@@ -1,216 +0,0 @@
---
# Универсальный playbook для тестирования Ansible ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
#
# Этот файл отвечает за:
# 1. Обновление пакетов в контейнерах при запуске тестов
# 2. Установку common tools для корректной работы тестов
# 3. Подготовку окружения для тестирования ролей
# 4. Запуск всех ролей из директории roles/
- name: Подготовка окружения для тестирования
hosts: all
become: true
tasks:
# Создание tmp директории для Ansible
- name: Create Ansible tmp directory
file:
path: /tmp/.ansible-tmp
state: directory
mode: '0755'
owner: root
group: root
tags:
- setup
- tmp
# Обновление кеша пакетов для Debian/Ubuntu
- name: Update package cache (Debian/Ubuntu)
apt:
update_cache: true
cache_valid_time: 3600
when: ansible_os_family == 'Debian'
changed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
yum:
update_cache: true
when: ansible_os_family == 'RedHat'
changed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для Alt Linux
- name: Update package cache (Alt Linux)
command: apt-get update
when: ansible_os_family == 'Altlinux'
changed_when: false
failed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для Astra Linux
- name: Update package cache (Astra Linux)
command: apt-get update
when: ansible_os_family == 'Astra Linux'
changed_when: false
failed_when: false
tags:
- setup
- update
# Установка common tools для всех ОС (ЗАКОММЕНТИРОВАНО)
# - name: Install common tools (Debian/Ubuntu)
# apt:
# name:
# - curl
# - jq
# - ca-certificates
# - iproute2
# - iputils-ping
# - procps
# - net-tools
# - vim
# - wget
# - unzip
# - git
# state: present
# update_cache: false
# when: ansible_os_family == 'Debian'
# tags:
# - setup
# - tools
# - name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
# yum:
# name:
# - curl
# - jq
# - ca-certificates
# - iproute
# - iputils
# - procps-ng
# - net-tools
# - vim
# - wget
# - unzip
# - git
# state: present
# when: ansible_os_family == 'RedHat'
# tags:
# - setup
# - tools
# - name: Install common tools (Alt Linux)
# command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git
# when: ansible_os_family == 'Altlinux'
# changed_when: false
# failed_when: false
# tags:
# - setup
# - tools
# - name: Install common tools (Astra Linux)
# command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git
# when: ansible_os_family == 'Astra Linux'
# changed_when: false
# failed_when: false
# tags:
# - setup
# - tools
# Установка Python для Ansible (если не установлен)
- name: Install Python (Debian/Ubuntu)
apt:
name:
- python3
- python3-pip
- python3-venv
state: present
when: ansible_os_family == 'Debian'
tags:
- setup
- python
# Установка Python 3.8+ для RHEL/CentOS/Rocky/AlmaLinux
- name: Install Python 3.8+ (RHEL/CentOS/Rocky/AlmaLinux)
yum:
name:
- python3
- python3-pip
state: present
when: ansible_os_family == 'RedHat'
tags:
- setup
- python
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
yum:
name:
- python3
- python3-pip
state: present
when: ansible_os_family == 'RedHat'
tags:
- setup
- python
- name: Install Python (Alt Linux)
command: apt-get install -y python3 python3-pip
when: ansible_os_family == 'Altlinux'
changed_when: false
failed_when: false
tags:
- setup
- python
- name: Install Python (Astra Linux)
command: apt-get install -y python3 python3-pip
when: ansible_os_family == 'Astra Linux'
changed_when: false
failed_when: false
tags:
- setup
- python
# Создание пользователя для тестирования (ЗАКОММЕНТИРОВАНО)
# - name: Create test user
# user:
# name: testuser
# shell: /bin/bash
# create_home: yes
# state: present
# tags:
# - setup
# - user
# Настройка sudo для тестового пользователя (ЗАКОММЕНТИРОВАНО)
# - name: Configure sudo for test user
# lineinfile:
# path: /etc/sudoers
# line: "testuser ALL=(ALL) NOPASSWD:ALL"
# state: present
# validate: 'visudo -cf %s'
# tags:
# - setup
# - sudo
# Создание директории для тестов (ЗАКОММЕНТИРОВАНО)
# - name: Create test directory
# file:
# path: /tmp/ansible-test
# state: directory
# mode: '0755'
# owner: testuser
# group: testuser
# tags:
# - setup
# - directory
- import_playbook: ../../roles/deploy.yml

View File

@@ -1,123 +0,0 @@
---
- hosts: localhost
gather_facts: false
vars:
# Получаем preset из переменной окружения или используем default
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
# Fallback значения если preset файл не найден
docker_network: labnet
hosts:
- name: u1
family: debian
groups: [test]
tasks:
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
# Проверка systemd узлов
- name: Check systemd nodes status
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: systemctl is-system-running
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
register: systemd_status
ignore_errors: true
- name: Display systemd nodes status
debug:
msg: "Systemd node {{ item.0.name }}: {{ item.1.stdout | default('unknown') }}"
loop: "{{ systemd_status.results | default([]) }}"
when: systemd_status is defined
# Проверка DinD узлов
- name: Check DinD nodes docker daemon
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: docker version --format '{{.Server.Version}}'
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
loop_control: { label: "{{ item.name }}" }
register: dind_status
ignore_errors: true
- name: Display DinD nodes status
debug:
msg: "DinD node {{ item.0.name }}: Docker {{ item.1.stdout | default('not running') }}"
loop: "{{ dind_status.results | default([]) }}"
when: dind_status is defined
# Проверка DOoD узлов
- name: Check DOoD nodes docker access
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: docker ps --format '{{.Names}}'
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
loop_control: { label: "{{ item.name }}" }
register: dood_status
ignore_errors: true
- name: Display DOoD nodes status
debug:
msg: "DOoD node {{ item.0.name }}: Can access {{ item.1.stdout_lines | length | default(0) }} containers"
loop: "{{ dood_status.results | default([]) }}"
when: dood_status is defined
# Проверка сетевого подключения
- name: Test network connectivity between nodes
community.docker.docker_container_exec:
container: "{{ item.0.name }}"
command: ping -c 1 {{ item.1.name }}
loop: "{{ hosts | subelements(hosts, 'name') }}"
loop_control: { label: "{{ item.0.name }} -> {{ item.1.name }}" }
when: item.0.name != item.1.name
register: ping_results
ignore_errors: true
- name: Display network connectivity results
debug:
msg: "Network test {{ item.0.name }} -> {{ item.1.name }}: {{ 'OK' if item.2.rc == 0 else 'FAILED' }}"
loop: "{{ ping_results.results | default([]) }}"
when: ping_results is defined
# Проверка портов
- name: Check published ports
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: netstat -tlnp
loop: "{{ hosts | selectattr('publish','defined') | list }}"
loop_control: { label: "{{ item.name }}" }
register: port_status
ignore_errors: true
- name: Display port status
debug:
msg: "Node {{ item.0.name }} ports: {{ item.1.stdout_lines | select('match', 'LISTEN') | list | length }} listening"
loop: "{{ port_status.results | default([]) }}"
when: port_status is defined
# Проверка групп
- name: Display inventory groups
debug:
msg: |
📋 Inventory Groups:
{% for group, members in (groups_map | default({}) | dictsort) %}
- {{ group }}: {{ members | join(', ') }}
{% endfor %}
# Финальная сводка
- name: Display verification summary
debug:
msg: |
✅ Verification Summary:
- Total hosts: {{ hosts | length }}
- Systemd nodes: {{ hosts | selectattr('type','undefined') | list | length }}
- DinD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- DOoD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
- Groups: {{ groups_map.keys() | list | join(', ') }}
- Network: {{ docker_network }}

View File

@@ -1,43 +0,0 @@
---
#description: Стандартный пресет по умолчанию для тестирования с 2 хостами (Ubuntu + Debian)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Стандартный набор - 2 хоста для базового тестирования (стабильные ОС)
- name: u1
family: ubuntu22
groups: [test, web]
- name: u2
family: debian12
groups: [test, web]

View File

@@ -1,184 +0,0 @@
---
#description: Пресет для тестирования всех доступных образов (9 хостов)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Примечание: Astra Linux и RedOS поддерживают только linux/amd64
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Debian-based системы
- name: ubuntu20-test
family: ubuntu2220
groups: [test, debian, ubuntu]
publish:
- "8080:80"
env:
TEST_OS: "Ubuntu 20.04"
TEST_FAMILY: "Debian"
- name: ubuntu22-test
family: ubuntu22
groups: [test, debian, ubuntu]
publish:
- "8081:80"
env:
TEST_OS: "Ubuntu 22.04"
TEST_FAMILY: "Debian"
- name: ubuntu24-test
family: ubuntu2224
groups: [test, debian, ubuntu]
publish:
- "8082:80"
env:
TEST_OS: "Ubuntu 24.04"
TEST_FAMILY: "Debian"
- name: debian9-test
family: debian129
groups: [test, debian]
publish:
- "8083:80"
env:
TEST_OS: "Debian 9"
TEST_FAMILY: "Debian"
- name: debian10-test
family: debian1210
groups: [test, debian]
publish:
- "8084:80"
env:
TEST_OS: "Debian 10"
TEST_FAMILY: "Debian"
- name: debian11-test
family: debian1211
groups: [test, debian]
publish:
- "8085:80"
env:
TEST_OS: "Debian 11"
TEST_FAMILY: "Debian"
- name: debian12-test
family: debian12
groups: [test, debian]
publish:
- "8086:80"
env:
TEST_OS: "Debian 12"
TEST_FAMILY: "Debian"
- name: alt-test
family: alt
groups: [test, altlinux]
publish:
- "8082:80"
env:
TEST_OS: "Alt Linux"
TEST_FAMILY: "Altlinux"
- name: astra-test
family: astra
groups: [test, astra]
supported_platforms: ["linux/amd64"] # Только amd64
publish:
- "8083:80"
env:
TEST_OS: "Astra Linux"
TEST_FAMILY: "Astra Linux"
# RHEL-based системы
- name: centos7-test
family: centos97
groups: [test, rhel, centos]
publish:
- "8090:80"
env:
TEST_OS: "CentOS 7"
TEST_FAMILY: "RedHat"
- name: centos8-test
family: centos98
groups: [test, rhel, centos]
publish:
- "8091:80"
env:
TEST_OS: "CentOS 8"
TEST_FAMILY: "RedHat"
- name: centos9-test
family: centos99
groups: [test, rhel, centos]
publish:
- "8092:80"
env:
TEST_OS: "CentOS 9"
TEST_FAMILY: "RedHat"
- name: rhel-test
family: rhel
groups: [test, rhel]
publish:
- "8085:80"
env:
TEST_OS: "RHEL"
TEST_FAMILY: "RedHat"
- name: alma-test
family: alma
groups: [test, rhel]
publish:
- "8086:80"
env:
TEST_OS: "AlmaLinux"
TEST_FAMILY: "RedHat"
- name: rocky-test
family: rocky
groups: [test, rhel]
publish:
- "8087:80"
env:
TEST_OS: "Rocky Linux"
TEST_FAMILY: "RedHat"
- name: redos-test
family: redos
groups: [test, rhel]
supported_platforms: ["linux/amd64"] # Только amd64
publish:
- "8088:80"
env:
TEST_OS: "RedOS"
TEST_FAMILY: "RedHat"

View File

@@ -1,52 +0,0 @@
---
#description: Пресет со всеми версиями CentOS (7, 8, 9)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы CentOS
images:
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# CentOS 7
- name: centos7-1
family: centos7
groups: [centos, test, web]
publish: ["7007:80"]
- name: centos7-2
family: centos7
groups: [centos, test, db]
publish: ["7008:80"]
# CentOS 8
- name: centos8-1
family: centos8
groups: [centos, test, web]
publish: ["7009:80"]
- name: centos8-2
family: centos8
groups: [centos, test, db]
publish: ["7010:80"]
# CentOS 9 Stream
- name: centos9-1
family: centos9
groups: [centos, test, web]
publish: ["7011:80"]
- name: centos9-2
family: centos9
groups: [centos, test, db]
publish: ["7012:80"]

View File

@@ -1,34 +0,0 @@
---
#description: Пресет для CentOS 7
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образ CentOS 7
images:
centos7: "inecs/ansible-lab:centos7-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# CentOS 7 хосты
- name: centos7-web
family: centos7
groups: [centos, test, web]
publish: ["7070:80"]
- name: centos7-db
family: centos7
groups: [centos, test, db]
publish: ["7071:80"]
- name: centos7-app
family: centos7
groups: [centos, test, app]
publish: ["7072:80"]

View File

@@ -1,34 +0,0 @@
---
#description: Пресет для CentOS 8
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образ CentOS 8
images:
centos8: "inecs/ansible-lab:centos8-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# CentOS 8 хосты
- name: centos8-web
family: centos8
groups: [centos, test, web]
publish: ["7080:80"]
- name: centos8-db
family: centos8
groups: [centos, test, db]
publish: ["7081:80"]
- name: centos8-app
family: centos8
groups: [centos, test, app]
publish: ["7082:80"]

View File

@@ -1,34 +0,0 @@
---
#description: Пресет для CentOS 9 Stream
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образ CentOS 9
images:
centos9: "inecs/ansible-lab:centos9-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# CentOS 9 Stream хосты
- name: centos9-web
family: centos9
groups: [centos, test, web]
publish: ["7090:80"]
- name: centos9-db
family: centos9
groups: [centos, test, db]
publish: ["7091:80"]
- name: centos9-app
family: centos9
groups: [centos, test, app]
publish: ["7092:80"]

View File

@@ -1,63 +0,0 @@
---
#description: Пресет со всеми версиями Debian (9, 10, 11, 12)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы Debian
images:
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Debian 9 Stretch
- name: debian9-1
family: debian9
groups: [debian, test, web]
publish: ["9009:80"]
- name: debian9-2
family: debian9
groups: [debian, test, db]
publish: ["9010:80"]
# Debian 10 Buster
- name: debian10-1
family: debian10
groups: [debian, test, web]
publish: ["9011:80"]
- name: debian10-2
family: debian10
groups: [debian, test, db]
publish: ["9012:80"]
# Debian 11 Bullseye
- name: debian11-1
family: debian11
groups: [debian, test, web]
publish: ["9013:80"]
- name: debian11-2
family: debian11
groups: [debian, test, db]
publish: ["9014:80"]
# Debian 12 Bookworm
- name: debian12-1
family: debian12
groups: [debian, test, web]
publish: ["9015:80"]
- name: debian12-2
family: debian12
groups: [debian, test, db]
publish: ["9016:80"]

View File

@@ -1,34 +0,0 @@
---
#description: Пресет для Debian 10 Buster
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образ Debian 10
images:
debian10: "inecs/ansible-lab:debian10-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Debian 10 Buster хосты
- name: debian10-web
family: debian10
groups: [debian, test, web]
publish: ["9100:80"]
- name: debian10-db
family: debian10
groups: [debian, test, db]
publish: ["9101:80"]
- name: debian10-app
family: debian10
groups: [debian, test, app]
publish: ["9102:80"]

View File

@@ -1,34 +0,0 @@
---
#description: Пресет для Debian 11 Bullseye
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образ Debian 11
images:
debian11: "inecs/ansible-lab:debian11-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Debian 11 Bullseye хосты
- name: debian11-web
family: debian11
groups: [debian, test, web]
publish: ["9110:80"]
- name: debian11-db
family: debian11
groups: [debian, test, db]
publish: ["9111:80"]
- name: debian11-app
family: debian11
groups: [debian, test, app]
publish: ["9112:80"]

View File

@@ -1,34 +0,0 @@
---
#description: Пресет для Debian 12 Bookworm
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образ Debian 12
images:
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Debian 12 Bookworm хосты
- name: debian12-web
family: debian12
groups: [debian, test, web]
publish: ["9120:80"]
- name: debian12-db
family: debian12
groups: [debian, test, db]
publish: ["9121:80"]
- name: debian12-app
family: debian12
groups: [debian, test, app]
publish: ["9122:80"]

View File

@@ -1,34 +0,0 @@
---
#description: Пресет для Debian 9 Stretch
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образ Debian 9
images:
debian9: "inecs/ansible-lab:debian9-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Debian 9 Stretch хосты
- name: debian9-web
family: debian9
groups: [debian, test, web]
publish: ["9090:80"]
- name: debian9-db
family: debian9
groups: [debian, test, db]
publish: ["9091:80"]
- name: debian9-app
family: debian9
groups: [debian, test, app]
publish: ["9092:80"]

View File

@@ -1,58 +0,0 @@
---
#description: Полный пресет с Docker функциональностью (DinD + DOoD)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Базовые хосты (стабильные ОС)
- name: u1
family: ubuntu22
groups: [test, web]
- name: u2
family: debian12
groups: [test, web]
# DinD узел (Docker-in-Docker)
- name: docker1
type: dind
groups: [docker]
publish: ["8080:8080"]
# DOoD узел (Docker-out-of-Docker)
- name: dood1
type: dood
family: ubuntu22
groups: [dood]
publish: ["8081:8081"]
env:
DOCKER_HOST: unix:///var/run/docker.sock

View File

@@ -1,58 +0,0 @@
---
#description: Пресет с Docker контейнерами (DinD + DOoD) для тестирования Docker-задач
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Тестовые хосты
- name: test1
family: debian12
groups: [test]
- name: test2
family: rhel
groups: [test]
# DinD узел (Docker-in-Docker)
- name: docker1
type: dind
groups: [docker]
publish: ["8080:8080"]
# DOoD узел (Docker-out-of-Docker)
- name: dood1
type: dood
family: debian12
groups: [dood]
publish: ["8081:8081"]
env:
DOCKER_HOST: unix:///var/run/docker.sock

View File

@@ -1,76 +0,0 @@
---
#description: Пресет для тестирования кластера etcd + PostgreSQL + Patroni (9 хостов)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Описание кластера etcd + Patroni + HAProxy
hosts:
# ETCD кластер (5 узлов для высокой доступности)
- name: etcd1
family: debian12
groups: [etcd, cluster]
- name: etcd2
family: rhel
groups: [etcd, cluster]
- name: etcd3
family: debian12
groups: [etcd, cluster]
- name: etcd4
family: rhel
groups: [etcd, cluster]
- name: etcd5
family: debian12
groups: [etcd, cluster]
# Patroni кластер (3 узла PostgreSQL)
- name: patroni1
family: rhel
groups: [patroni, database, cluster]
- name: patroni2
family: debian12
groups: [patroni, database, cluster]
- name: patroni3
family: rhel
groups: [patroni, database, cluster]
# HAProxy для балансировки
- name: haproxy
family: debian12
groups: [haproxy, loadbalancer]
publish: ["5000:5000", "5001:5001"] # RW и RO порты
# DinD узел для тестирования Docker Compose внутри
- name: app-dind
type: dind
groups: [apps, docker]
publish: ["8080:8080"]

View File

@@ -1,44 +0,0 @@
---
#description: Минимальный пресет для быстрого тестирования с 1 хостом (Debian)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Минимальный набор - один хост
- name: u1
family: astra
groups: [test]
supported_platforms: ["linux/amd64"] # Только amd64
- name: u2
family: alt
groups: [test]

View File

@@ -1,84 +0,0 @@
---
#description: Пресет для тестирования на разных ОС с 12 хостами (Debian + RHEL)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы для разных ОС
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Описание кластера с разными ОС
hosts:
# Debian серверы
- name: debian1
family: debian12
groups: [debian, servers, web]
- name: debian2
family: debian12
groups: [debian, servers, web]
- name: debian3
family: debian12
groups: [debian, servers, app]
- name: debian4
family: debian12
groups: [debian, servers, app]
# RHEL серверы
- name: rhel1
family: rhel
groups: [rhel, servers, web]
- name: rhel2
family: rhel
groups: [rhel, servers, web]
- name: rhel3
family: rhel
groups: [rhel, servers, app]
- name: rhel4
family: rhel
groups: [rhel, servers, app]
# База данных на разных ОС
- name: db-debian
family: debian12
groups: [database, debian, db]
- name: db-rhel
family: rhel
groups: [database, rhel, db]
# Load balancer
- name: lb-mixed
family: debian12
groups: [loadbalancer, haproxy]
publish: ["80:80", "443:443"]
# DinD узел для тестирования Docker
- name: docker-mixed
type: dind
groups: [docker, apps]
publish: ["8080:8080"]

Some files were not shown because too many files have changed in this diff Show More