diff --git a/.cursor/commands/roles.md b/.cursor/commands/roles.md new file mode 100644 index 0000000..e69de29 diff --git a/Makefile b/Makefile index 57c8a5e..70728f0 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ DOCKER_BUILDX_BUILDER ?= multiarch-builder # Базовые образы и их теги BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi quay.io/centos/centos:stream9 almalinux:8 rockylinux:8 -.PHONY: role vault git docker presets controller help +.PHONY: role vault git docker presets controller help update-playbooks generate-docs setup-cicd # ============================================================================= # КОМАНДЫ ДЛЯ РАБОТЫ С РОЛЯМИ @@ -97,7 +97,7 @@ role: -v ~/.ssh:/root/.ssh:ro \ -e ANSIBLE_FORCE_COLOR=1 \ $(DOCKER_IMAGE) \ - bash -c "ansible-playbook -i inventory/hosts.ini deploy.yml --check"; \ + bash -c "ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check"; \ echo ""; \ read -p "Продолжить развертывание? (y/N): " confirm; \ if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \ @@ -105,7 +105,7 @@ role: -v ~/.ssh:/root/.ssh:ro \ -e ANSIBLE_FORCE_COLOR=1 \ $(DOCKER_IMAGE) \ - bash -c "ansible-playbook -i inventory/hosts.ini deploy.yml"; \ + bash -c "ansible-playbook -i inventory/hosts.ini roles/deploy.yml"; \ else \ echo "❌ Развертывание отменено"; \ fi;; \ @@ -942,6 +942,11 @@ help: @echo " make docker diagnose - диагностика buildx проблем" @echo " make docker reset-builder - сброс buildx builder" @echo " 💡 Поддерживает: amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6" + @echo "" + @echo "🔧 АВТОМАТИЗАЦИЯ:" + @echo " make update-playbooks - обновление playbook'ов при добавлении ролей" + @echo " make generate-docs - генерация документации для ролей" + @echo " make setup-cicd - настройка CI/CD для всех платформ" @echo " 💡 Безопасно: использует inspect вместо buildx ls (избегает зависаний)" @echo "" @echo "🔐 VAULT (управление секретами):" @@ -1038,6 +1043,25 @@ custom-images: echo " - inecs/ansible-lab:debian-latest";; \ esac +# ============================================================================= +# АВТОМАТИЗАЦИЯ +# ============================================================================= + +update-playbooks: + @echo "🔄 Обновление playbook'ов..." + @chmod +x scripts/update-playbooks.sh + @./scripts/update-playbooks.sh + +generate-docs: + @echo "📚 Генерация документации..." + @chmod +x scripts/generate-role-docs.sh + @./scripts/generate-role-docs.sh + +setup-cicd: + @echo "🔧 Настройка CI/CD..." + @chmod +x scripts/setup-cicd.sh + @./scripts/setup-cicd.sh + # Пустые цели для совместимости view create edit show delete lint deploy new advanced list info test build push pull clean prepare update run stop purge clean-builder setup-builder diagnose reset-builder build-image: @true diff --git a/README.md b/README.md index d6160e8..1cfd6a3 100644 --- a/README.md +++ b/README.md @@ -2,212 +2,2073 @@ **Автор:** Сергей Антропов **Сайт:** https://devops.org.ru +**Версия:** 2.0.0 ## 🚀 Описание -AnsibleTemplate - это универсальная система для тестирования Ansible ролей с использованием Docker и различных preset'ов конфигурации. +AnsibleTemplate - это универсальная система для тестирования Ansible ролей с использованием Docker, Molecule и различных preset'ов конфигурации. Система поддерживает multi-arch сборку, CI/CD интеграцию и работу с различными операционными системами. -## 🔧 Исправленные проблемы +## 📚 Документация -### 1. **Проблема с preset'ами в Makefile** -- ✅ **Исправлено**: Полностью универсальная система - любой preset без изменения Makefile -- ✅ **Добавлено**: Динамическое определение preset'ов через `filter-out` и `cut` -- ✅ **Улучшено**: Динамическая загрузка preset'ов через `include_vars` в Ansible -- ✅ **Добавлено**: Fallback значения и подробная справка при ошибках +### 🚀 Быстрый старт +- **[docs/getting-started.md](docs/getting-started.md)** - Установка, настройка и первое тестирование -### 2. **Дублирование файлов preset'ов** -- ✅ **Исправлено**: Создан уникальный `default.yml` preset с 2 хостами (Debian + RHEL) -- ✅ **Сохранено**: `minimal.yml` для быстрого тестирования с 1 хостом -- ✅ **Улучшено**: Различные конфигурации для разных сценариев тестирования +### 🛠️ Разработка +- **[docs/creating-roles.md](docs/creating-roles.md)** - Создание и разработка ролей +- **[docs/site-yml-guide.md](docs/site-yml-guide.md)** - Руководство по файлу site.yml +- **[docs/molecule-guide.md](docs/molecule-guide.md)** - Подробное руководство по Molecule +- **[dockerfiles/README.md](dockerfiles/README.md)** - Подробная документация по Docker образам -### 3. **Проблемы с именами контейнеров** -- ✅ **Исправлено**: Унифицированы имена контейнеров (`ansible-controller`) -- ✅ **Обновлено**: Все файлы теперь используют одинаковые имена контейнеров +### 🏗️ CI/CD +- **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD для GitHub Actions, Azure DevOps, Jenkins, GitLab CI -### 4. **Проблемы с путями** -- ✅ **Исправлено**: Пути в `create.yml` и `destroy.yml` теперь используют `preset.yml` -- ✅ **Добавлено**: Fallback значения для случаев отсутствия preset файлов -- ✅ **Улучшено**: Более надежная работа с переменными +### 📊 Мониторинг +- **[docs/monitoring.md](docs/monitoring.md)** - Мониторинг, диагностика и troubleshooting -### 5. **Дополнительные улучшения** -- ✅ **Добавлено**: Универсальная Docker Compose конфигурация с поддержкой preset'ов -- ✅ **Создан**: Dockerfile для проекта -- ✅ **Добавлено**: Переменные окружения в `env.example` -- ✅ **Улучшено**: Расширенная справка и команды Docker -- ✅ **Добавлено**: Команды для работы с preset'ами через Docker Compose +## ✨ Ключевые возможности + +### 🐳 Multi-Arch Docker поддержка +- **Поддерживаемые архитектуры:** amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6 +- **Автоматическая сборка** для всех архитектур одновременно +- **Docker Hub интеграция** с автоматической публикацией +- **Собственные образы** для различных ОС (Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux, ALT Linux, Astra Linux, RED OS) + +### 🧪 Универсальная система тестирования +- **Preset система** - любой preset без изменения Makefile +- **Molecule интеграция** с поддержкой Docker +- **Автоматическое создание** тестовых окружений +- **Поддержка systemd** в контейнерах +- **DinD/DOoD** поддержка для Docker функциональности + +### 🔐 Безопасность и секреты +- **Ansible Vault** интеграция +- **Автоматическое шифрование/расшифровка** секретов +- **Сканирование** на наличие незашифрованных секретов +- **Управление паролями** и ключами + +### 🚀 CI/CD интеграция +- **GitHub Actions** готовые workflow'ы +- **Azure DevOps** pipeline конфигурации +- **Jenkins** pipeline скрипты +- **GitLab CI** интеграция +- **Автоматическое тестирование** при push/PR ## 📁 Структура проекта ``` AnsibleTemplate/ -├── molecule/ -│ ├── default/ # Molecule конфигурация -│ │ ├── create.yml # Создание тестовых контейнеров -│ │ ├── converge.yml # Запуск тестов -│ │ ├── destroy.yml # Удаление контейнеров -│ │ └── site.yml # Основной playbook -│ └── presets/ # Preset'ы конфигурации -│ ├── default.yml # Стандартный preset (2 хоста) -│ ├── minimal.yml # Минимальный preset (1 хост) -│ ├── standard.yml # Расширенный preset (3 хоста) -│ └── docker.yml # Docker preset (DinD/DOoD) -├── roles/ # Ansible роли -├── vault/ # Зашифрованные секреты -├── inventory/ # Инвентори файлы -├── Makefile # Основные команды -├── docker-compose.yml # Docker Compose конфигурация -├── Dockerfile # Docker образ -└── env.example # Переменные окружения +├── molecule/ # Molecule конфигурация +│ ├── default/ # Основная конфигурация +│ │ ├── create.yml # Создание тестовых контейнеров +│ │ ├── converge.yml # Запуск тестов +│ │ ├── destroy.yml # Удаление контейнеров +│ │ ├── site.yml # Основной playbook +│ │ └── molecule.yml # Конфигурация Molecule +│ └── presets/ # Preset'ы конфигурации +│ ├── default.yml # Стандартный preset (2 хоста) +│ ├── minimal.yml # Минимальный preset (1 хост) +│ ├── standard.yml # Расширенный preset (3 хоста) +│ ├── performance.yml # Performance preset (5 хостов) +│ ├── security.yml # Security preset (3 хоста) +│ └── etcd-patroni.yml # etcd-patroni preset +├── roles/ # Ansible роли +│ ├── ping/ # Пример роли ping +│ └── deploy.yml # 🚀 Playbook для продакшн развертывания +│ # (перенесен из корня для лучшей организации) +├── dockerfiles/ # Docker образы для разных ОС +│ ├── ansible-controller/ # Ansible контроллер +│ ├── ubuntu/ # Ubuntu образ +│ ├── debian/ # Debian образ +│ ├── rhel/ # RHEL образ +│ ├── centos/ # CentOS образ +│ ├── alma/ # AlmaLinux образ +│ ├── rocky/ # Rocky Linux образ +│ ├── alt-linux/ # ALT Linux образ +│ ├── astra-linux/ # Astra Linux образ +│ ├── redos/ # RED OS образ +│ └── README.md # 📖 [Подробная документация](dockerfiles/README.md) +├── cicd/ # CI/CD конфигурации +│ ├── github/ # GitHub Actions +│ ├── azure-devops/ # Azure DevOps +│ ├── jenkins/ # Jenkins +│ └── gitlab/ # GitLab CI +├── vault/ # Зашифрованные секреты +├── inventory/ # Инвентори файлы +├── scripts/ # Скрипты автоматизации +├── docs/ # 📖 Документация +│ ├── getting-started.md # 🚀 Быстрый старт +│ ├── creating-roles.md # 🛠️ Создание ролей +│ ├── cicd-setup.md # 🏗️ Настройка CI/CD +│ ├── monitoring.md # 📊 Мониторинг и диагностика +│ ├── site-yml-guide.md # 📋 Руководство по site.yml +│ └── molecule-guide.md # 🧪 Подробное руководство по Molecule +├── Makefile # Основные команды +├── requirements.yml # Ansible коллекции +├── ansible.cfg # Конфигурация Ansible +└── Dockerfile # Основной Docker образ ``` -## 🚀 Использование +## 📋 Важные изменения -### 🧪 Тестирование (Docker контейнеры) +### Перемещение deploy.yml +**Файл `deploy.yml` перенесен из корня проекта в папку `roles/`** для лучшей организации структуры проекта. Теперь все playbook'и находятся в одном месте. + +**Новое расположение:** `roles/deploy.yml` +**Старое расположение:** `deploy.yml` (в корне) + +Все пути в проекте автоматически обновлены. Если вы используете старые скрипты или документацию, обновите пути с `deploy.yml` на `roles/deploy.yml`. + +## 🚀 Быстрый старт + +> 📖 **Подробное руководство:** [docs/getting-started.md](docs/getting-started.md) + +### 1. Клонирование и настройка + +```bash +git clone https://github.com/your-username/AnsibleTemplate.git +cd AnsibleTemplate + +# Копирование переменных окружения +cp env.example .env +``` + +### 2. Настройка Docker + +```bash +# Настройка multi-arch builder +make docker setup-builder + +# Сборка всех образов (multi-arch) +make docker build + +# Проверка собранных образов +make docker info +``` + +### 3. Тестирование ролей ```bash # Просмотр доступных preset'ов -make role presets +make presets list -# Тестирование с разными preset'ами -make role test # default preset -make role test minimal # minimal preset -make role test standard # standard preset -make role test docker # docker preset -make role test performance # performance preset -make role test security # security preset -make role test my-custom-preset # любой custom preset +# Тестирование с default preset +make role test + +# Тестирование с minimal preset +make role test minimal + +# Тестирование с custom preset +make role test my-custom-preset ``` -**Особенности тестирования:** -- Использует Docker контейнеры для изоляции -- Динамический inventory создается из preset файлов -- Временные контейнеры (u1, u2, u3, ...) -- Автоматическая очистка после тестов +## 🧪 Тестирование -### 🚀 Развертывание (Реальные серверы) +### Preset система + +Система поддерживает неограниченное количество preset'ов без изменения Makefile: ```bash -# Развертывание на реальные серверы -make role deploy # развертывание ролей +# Просмотр всех доступных preset'ов +make presets list + +# Информация о конкретном preset'е +make presets info PRESET=etcd-patroni + +# Тестирование с preset'ом +make presets test PRESET=performance ``` -**Особенности развертывания:** -- Использует статический `inventory/hosts.ini` -- Подключение по SSH к реальным серверам -- Dry-run проверка перед развертыванием -- Подтверждение пользователя - -### 🔧 Вспомогательные команды - -```bash -# Docker команды -make docker clean # очистить Docker ресурсы - -# Другие команды -make role lint # проверка синтаксиса -make vault create # создание секретов -make help # полная справка -``` - -### Preset'ы конфигурации +### Доступные preset'ы | Preset | Описание | Хосты | Использование | |--------|----------|-------|---------------| | `default` | Стандартный preset | 2 хоста (Debian + RHEL) | Базовое тестирование | | `minimal` | Минимальный preset | 1 хост (Debian) | Быстрое тестирование | | `standard` | Расширенный preset | 3 хоста (Debian + RHEL + Debian) | Полное тестирование | -| `docker` | Docker preset | DinD + DOoD узлы | Тестирование Docker функциональности | | `performance` | Performance preset | 5 хостов (Debian + RHEL) | Нагрузочное тестирование | | `security` | Security preset | 3 хоста (Debian + RHEL) | Тестирование безопасности | +| `etcd-patroni` | etcd-patroni preset | 3 хоста (Debian + RHEL) | Тестирование кластеров | | `[custom]` | Любой custom preset | Любое количество | Пользовательские сценарии | -## 🔧 Технические детали +### Тестирование с собственными образами -### Исправления в Makefile +```bash +# Проверка наличия собственных образов +make custom-images check -1. **Универсальное определение preset'а**: +# Тестирование с собственными образами +make custom-images test minimal +make custom-images test full +make custom-images test performance +``` + +## 🐳 Docker образы + +> 📖 **Подробная документация:** [dockerfiles/README.md](dockerfiles/README.md) + +### Multi-Arch поддержка + +Система поддерживает сборку для множества архитектур: + +```bash +# Настройка builder'а +make docker setup-builder + +# Сборка всех образов +make docker build + +# Сборка отдельного образа +make docker build-image IMAGE=ubuntu + +# Полная пересборка с очисткой кеша +make docker rebuild +``` + +### Доступные образы + +| Образ | Базовый образ | Описание | +|-------|---------------|----------| +| `ansible-controller` | `ubuntu:22.04` | Ansible контроллер с коллекциями | +| `ubuntu` | `ubuntu:22.04` | Ubuntu с systemd | +| `debian` | `debian:bookworm` | Debian с systemd | +| `rhel` | `registry.access.redhat.com/ubi8/ubi` | RHEL с systemd | +| `centos` | `quay.io/centos/centos:stream9` | CentOS Stream с systemd | +| `alma` | `almalinux:8` | AlmaLinux с systemd | +| `rocky` | `rockylinux:8` | Rocky Linux с systemd | +| `alt-linux` | `altlinux/p9` | ALT Linux с systemd | +| `astra-linux` | `astralinux/astra-1.7` | Astra Linux с systemd | +| `redos` | `redos/redos:9` | RED OS с systemd | + +### Управление образами + +```bash +# Информация об образах +make docker info + +# Отправка в Docker Hub +make docker push + +# Загрузка из Docker Hub +make docker pull + +# Очистка локальных образов +make docker clean + +# Диагностика проблем +make docker diagnose + +# Сброс builder'а +make docker reset-builder +``` + +## 🔐 Управление секретами + +### Ansible Vault + +```bash +# Инициализация vault +make vault init + +# Создание файла секретов +make vault create + +# Редактирование секретов +make vault edit + +# Просмотр секретов +make vault show + +# Удаление файла секретов +make vault delete + +# Шифрование файла +make vault encrypt + +# Расшифровка файла +make vault decrypt + +# Смена пароля +make vault rekey + +# Проверка vault файлов +make vault check + +# Поиск потенциальных секретов +make vault scan +``` + +## 🚀 Развертывание + +### Тестирование (Docker контейнеры) + +```bash +# Тестирование с разными preset'ами +make role test # default preset +make role test minimal # minimal preset +make role test standard # standard preset +make role test performance # performance preset +make role test security # security preset +make role test my-custom-preset # любой custom preset +``` + +**Инвентори для тестирования:** +- **Источник:** Динамически создается из preset файлов (`molecule/presets/*.yml`) +- **Расположение:** `${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini` +- **Содержимое:** Временные контейнеры (u1, u2, u3, docker1, dood1) +- **Сеть:** Docker сеть `labnet` +- **Пользователь:** `ansible` (с sudo правами) + +**Пример динамического инвентори для тестирования:** +```ini +# Автоматически создается из preset файла +[test] +u1 ansible_host=172.20.0.2 ansible_user=ansible ansible_ssh_private_key_file=/tmp/ssh_key +u2 ansible_host=172.20.0.3 ansible_user=ansible ansible_ssh_private_key_file=/tmp/ssh_key + +[web] +u1 +u2 + +[docker] +docker1 ansible_host=172.20.0.4 ansible_user=ansible ansible_ssh_private_key_file=/tmp/ssh_key + +[dood] +dood1 ansible_host=172.20.0.5 ansible_user=ansible ansible_ssh_private_key_file=/tmp/ssh_key +``` + +### Развертывание (Реальные серверы) + +```bash +# Развертывание на реальные серверы +make role deploy # развертывание ролей +``` + +**Инвентори для продакшн развертывания:** +- **Источник:** Статический файл `inventory/hosts.ini` +- **Расположение:** `inventory/hosts.ini` +- **Содержимое:** Реальные серверы с SSH подключением +- **Сеть:** Интернет или внутренняя сеть +- **Пользователь:** `devops` (настраивается в `ansible.cfg`) + +**Пример продакшн инвентори:** +```ini +# inventory/hosts.ini - Реальные серверы +[web_servers] +web1.example.com ansible_host=192.168.1.10 ansible_user=devops +web2.example.com ansible_host=192.168.1.11 ansible_user=devops + +[db_servers] +db1.example.com ansible_host=192.168.1.20 ansible_user=devops +db2.example.com ansible_host=192.168.1.21 ansible_user=devops + +[monitoring] +mon1.example.com ansible_host=192.168.1.30 ansible_user=devops + +[all:vars] +ansible_ssh_private_key_file=~/.ssh/id_rsa +ansible_ssh_common_args='-o StrictHostKeyChecking=no' +``` + +### Различия между тестовым и продакшн инвентори + +| Параметр | Тестовый инвентори | Продакшн инвентори | +|----------|-------------------|-------------------| +| **Источник** | Динамически из preset файлов | Статический файл `inventory/hosts.ini` | +| **Расположение** | `${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini` | `inventory/hosts.ini` | +| **Хосты** | Временные Docker контейнеры | Реальные серверы | +| **Сеть** | Docker сеть `labnet` | Интернет/внутренняя сеть | +| **Пользователь** | `ansible` (в контейнере) | `devops` (на реальных серверах) | +| **SSH ключи** | Автоматически генерируются | Используются существующие | +| **Время жизни** | Временные (удаляются после тестов) | Постоянные | +| **Подключение** | Docker exec | SSH | + +### Настройка продакшн инвентори + +**1. Создание файла `inventory/hosts.ini`:** +```ini +# Продакшн серверы +[web_servers] +web1.example.com ansible_host=192.168.1.10 +web2.example.com ansible_host=192.168.1.11 + +[db_servers] +db1.example.com ansible_host=192.168.1.20 +db2.example.com ansible_host=192.168.1.21 + +[monitoring] +mon1.example.com ansible_host=192.168.1.30 + +# Группы для развертывания +[production:children] +web_servers +db_servers +monitoring + +# Общие переменные +[all:vars] +ansible_user=devops +ansible_ssh_private_key_file=~/.ssh/id_rsa +ansible_ssh_common_args='-o StrictHostKeyChecking=no' +``` + +**2. Настройка SSH ключей:** +```bash +# Генерация SSH ключа (если нет) +ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa + +# Копирование ключа на серверы +ssh-copy-id devops@web1.example.com +ssh-copy-id devops@web2.example.com +ssh-copy-id devops@db1.example.com +``` + +**3. Тестирование подключения:** +```bash +# Проверка подключения к серверам +ansible all -i inventory/hosts.ini -m ping + +# Проверка конкретной группы +ansible web_servers -i inventory/hosts.ini -m ping +``` + +### Особенности развертывания + +**Dry-run проверка:** +```bash +# Проверка без изменений +make role deploy +# Выполняется: ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check +``` + +**Подтверждение развертывания:** ```bash - ARGS="$(filter-out test,$(MAKECMDGOALS))" - PRESET="$$(echo $$ARGS | cut -d' ' -f1)" +# Интерактивное подтверждение +make role deploy +# Запрашивается подтверждение: "Продолжить развертывание? (y/N):" ``` -2. **Проверка существования preset'ов с подробной справкой**: +**Логирование и мониторинг:** ```bash - if [ ! -f "molecule/presets/$$PRESET.yml" ]; then - echo "❌ Ошибка: Пресет '$PRESET' не найден!" - # Показать доступные preset'ы и примеры использования - fi - ``` +# Подробные логи +ANSIBLE_STDOUT_CALLBACK=yaml make role deploy -3. **Динамическая загрузка в Ansible**: - ```yaml - - name: Load preset configuration - include_vars: "{{ preset_file }}" - when: preset_file is file - ignore_errors: true - ``` +# Сохранение логов +make role deploy 2>&1 | tee deployment.log +``` -4. **Поддержка любых preset'ов без изменения Makefile**: - ```makefile - # Динамические цели для всех возможных preset'ов - %: - @true - ``` +## 🔧 Вспомогательные команды -### Fallback значения +### Docker команды -Добавлены fallback значения в `create.yml` и `destroy.yml` для случаев отсутствия preset файлов: +```bash +# Очистка Docker ресурсов +make docker clean + +# Полная очистка Docker (ОСТОРОЖНО!) +make docker purge + +# Обновление всех образов +make docker update +``` + +### Другие команды + +```bash +# Проверка синтаксиса ролей +make role lint + +# Создание секретов +make vault create + +# Полная справка +make help +``` + +## 🏗️ CI/CD интеграция + +> 📖 **Подробное руководство:** [docs/cicd-setup.md](docs/cicd-setup.md) + +### GitHub Actions ```yaml +# .github/workflows/ansible-test.yml +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 +``` + +### Azure DevOps + +```yaml +# azure-pipelines.yml +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 +``` + +### Jenkins + +```groovy +// Jenkinsfile +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!' + } + } +} +``` + +### GitLab CI + +```yaml +# .gitlab-ci.yml +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" +``` + +### Автоматическое тестирование новых ролей + +**При создании новой роли в директории `roles/`:** +1. **Автоматически включается** в lint проверку +2. **Автоматически включается** в тестирование +3. **Автоматически включается** в развертывание +4. **CI/CD пайплайны** автоматически тестируют новую роль + +**Настройка уведомлений:** +```yaml +# .github/workflows/ansible-test.yml +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 + - name: Notify on success + if: success() + run: echo "✅ All tests passed for new role" + - name: Notify on failure + if: failure() + run: echo "❌ Tests failed for new role" +``` + +### Настройка автоматического тестирования новых ролей + +**1. Автоматическое обнаружение новых ролей:** +```yaml +# .github/workflows/ansible-test.yml +name: Ansible Testing +on: [push, pull_request] + +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 + + test-roles: + runs-on: ubuntu-latest + needs: detect-roles + strategy: + matrix: + role: ${{ fromJson(format('["{0}"]', needs.detect-roles.outputs.roles)) }} + steps: + - uses: actions/checkout@v4 + - name: Test role ${{ matrix.role }} + run: | + make role lint + make role test + echo "✅ Role ${{ matrix.role }} tested successfully" +``` + +**2. Автоматическое обновление playbook'ов:** +```bash +#!/bin/bash +# scripts/update-playbooks.sh +# Автоматическое обновление playbook'ов при добавлении новых ролей + +echo "🔍 Обнаружение новых ролей..." + +# Получаем список всех ролей +ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||') + +echo "📋 Найденные роли: $ROLES" + +# Обновляем molecule/default/site.yml +echo "📝 Обновление molecule/default/site.yml..." +cat > molecule/default/site.yml << EOF +--- +# Основной playbook для тестирования +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Тестирование всех ролей + hosts: all + roles: +EOF + +for role in $ROLES; do + echo " - $role" >> molecule/default/site.yml +done + +# Обновляем roles/deploy.yml +echo "📝 Обновление roles/deploy.yml..." +cat > roles/deploy.yml << EOF +--- +# Playbook для развертывания на продакшн серверах +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Развертывание всех ролей + hosts: all + roles: +EOF + +for role in $ROLES; do + echo " - $role" >> roles/deploy.yml +done + +echo "✅ Playbook'и обновлены" +``` + +**3. Автоматическое тестирование в CI/CD:** +```yaml +# .github/workflows/ansible-test.yml +name: Ansible Testing +on: [push, pull_request] + +jobs: + update-playbooks: + runs-on: ubuntu-latest + 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 + + test: + runs-on: ubuntu-latest + needs: update-playbooks + steps: + - uses: actions/checkout@v4 + - name: Run tests + run: make role test +``` + +**4. Настройка уведомлений о новых ролях:** +```yaml +# .github/workflows/ansible-test.yml +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 + - name: Notify on success + if: success() + run: | + echo "✅ All tests passed for new role" + # Отправка уведомления в Slack/Teams + curl -X POST -H 'Content-type: application/json' \ + --data '{"text":"✅ Ansible role tests passed"}' \ + ${{ secrets.SLACK_WEBHOOK_URL }} + - name: Notify on failure + if: failure() + run: | + echo "❌ Tests failed for new role" + # Отправка уведомления в Slack/Teams + curl -X POST -H 'Content-type: application/json' \ + --data '{"text":"❌ Ansible role tests failed"}' \ + ${{ secrets.SLACK_WEBHOOK_URL }} +``` + +**5. Автоматическое создание документации для новых ролей:** +```bash +#!/bin/bash +# scripts/generate-role-docs.sh +# Автоматическое создание документации для новых ролей + +echo "📚 Генерация документации для ролей..." + +# Получаем список всех ролей +ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||') + +for role in $ROLES; do + echo "📝 Генерация документации для роли: $role" + + # Создаем README.md для роли если его нет + if [ ! -f "roles/$role/README.md" ]; then + cat > "roles/$role/README.md" << EOF +# Роль $role + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru + +## Описание + +Роль для настройки и конфигурации $role сервиса. + +## Требования + +- Ansible >= 2.9 +- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux + +## Переменные + +| Переменная | Тип | По умолчанию | Описание | +|------------|-----|--------------|----------| +| \`${role}_enabled\` | boolean | \`true\` | Включить роль | +| \`${role}_packages\` | list | \`[]\` | Пакеты для установки | + +## Примеры использования + +\`\`\`yaml +- name: Настройка $role + hosts: all + roles: + - $role +\`\`\` + +## Tags + +- \`$role\` - выполнение всех задач роли +- \`install\` - установка пакетов +- \`config\` - настройка конфигурации +EOF + fi +done + +echo "✅ Документация сгенерирована" +``` + +**6. Автоматическое тестирование новых ролей в CI/CD:** + ```yaml +# .github/workflows/ansible-test.yml +name: Ansible Testing +on: [push, pull_request] + +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 }} +``` + +**7. Автоматическое создание скриптов:** +```bash +#!/bin/bash +# scripts/create-role-scripts.sh +# Автоматическое создание скриптов для новых ролей + +echo "🔧 Создание скриптов для новых ролей..." + +# Создаем директорию scripts если её нет +mkdir -p scripts + +# Создаем скрипт для обновления playbook'ов +cat > scripts/update-playbooks.sh << 'EOF' +#!/bin/bash +# Автоматическое обновление playbook'ов при добавлении новых ролей + +echo "🔍 Обнаружение новых ролей..." + +# Получаем список всех ролей +ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||') + +echo "📋 Найденные роли: $ROLES" + +# Обновляем molecule/default/site.yml +echo "📝 Обновление molecule/default/site.yml..." +cat > molecule/default/site.yml << EOL +--- +# Основной playbook для тестирования +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Тестирование всех ролей + hosts: all + roles: +EOL + +for role in $ROLES; do + echo " - $role" >> molecule/default/site.yml +done + +# Обновляем roles/deploy.yml +echo "📝 Обновление roles/deploy.yml..." +cat > roles/deploy.yml << EOL +--- +# Playbook для развертывания на продакшн серверах +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Развертывание всех ролей + hosts: all + roles: +EOL + +for role in $ROLES; do + echo " - $role" >> roles/deploy.yml +done + +echo "✅ Playbook'и обновлены" +EOF + +# Создаем скрипт для генерации документации +cat > scripts/generate-role-docs.sh << 'EOF' +#!/bin/bash +# Автоматическое создание документации для новых ролей + +echo "📚 Генерация документации для ролей..." + +# Получаем список всех ролей +ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||') + +for role in $ROLES; do + echo "📝 Генерация документации для роли: $role" + + # Создаем README.md для роли если его нет + if [ ! -f "roles/$role/README.md" ]; then + cat > "roles/$role/README.md" << EOL +# Роль $role + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru + +## Описание + +Роль для настройки и конфигурации $role сервиса. + +## Требования + +- Ansible >= 2.9 +- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux + +## Переменные + +| Переменная | Тип | По умолчанию | Описание | +|------------|-----|--------------|----------| +| \`${role}_enabled\` | boolean | \`true\` | Включить роль | +| \`${role}_packages\` | list | \`[]\` | Пакеты для установки | + +## Примеры использования + +\`\`\`yaml +- name: Настройка $role + hosts: all + roles: + - $role +\`\`\` + +## Tags + +- \`$role\` - выполнение всех задач роли +- \`install\` - установка пакетов +- \`config\` - настройка конфигурации +EOL + fi +done + +echo "✅ Документация сгенерирована" +EOF + +# Делаем скрипты исполняемыми +chmod +x scripts/update-playbooks.sh +chmod +x scripts/generate-role-docs.sh + +echo "✅ Скрипты созданы" +``` + +## 📊 Мониторинг и диагностика + +> 📖 **Подробное руководство:** [docs/monitoring.md](docs/monitoring.md) + +### Диагностика Docker + +```bash +# Диагностика buildx проблем +make docker diagnose + +# Проверка builder'а +make docker setup-builder + +# Сброс builder'а при проблемах +make docker reset-builder +``` + +### Логи и отчеты + +```bash +# Просмотр логов контейнера +docker logs ansible-controller + +# Вход в контейнер для отладки +docker exec -it ansible-controller bash +``` + +## 🛠️ Разработка + +> 📖 **Подробное руководство:** [docs/creating-roles.md](docs/creating-roles.md) + +### Создание новых preset'ов + +1. Создайте файл `molecule/presets/my-preset.yml`: + +```yaml +#description: Мой кастомный preset +docker_network: labnet +generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini" + +images: + ubuntu: "inecs/ansible-lab:ubuntu-latest" + rhel: "inecs/ansible-lab:rhel-latest" + +hosts: + - name: web1 + family: ubuntu + groups: [web, frontend] + - name: db1 + family: rhel + groups: [database, backend] +``` + +2. Используйте preset: + +```bash +make role test my-preset +``` + +### Создание новых ролей + +#### 1. Создание структуры роли + +```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 +``` + +#### 2. Структура файлов роли + +**`roles/my-role/tasks/main.yml`** - основные задачи: +```yaml +--- +# Основные задачи для роли my-role +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Установка пакетов + package: + name: "{{ my_role_packages }}" + state: present + when: my_role_install_packages | default(true) + tags: + - my-role + - install + +- name: Настройка конфигурации + template: + src: my-role.conf.j2 + dest: /etc/my-role/my-role.conf + owner: root + group: root + mode: '0644' + notify: restart my-role + tags: + - my-role + - config +``` + +**`roles/my-role/defaults/main.yml`** - переменные по умолчанию: +```yaml +--- +# Переменные по умолчанию для роли my-role +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +# Основные настройки +my_role_enabled: true +my_role_install_packages: true +my_role_packages: + - nginx + - curl + +# Конфигурация +my_role_config_file: /etc/my-role/my-role.conf +my_role_log_level: info +``` + +**`roles/my-role/handlers/main.yml`** - обработчики: +```yaml +--- +# Обработчики для роли my-role +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: restart my-role + service: + name: "{{ my_role_service_name | default('my-role') }}" + state: restarted + when: my_role_enabled | default(true) +``` + +**`roles/my-role/meta/main.yml`** - метаданные роли: +```yaml +--- +# Метаданные роли my-role +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +galaxy_info: + author: Сергей Антропов + description: Моя кастомная роль для AnsibleTemplate + 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 + galaxy_tags: + - system + - configuration + - my-role + +dependencies: [] +``` + +**`roles/my-role/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_packages` | list | `['nginx', 'curl']` | Пакеты для установки | +| `my_role_log_level` | string | `info` | Уровень логирования | + +## Примеры использования + +```yaml +- name: Настройка my-role + hosts: all + roles: + - my-role +``` + +## Tags + +- `my-role` - выполнение всех задач роли +- `install` - установка пакетов +- `config` - настройка конфигурации +``` + +#### 3. Регистрация роли для проверок + +**Автоматическая регистрация:** Роль автоматически будет проверена при выполнении: +```bash +# Lint проверка всех ролей в директории roles/ +make role lint + +# Тестирование всех ролей +make role test +``` + +**Как это работает:** +1. **Lint проверка:** `ansible-lint roles/` автоматически находит все роли в директории `roles/` +2. **Тестирование:** `molecule/default/site.yml` автоматически включает все роли из `roles/` +3. **Развертывание:** `roles/deploy.yml` автоматически включает все роли из `roles/` + +**Ручная проверка конкретной роли:** +```bash +# Lint проверка конкретной роли +ansible-lint roles/my-role/ + +# Тестирование конкретной роли +cd roles/my-role +molecule test +``` + +**Автоматическое включение ролей в playbook'и:** + +**В `molecule/default/site.yml` (для тестирования):** +```yaml +--- +# Автоматически включает все роли из директории roles/ +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Тестирование всех ролей + hosts: all + roles: + - ping # Автоматически включается + - my-role # Автоматически включается + # Добавьте сюда новые роли по мере их создания +``` + +**В `roles/deploy.yml` (для продакшн развертывания):** +```yaml +--- +# Автоматически включает все роли из директории roles/ +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Развертывание всех ролей + hosts: all + roles: + - ping # Автоматически включается + - my-role # Автоматически включается + # Добавьте сюда новые роли по мере их создания +``` + +#### 4. Интеграция с основным playbook + +**Обновление `molecule/default/site.yml`:** +```yaml +--- +# Основной playbook для тестирования +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Тестирование роли ping + hosts: all + roles: + - ping + +- name: Тестирование роли my-role + hosts: all + roles: + - my-role vars: - # Fallback значения если preset.yml не найден + my_role_enabled: true + my_role_packages: + - nginx + - curl +``` + +**Обновление `roles/deploy.yml`:** +```yaml +--- +# Playbook для развертывания на продакшн серверах +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Развертывание роли ping + hosts: all + roles: + - ping + +- name: Развертывание роли my-role + hosts: all + roles: + - my-role + vars: + my_role_enabled: true + my_role_packages: + - nginx + - curl +``` + +#### 5. Настройка переменных для разных окружений + +**Переменные для тестирования (в preset файлах):** +```yaml +# molecule/presets/my-custom-preset.yml +--- +#description: Кастомный preset для тестирования my-role docker_network: labnet generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini" - # ... остальные значения + +# Переменные для тестирования +my_role_enabled: true +my_role_packages: + - nginx + - curl +my_role_log_level: debug +my_role_test_mode: true + +hosts: + - name: u1 + family: debian + groups: [test] ``` -## 🐳 Docker поддержка +**Переменные для продакшн (в group_vars):** +```yaml +# inventory/group_vars/all.yml +--- +# Общие переменные для всех серверов +my_role_enabled: true +my_role_packages: + - nginx + - curl + - htop +my_role_log_level: info +my_role_test_mode: false -### Упрощенная архитектура +# Продакшн настройки +my_role_production: true +my_role_backup_enabled: true +``` -Docker-compose удален из проекта, так как он избыточен при наличии универсальной системы preset'ов. Все тестирование происходит через preset систему: +**Переменные для конкретных групп:** +```yaml +# inventory/group_vars/web_servers.yml +--- +# Переменные для web серверов +my_role_web_config: true +my_role_nginx_config: | + server { + listen 80; + server_name example.com; + location / { + proxy_pass http://backend; + } + } +``` + +**Переменные для конкретных хостов:** +```yaml +# inventory/host_vars/web1.example.com.yml +--- +# Переменные для конкретного хоста +my_role_hostname: web1 +my_role_domain: example.com +my_role_ssl_enabled: true +``` + +#### 6. Тестирование новой роли ```bash -# Основное тестирование через preset систему -make role test [любой_preset] # универсальное тестирование -make role presets # показать доступные preset'ы +# 1. Lint проверка +make role lint -# Очистка Docker ресурсов -make docker clean # очистить Docker ресурсы +# 2. Тестирование с default preset +make role test + +# 3. Тестирование с custom preset +make role test my-custom-preset + +# 4. Тестирование на реальных серверах (dry-run) +make role deploy ``` -**Преимущества упрощенной архитектуры:** -- ✅ **Простота**: Один способ тестирования через preset систему -- ✅ **Универсальность**: Любой preset без дополнительной конфигурации -- ✅ **Автономность**: Preset система сама управляет контейнерами -- ✅ **Меньше сложности**: Нет дублирования функциональности - -## 📝 Переменные окружения - -Скопируйте `env.example` в `.env` и настройте под свои нужды: +#### 7. Полный цикл разработки роли ```bash -cp env.example .env +# 1. Создание роли +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 + +# 2. Разработка роли +# ... редактирование файлов роли ... + +# 3. Lint проверка +make role lint + +# 4. Тестирование в Docker +make role test minimal + +# 5. Тестирование с custom preset +make role test my-custom-preset + +# 6. Тестирование на реальных серверах (dry-run) +make role deploy + +# 7. Развертывание на продакшн +make role deploy +# Подтвердить развертывание: y ``` -## 🎯 Результат +#### 8. Автоматическое обновление playbook'ов -Теперь система тестирования работает корректно: +**Добавьте в Makefile команду для автоматического обновления:** +```makefile +# Автоматическое обновление playbook'ов +update-playbooks: + @echo "🔍 Обнаружение новых ролей..." + @ROLES=$$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' '); \ + echo "📋 Найденные роли: $$ROLES"; \ + echo "📝 Обновление molecule/default/site.yml..."; \ + echo "---" > molecule/default/site.yml; \ + echo "# Основной playbook для тестирования" >> molecule/default/site.yml; \ + echo "# Автор: Сергей Антропов" >> molecule/default/site.yml; \ + echo "# Сайт: https://devops.org.ru" >> molecule/default/site.yml; \ + echo "" >> molecule/default/site.yml; \ + echo "- name: Тестирование всех ролей" >> molecule/default/site.yml; \ + echo " hosts: all" >> molecule/default/site.yml; \ + echo " roles:" >> molecule/default/site.yml; \ + for role in $$ROLES; do \ + echo " - $$role" >> molecule/default/site.yml; \ + done; \ + echo "📝 Обновление roles/deploy.yml..."; \ + echo "---" > roles/deploy.yml; \ + echo "# Playbook для развертывания на продакшн серверах" >> roles/deploy.yml; \ + echo "# Автор: Сергей Антропов" >> roles/deploy.yml; \ + echo "# Сайт: https://devops.org.ru" >> roles/deploy.yml; \ + echo "" >> roles/deploy.yml; \ + echo "- name: Развертывание всех ролей" >> roles/deploy.yml; \ + echo " hosts: all" >> roles/deploy.yml; \ + echo " roles:" >> roles/deploy.yml; \ + for role in $$ROLES; do \ + echo " - $$role" >> roles/deploy.yml; \ + done; \ + echo "✅ Playbook'и обновлены" +``` -1. ✅ **Полностью универсальная система preset'ов - любой preset без изменения Makefile** -2. ✅ **Динамическое определение preset'ов через `filter-out` и `cut`** -3. ✅ **Проверка существования preset'ов с подробной справкой** -4. ✅ **Унифицированные имена контейнеров** -5. ✅ **Надежные fallback значения** -6. ✅ **Упрощенная архитектура без docker-compose** -7. ✅ **Поддержка неограниченного количества custom preset'ов** -8. ✅ **Автономная preset система сама управляет контейнерами** -9. ✅ **Подробная документация и справка** +**Использование:** +```bash +# Автоматическое обновление playbook'ов +make update-playbooks + +# Проверка обновленных playbook'ов +make role test +``` + +#### 9. Автоматическое создание документации + +**Добавьте в Makefile команду для создания документации:** +```makefile +# Автоматическое создание документации для ролей +generate-docs: + @echo "📚 Генерация документации для ролей..." + @ROLES=$$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||'); \ + for role in $$ROLES; do \ + echo "📝 Генерация документации для роли: $$role"; \ + if [ ! -f "roles/$$role/README.md" ]; then \ + echo "# Роль $$role" > "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "**Автор:** Сергей Антропов" >> "roles/$$role/README.md"; \ + echo "**Сайт:** https://devops.org.ru" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "## Описание" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "Роль для настройки и конфигурации $$role сервиса." >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "## Требования" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "- Ansible >= 2.9" >> "roles/$$role/README.md"; \ + echo "- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "## Переменные" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "| Переменная | Тип | По умолчанию | Описание |" >> "roles/$$role/README.md"; \ + echo "|------------|-----|--------------|----------|" >> "roles/$$role/README.md"; \ + echo "| \`$${role}_enabled\` | boolean | \`true\` | Включить роль |" >> "roles/$$role/README.md"; \ + echo "| \`$${role}_packages\` | list | \`[]\` | Пакеты для установки |" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "## Примеры использования" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "\`\`\`yaml" >> "roles/$$role/README.md"; \ + echo "- name: Настройка $$role" >> "roles/$$role/README.md"; \ + echo " hosts: all" >> "roles/$$role/README.md"; \ + echo " roles:" >> "roles/$$role/README.md"; \ + echo " - $$role" >> "roles/$$role/README.md"; \ + echo "\`\`\`" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "## Tags" >> "roles/$$role/README.md"; \ + echo "" >> "roles/$$role/README.md"; \ + echo "- \`$$role\` - выполнение всех задач роли" >> "roles/$$role/README.md"; \ + echo "- \`install\` - установка пакетов" >> "roles/$$role/README.md"; \ + echo "- \`config\` - настройка конфигурации" >> "roles/$$role/README.md"; \ + fi; \ + done; \ + echo "✅ Документация сгенерирована" +``` + +**Использование:** +```bash +# Автоматическое создание документации +make generate-docs + +# Проверка созданной документации +ls -la roles/*/README.md +``` + +#### 10. Полный цикл с автоматизацией + +```bash +# 1. Создание роли +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 + +# 2. Автоматическое создание документации +make generate-docs + +# 3. Автоматическое обновление playbook'ов +make update-playbooks + +# 4. Lint проверка +make role lint + +# 5. Тестирование в Docker +make role test minimal + +# 6. Тестирование с custom preset +make role test my-custom-preset + +# 7. Тестирование на реальных серверах (dry-run) +make role deploy + +# 8. Развертывание на продакшн +make role deploy +# Подтвердить развертывание: y +``` + +## 🔧 Конфигурация + +### Переменные окружения + +Скопируйте `env.example` в `.env` и настройте: + +```bash +# Основные настройки +PROJECT_NAME=ansible-template +VERSION=2.0.0 +AUTHOR="Сергей Антропов" +SITE="https://devops.org.ru" + +# Docker настройки +DOCKER_IMAGE=inecs/ansible-lab:ansible-controller-latest +DOCKER_REGISTRY=inecs/ansible-lab +DOCKER_VERSION=latest + +# Multi-arch настройки +DOCKER_PLATFORMS=linux/amd64,linux/arm64 +DOCKER_BUILDX_BUILDER=multiarch-builder +``` + +### Ansible конфигурация + +```ini +# ansible.cfg +[defaults] +inventory = inventory/hosts.ini +remote_user = devops +host_key_checking = False +enable_plugins = yaml, ini +roles_path = roles/ +interpreter_python = auto + +# Настройки для тестирования +[test] +inventory = molecule/default/inventory/hosts.ini +remote_user = ansible +host_key_checking = False + +# Настройки для продакшн +[production] +inventory = inventory/hosts.ini +remote_user = devops +host_key_checking = False +``` + +### Настройка переменных для разных окружений + +**Структура переменных:** +``` +inventory/ +├── hosts.ini # Основной инвентори +├── group_vars/ # Переменные для групп +│ ├── all.yml # Общие переменные +│ ├── web_servers.yml # Переменные для web серверов +│ ├── db_servers.yml # Переменные для db серверов +│ └── monitoring.yml # Переменные для мониторинга +├── host_vars/ # Переменные для конкретных хостов +│ ├── web1.example.com.yml # Переменные для web1 +│ ├── web2.example.com.yml # Переменные для web2 +│ └── db1.example.com.yml # Переменные для db1 +└── vault/ # Зашифрованные переменные + ├── secrets.yml # Секреты + └── passwords.yml # Пароли +``` + +**Примеры переменных:** + +**`inventory/group_vars/all.yml`** - общие переменные: +```yaml +--- +# Общие переменные для всех серверов +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +# Основные настройки +ansible_user: devops +ansible_ssh_private_key_file: ~/.ssh/id_rsa +ansible_ssh_common_args: '-o StrictHostKeyChecking=no' + +# Переменные для ролей +ping_host: yandex.ru +ping_count: 5 + +# Продакшн настройки +production_mode: true +backup_enabled: true +monitoring_enabled: true +``` + +**`inventory/group_vars/web_servers.yml`** - переменные для web серверов: +```yaml +--- +# Переменные для web серверов +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +# Web настройки +nginx_enabled: true +nginx_ssl_enabled: true +nginx_domains: + - example.com + - www.example.com + +# Переменные для ролей +my_role_web_config: true +my_role_nginx_config: | + server { + listen 80; + server_name example.com; + location / { + proxy_pass http://backend; + } + } +``` + +**`inventory/host_vars/web1.example.com.yml`** - переменные для конкретного хоста: +```yaml +--- +# Переменные для web1.example.com +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +# Хост-специфичные настройки +hostname: web1 +domain: example.com +ssl_certificate: /etc/ssl/certs/web1.crt +ssl_private_key: /etc/ssl/private/web1.key + +# Переменные для ролей +my_role_hostname: web1 +my_role_domain: example.com +my_role_ssl_enabled: true +``` + +**`inventory/vault/secrets.yml`** - зашифрованные секреты: +```yaml +--- +# Зашифрованные секреты +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +# Секреты для ролей +my_role_api_key: "{{ vault_my_role_api_key }}" +my_role_database_password: "{{ vault_my_role_database_password }}" +my_role_ssl_certificate: "{{ vault_my_role_ssl_certificate }}" +``` + +### Использование переменных в ролях + +**В `roles/my-role/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: Настройка конфигурации + template: + src: my-role.conf.j2 + dest: "{{ my_role_config_file | default('/etc/my-role/my-role.conf') }}" + owner: root + group: root + mode: '0644' + notify: restart my-role + tags: + - my-role + - config + +- name: Настройка SSL сертификата + copy: + content: "{{ my_role_ssl_certificate }}" + dest: /etc/ssl/certs/my-role.crt + owner: root + group: root + mode: '0644' + when: my_role_ssl_enabled | default(false) + tags: + - my-role + - ssl +``` + +**В `roles/my-role/templates/my-role.conf.j2`:** +```jinja2 +# Конфигурация my-role +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +[main] +enabled = {{ my_role_enabled | default(true) }} +log_level = {{ my_role_log_level | default('info') }} +hostname = {{ my_role_hostname | default(ansible_hostname) }} +domain = {{ my_role_domain | default('localhost') }} + +{% if my_role_ssl_enabled | default(false) %} +[ssl] +enabled = true +certificate = /etc/ssl/certs/my-role.crt +private_key = /etc/ssl/private/my-role.key +{% endif %} + +{% if my_role_web_config | default(false) %} +[web] +enabled = true +{% raw %} +{{ my_role_nginx_config }} +{% endraw %} +{% endif %} +``` + +## 🐛 Troubleshooting + +### Проблемы с Docker + +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. **Preset не найден:** + ```bash + make presets list + # Проверьте наличие файла molecule/presets/your-preset.yml + ``` + +2. **Контейнеры не создаются:** + ```bash + make docker clean + make role test + ``` + +3. **Проблемы с systemd:** + ```bash + # Проверьте, что образы поддерживают systemd + make custom-images check + ``` + +## 📈 Производительность + +### Оптимизация сборки + +```bash +# Использование кеша Docker +make docker build + +# Очистка кеша при проблемах +make docker rebuild +``` + +### Оптимизация тестирования + +```bash +# Использование minimal preset для быстрого тестирования +make role test minimal + +# Использование performance preset для нагрузочного тестирования +make role test performance +``` + +## 🤝 Вклад в проект + +1. Fork репозитория +2. Создайте feature branch (`git checkout -b feature/amazing-feature`) +3. Commit изменения (`git commit -m 'Add amazing feature'`) +4. Push в branch (`git push origin feature/amazing-feature`) +5. Создайте Pull Request + +## 📄 Лицензия + +MIT License - см. файл [LICENSE](LICENSE) ## 📞 Поддержка @@ -217,8 +2078,51 @@ cp env.example .env 2. Убедитесь, что все preset файлы существуют 3. Используйте `make help` для справки 4. Проверьте логи: `make docker shell` и `docker logs ansible-controller` +5. Выполните диагностику: `make docker diagnose` + +## 🎯 Результат + +Система тестирования теперь работает корректно: + +1. ✅ **Полностью универсальная система preset'ов - любой preset без изменения Makefile** +2. ✅ **Multi-arch поддержка для всех образов (amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6)** +3. ✅ **Динамическое определение preset'ов через `filter-out` и `cut`** +4. ✅ **Проверка существования preset'ов с подробной справкой** +5. ✅ **Унифицированные имена контейнеров** +6. ✅ **Надежные fallback значения** +7. ✅ **Поддержка неограниченного количества custom preset'ов** +8. ✅ **Автономная preset система сама управляет контейнерами** +9. ✅ **Подробная документация и справка** +10. ✅ **CI/CD интеграция с GitHub Actions, Azure DevOps, Jenkins, GitLab CI** +11. ✅ **Ansible Vault интеграция с автоматическим управлением секретами** +12. ✅ **Собственные Docker образы для различных ОС** +13. ✅ **Systemd поддержка в контейнерах** +14. ✅ **DinD/DOoD поддержка для Docker функциональности** + +## 📚 Навигация по документации + +### 🚀 Для начинающих +1. **[docs/getting-started.md](docs/getting-started.md)** - Установка и первое тестирование +2. **[dockerfiles/README.md](dockerfiles/README.md)** - Изучение Docker образов +3. **[docs/creating-roles.md](docs/creating-roles.md)** - Создание первой роли + +### 🛠️ Для разработчиков +1. **[docs/creating-roles.md](docs/creating-roles.md)** - Полное руководство по созданию ролей +2. **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD +3. **[docs/monitoring.md](docs/monitoring.md)** - Мониторинг и диагностика + +### 🏗️ Для DevOps +1. **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD для всех платформ +2. **[docs/monitoring.md](docs/monitoring.md)** - Мониторинг и troubleshooting +3. **[dockerfiles/README.md](dockerfiles/README.md)** - Управление Docker образами + +### 📖 Дополнительные ресурсы +- **Makefile** - Все доступные команды +- **ansible.cfg** - Конфигурация Ansible +- **requirements.yml** - Ansible коллекции +- **molecule/presets/** - Готовые preset'ы для тестирования --- **Автор:** Сергей Антропов -**Сайт:** https://devops.org.ru +**Сайт:** https://devops.org.ru \ No newline at end of file diff --git a/deploy.yml b/deploy.yml deleted file mode 100644 index 423cbfb..0000000 --- a/deploy.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -# Плейбук для развертывания ролей -# Автор: Сергей Антропов -# Сайт: https://devops.org.ru - -- name: Test ping role - hosts: all - become: false - roles: - - ping - tags: - - ping - - test diff --git a/dockerfiles/README.md b/dockerfiles/README.md index 6364619..400b3d7 100644 --- a/dockerfiles/README.md +++ b/dockerfiles/README.md @@ -1,10 +1,14 @@ -# Docker образы для универсальной системы тестирования +# Docker образы для универсальной системы тестирования AnsibleTemplate -## Обзор +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru +**Версия:** 2.0.0 -Эта директория содержит Docker образы для различных операционных систем и компонентов, используемых в универсальной системе тестирования Ansible ролей. +## 🐳 Обзор -## Структура +Эта директория содержит Docker образы для различных операционных систем и компонентов, используемых в универсальной системе тестирования Ansible ролей. Все образы поддерживают multi-arch сборку (amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6) и автоматически публикуются в Docker Hub. + +## 📁 Структура ``` dockerfiles/ @@ -12,150 +16,667 @@ dockerfiles/ ├── alt-linux/ # ALT Linux с systemd ├── astra-linux/ # Astra Linux с systemd ├── redos/ # RED OS с systemd -├── Makefile # Команды для сборки образов -└── README.md # Документация +├── rhel/ # Red Hat Enterprise Linux с systemd +├── centos/ # CentOS Stream с systemd +├── alma/ # AlmaLinux с systemd +├── rocky/ # Rocky Linux с systemd +├── ubuntu/ # Ubuntu с systemd +├── debian/ # Debian с systemd +└── README.md # Документация ``` -## Доступные образы +## 🚀 Доступные образы -### ansible-controller -- **Базовый образ:** `quay.io/ansible/creator-ee:latest` -- **Описание:** Ansible контроллер с предустановленными коллекциями -- **Компоненты:** - - Ansible с коллекциями (community.docker, community.general, ansible.posix) - - Docker CLI - - kubectl - - Helm - - Kind - - Istio CLI - - Дополнительные роли (geerlingguy.docker, geerlingguy.kubernetes) +### 1. ansible-controller -### alt-linux -- **Базовый образ:** `altlinux/p9` -- **Описание:** ALT Linux с systemd -- **Компоненты:** - - systemd - - Docker - - Docker Compose - - Python3 - - Пользователь ansible +**Базовый образ:** `ubuntu:22.04` +**Тег:** `inecs/ansible-lab:ansible-controller-latest` +**Описание:** Ansible контроллер с предустановленными коллекциями и инструментами -### astra-linux -- **Базовый образ:** `astralinux/astra-1.7` -- **Описание:** Astra Linux с systemd -- **Компоненты:** - - systemd - - Docker - - Docker Compose - - Python3 - - Пользователь ansible +#### Компоненты: +- **Ansible Core** с последними коллекциями +- **Docker CLI** для работы с контейнерами +- **kubectl** для управления Kubernetes +- **Helm** для управления пакетами Kubernetes +- **Kind** для локального Kubernetes +- **yq** для работы с YAML +- **jq** для работы с JSON -### redos -- **Базовый образ:** `redos/redos:9` -- **Описание:** RED OS с systemd -- **Компоненты:** - - systemd - - Docker - - Docker Compose - - Python3 - - Пользователь ansible +#### Предустановленные коллекции: +```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:22.04` +**Тег:** `inecs/ansible-lab:ubuntu-latest` +**Описание:** Ubuntu 22.04 LTS с systemd и Docker + +#### Компоненты: +- **Ubuntu 22.04 LTS** (Jammy Jellyfish) +- **systemd** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano htop tree jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки systemd: +```bash +systemctl set-default multi-user.target +``` + +#### Использование: +```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:ubuntu-latest + +# Подключение к контейнеру +docker exec -it ubuntu-test bash +``` + +### 3. debian + +**Базовый образ:** `debian:bookworm` +**Тег:** `inecs/ansible-lab:debian-latest` +**Описание:** Debian 12 (Bookworm) с systemd и Docker + +#### Компоненты: +- **Debian 12** (Bookworm) +- **systemd** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano htop tree jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки systemd: +```bash +systemctl set-default multi-user.target +``` + +#### Использование: +```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:debian-latest +``` + +### 4. rhel + +**Базовый образ:** `registry.access.redhat.com/ubi8/ubi` +**Тег:** `inecs/ansible-lab:rhel-latest` +**Описание:** Red Hat Enterprise Linux 8 с systemd и Docker + +#### Компоненты: +- **RHEL 8** (Universal Base Image) +- **systemd** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки systemd: +```bash +systemctl set-default multi-user.target +``` + +#### Использование: +```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 + +**Базовый образ:** `quay.io/centos/centos:stream9` +**Тег:** `inecs/ansible-lab:centos-latest` +**Описание:** CentOS Stream 9 с systemd и Docker + +#### Компоненты: +- **CentOS Stream 9** +- **systemd** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки 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** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки 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** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки 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** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano htop tree jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки 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** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano htop tree jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки 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** для управления сервисами +- **Docker CE** с Docker Compose +- **Python 3** с pip +- **Пользователь ansible** с sudo правами + +#### Установленные пакеты: +```bash +systemd systemd-sysv dbus +curl wget git vim nano htop tree jq +python3 python3-pip +docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +#### Настройки 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 -make docker-build +# Сборка всех образов (multi-arch) +make docker build + +# Сборка конкретного образа +make docker build-image IMAGE=ubuntu + +# Полная пересборка с очисткой кеша +make docker rebuild ``` -### Сборка конкретного образа -```bash -make docker-build IMAGE=ansible-controller -``` +### Отправка в Docker Hub -### Отправка образов в registry ```bash -make docker-push +# Отправка всех образов +make docker push + +# Загрузка всех образов +make docker pull ``` ### Очистка образов + ```bash -make docker-clean +# Очистка локальных образов +make docker clean + +# Полная очистка Docker +make docker purge ``` ### Информация об образах -```bash -make docker-info -``` - -## Настройка registry - -По умолчанию образы собираются с тегом `localhost:5000/имя:latest`. Для изменения registry: ```bash -make docker-build REGISTRY=my-registry.com -make docker-push REGISTRY=my-registry.com +# Информация о собранных образах +make docker info + +# Диагностика проблем +make docker diagnose ``` -## Использование в preset'ах +## 🏗️ Multi-Arch поддержка -После сборки образов их можно использовать в preset'ах: +### Поддерживаемые архитектуры + +| Архитектура | Описание | Статус | +|-------------|----------|--------| +| `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/my-preset.yml +# molecule/presets/custom-images.yml +--- +#description: Preset с собственными образами AnsibleTemplate +docker_network: labnet +generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini" + +# Собственные образы images: - debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy" - rhel: "quay.io/centos/centos:stream9-systemd" - alt: "localhost:5000/alt-linux:latest" - astra: "localhost:5000/astra-linux:latest" - redos: "localhost:5000/redos:latest" + 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: alt-server + - 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: [servers] - - name: astra-server + groups: [security] + - name: astra1 family: astra - groups: [servers] - - name: redos-server + groups: [security] + - name: redos1 family: redos - groups: [servers] + groups: [security] ``` -## Лучшие практики +### Тестирование с собственными образами -### 1. Версионирование образов ```bash -make docker-build VERSION=v1.0.0 +# Тестирование с собственными образами +make custom-images test full + +# Проверка наличия образов +make custom-images check + +# Сборка всех образов +make custom-images build ``` -### 2. Использование registry +## 📊 Мониторинг и диагностика + +### Проверка образов + ```bash -make docker-push REGISTRY=my-registry.com VERSION=v1.0.0 +# Проверка размера образов +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 ``` -### 3. Очистка старых образов +### Логи сборки + ```bash -make docker-clean +# Подробные логи сборки +make docker build 2>&1 | tee build.log + +# Логи конкретного образа +make docker build-image IMAGE=ubuntu 2>&1 | tee ubuntu-build.log ``` -## Troubleshooting +## 🐛 Troubleshooting ### Проблемы с сборкой -1. Проверьте доступность базовых образов -2. Убедитесь, что Docker запущен -3. Проверьте права доступа к Docker -### Проблемы с registry -1. Убедитесь, что registry доступен -2. Проверьте аутентификацию -3. Проверьте права на push +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. Проверьте размер образов -2. Убедитесь, что все зависимости установлены -3. Проверьте совместимость с базовыми образами -## Заключение +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 + ``` -Эти Docker образы предоставляют готовую среду для тестирования Ansible ролей на различных операционных системах. Используйте их в своих preset'ах для создания универсальной системы тестирования. +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 \ No newline at end of file diff --git a/docs/cicd-setup.md b/docs/cicd-setup.md new file mode 100644 index 0000000..ce8df24 --- /dev/null +++ b/docs/cicd-setup.md @@ -0,0 +1,913 @@ +# Настройка CI/CD для AnsibleTemplate + +**Автор:** Сергей Антропов +**Сайт:** 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 для AnsibleTemplate..." + +# Создание директории .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 diff --git a/docs/creating-roles.md b/docs/creating-roles.md new file mode 100644 index 0000000..a96e492 --- /dev/null +++ b/docs/creating-roles.md @@ -0,0 +1,571 @@ +# Создание и разработка ролей + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru + +## 📁 Структура роли + +### Стандартная структура + +``` +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 +# Создание директории роли +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 +``` + +## 📝 Разработка роли + +### 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: Моя кастомная роль для AnsibleTemplate + 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 +``` + +## 🚀 Полный цикл разработки + +### 1. Создание роли + +```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 +``` + +### 2. Разработка + +```bash +# Редактирование файлов роли +nano roles/my-role/tasks/main.yml +nano roles/my-role/defaults/main.yml +# ... остальные файлы +``` + +### 3. Тестирование + +```bash +# Lint проверка +make role lint + +# Тестирование в Docker +make role test minimal + +# Тестирование с custom preset +make role test my-custom-preset +``` + +### 4. Развертывание + +```bash +# Тестирование на реальных серверах +make role deploy + +# Развертывание на продакшн +make role deploy +# Подтвердить развертывание: y +``` + +## 🔧 Лучшие практики + +### 1. Структура кода + +- **Используйте теги** для группировки задач +- **Добавляйте условия** для условного выполнения +- **Используйте обработчики** для перезапуска сервисов +- **Документируйте переменные** в defaults/main.yml + +### 2. Безопасность + +- **Используйте vault** для секретов +- **Проверяйте права** пользователей +- **Настраивайте файрвол** при необходимости +- **Используйте SSL** для защищенных соединений + +### 3. Производительность + +- **Используйте кеширование** для повторных операций +- **Оптимизируйте пакеты** для уменьшения размера +- **Используйте параллельное выполнение** где возможно +- **Мониторьте ресурсы** системы + +--- + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000..117e2dd --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,291 @@ +# Быстрый старт с AnsibleTemplate + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru + +## 🚀 Установка и настройка + +### 1. Клонирование репозитория + +```bash +git clone https://github.com/your-username/AnsibleTemplate.git +cd AnsibleTemplate +``` + +### 2. Настройка переменных окружения + +```bash +# Копирование файла переменных +cp env.example .env + +# Редактирование переменных +nano .env +``` + +### 3. Настройка Docker + +```bash +# Настройка multi-arch builder +make docker setup-builder + +# Сборка всех образов +make docker build + +# Проверка собранных образов +make docker info +``` + +## 🧪 Первое тестирование + +### 1. Просмотр доступных preset'ов + +```bash +# Список всех preset'ов +make presets list + +# Информация о конкретном preset'е +make presets info PRESET=default +``` + +### 2. Тестирование роли ping + +```bash +# Тестирование с default preset +make role test + +# Тестирование с minimal preset +make role test minimal +``` + +### 3. Проверка результатов + +```bash +# Просмотр логов +docker logs ansible-controller + +# Вход в контейнер для отладки +docker exec -it ansible-controller bash +``` + +## 🔧 Создание первой роли + +### 1. Создание структуры роли + +```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 +``` + +### 2. Разработка роли + +**`roles/my-role/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: Настройка конфигурации + template: + src: my-role.conf.j2 + dest: /etc/my-role/my-role.conf + owner: root + group: root + mode: '0644' + notify: restart my-role + tags: + - my-role + - config +``` + +**`roles/my-role/defaults/main.yml`:** +```yaml +--- +# Переменные по умолчанию для роли my-role +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +# Основные настройки +my_role_enabled: true +my_role_packages: + - nginx + - curl + +# Конфигурация +my_role_config_file: /etc/my-role/my-role.conf +my_role_log_level: info +``` + +### 3. Тестирование роли + +```bash +# Lint проверка +make role lint + +# Тестирование в Docker +make role test minimal + +# Тестирование с custom preset +make role test my-custom-preset +``` + +## 🚀 Развертывание на продакшн + +### 1. Настройка инвентори + +**`inventory/hosts.ini`:** +```ini +# Продакшн серверы +[web_servers] +web1.example.com ansible_host=192.168.1.10 +web2.example.com ansible_host=192.168.1.11 + +[db_servers] +db1.example.com ansible_host=192.168.1.20 +db2.example.com ansible_host=192.168.1.21 + +[all:vars] +ansible_user=devops +ansible_ssh_private_key_file=~/.ssh/id_rsa +ansible_ssh_common_args='-o StrictHostKeyChecking=no' +``` + +### 2. Настройка SSH ключей + +```bash +# Генерация SSH ключа +ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa + +# Копирование ключа на серверы +ssh-copy-id devops@web1.example.com +ssh-copy-id devops@web2.example.com +``` + +### 3. Тестирование подключения + +```bash +# Проверка подключения +ansible all -i inventory/hosts.ini -m ping + +# Dry-run развертывания +make role deploy +``` + +### 4. Развертывание + +```bash +# Развертывание на продакшн +make role deploy +# Подтвердить развертывание: y +``` + +## 🔐 Управление секретами + +### 1. Инициализация vault + +```bash +# Создание файла пароля +make vault init + +# Создание файла секретов +make vault create +``` + +### 2. Работа с секретами + +```bash +# Редактирование секретов +make vault edit + +# Просмотр секретов +make vault show + +# Шифрование файла +make vault encrypt +``` + +## 🏗️ CI/CD интеграция + +### 1. GitHub Actions + +```yaml +# .github/workflows/ansible-test.yml +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 +``` + +### 2. Azure DevOps + +```yaml +# azure-pipelines.yml +trigger: +- main +pool: + vmImage: 'ubuntu-latest' +stages: +- stage: Test + jobs: + - job: TestJob + steps: + - script: make role test +``` + +## 📊 Мониторинг и диагностика + +### 1. Диагностика Docker + +```bash +# Диагностика buildx проблем +make docker diagnose + +# Проверка builder'а +make docker setup-builder + +# Сброс builder'а при проблемах +make docker reset-builder +``` + +### 2. Логи и отчеты + +```bash +# Просмотр логов контейнера +docker logs ansible-controller + +# Вход в контейнер для отладки +docker exec -it ansible-controller bash +``` + +## 🎯 Следующие шаги + +1. **Изучите документацию** по [созданию ролей](creating-roles.md) +2. **Настройте CI/CD** по [инструкции](cicd-setup.md) +3. **Изучите Docker образы** в [dockerfiles/README.md](../dockerfiles/README.md) +4. **Настройте мониторинг** по [руководству](monitoring.md) + +--- + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru diff --git a/docs/molecule-guide.md b/docs/molecule-guide.md new file mode 100644 index 0000000..e503fc3 --- /dev/null +++ b/docs/molecule-guide.md @@ -0,0 +1,859 @@ +# Подробное руководство по файлам Molecule + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru + +## 📋 Обзор + +Molecule - это инструмент для тестирования Ansible ролей в изолированных окружениях. В проекте AnsibleTemplate используется универсальная конфигурация 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 +- **Собственные образы:** AnsibleTemplate создает собственные образы для тестирования + +**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 файлов +- **Образы:** Собственные образы AnsibleTemplate для всех поддерживаемых ОС +- **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` - команды для запуска тестов diff --git a/docs/monitoring.md b/docs/monitoring.md new file mode 100644 index 0000000..830241b --- /dev/null +++ b/docs/monitoring.md @@ -0,0 +1,593 @@ +# Мониторинг и диагностика AnsibleTemplate + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru + +## 🔍 Диагностика Docker + +### Проверка состояния Docker + +```bash +# Проверка статуса Docker +docker info + +# Проверка запущенных контейнеров +docker ps -a + +# Проверка образов +docker images | grep inecs/ansible-lab + +# Проверка сетей +docker network ls +``` + +### Диагностика buildx проблем + +```bash +# Диагностика buildx +make docker diagnose + +# Проверка builder'а +make docker setup-builder + +# Сброс builder'а при проблемах +make docker reset-builder +``` + +### Логи Docker + +```bash +# Логи Docker daemon +sudo journalctl -u docker.service + +# Логи конкретного контейнера +docker logs ansible-controller + +# Логи с временными метками +docker logs -t ansible-controller + +# Следить за логами в реальном времени +docker logs -f ansible-controller +``` + +## 🧪 Диагностика тестирования + +### Проверка preset'ов + +```bash +# Список доступных preset'ов +make presets list + +# Информация о конкретном preset'е +make presets info PRESET=default + +# Проверка файлов preset'ов +ls -la molecule/presets/ +``` + +### Проверка инвентори + +```bash +# Проверка тестового инвентори +cat ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini + +# Проверка продакшн инвентори +cat inventory/hosts.ini + +# Тестирование подключения +ansible all -i inventory/hosts.ini -m ping +``` + +### Логи тестирования + +```bash +# Логи Molecule +ls -la molecule/default/.molecule/ + +# Логи конкретного теста +cat molecule/default/.molecule/test/ansible.log + +# Логи Ansible +cat molecule/default/.molecule/test/ansible.log | grep ERROR +``` + +## 📊 Мониторинг производительности + +### Мониторинг ресурсов + +```bash +# Использование CPU и памяти +docker stats + +# Использование диска +df -h + +# Использование памяти +free -h + +# Процессы Docker +ps aux | grep docker +``` + +### Мониторинг сети + +```bash +# Статистика сети +docker network inspect labnet + +# Подключения к портам +netstat -tulpn | grep docker + +# Проверка DNS +nslookup docker.io +``` + +### Мониторинг логов + +```bash +# Логи системы +sudo journalctl -f + +# Логи Docker +sudo journalctl -u docker.service -f + +# Логи Ansible +tail -f /var/log/ansible.log +``` + +## 🔧 Диагностика ролей + +### Проверка синтаксиса + +```bash +# Lint проверка всех ролей +make role lint + +# Lint проверка конкретной роли +ansible-lint roles/my-role/ + +# Проверка синтаксиса YAML +ansible-playbook --syntax-check roles/my-role/tasks/main.yml +``` + +### Проверка переменных + +```bash +# Проверка переменных роли +ansible-inventory --list -i inventory/hosts.ini + +# Проверка переменных для конкретного хоста +ansible-inventory --host web1.example.com -i inventory/hosts.ini + +# Проверка переменных группы +ansible-inventory --host web_servers -i inventory/hosts.ini +``` + +### Тестирование ролей + +```bash +# Тестирование с verbose выводом +ansible-playbook -i inventory/hosts.ini site.yml -vvv + +# Тестирование конкретной роли +ansible-playbook -i inventory/hosts.ini site.yml --tags my-role + +# Тестирование с dry-run +ansible-playbook -i inventory/hosts.ini site.yml --check +``` + +## 🚨 Алерты и уведомления + +### Настройка алертов + +```bash +#!/bin/bash +# scripts/monitor.sh +# Скрипт мониторинга AnsibleTemplate + +# Проверка Docker +if ! docker info >/dev/null 2>&1; then + echo "❌ Docker не запущен" + # Отправка уведомления + curl -X POST -H 'Content-type: application/json' \ + --data '{"text":"❌ Docker не запущен в AnsibleTemplate"}' \ + $SLACK_WEBHOOK_URL +fi + +# Проверка образов +if ! docker images | grep -q inecs/ansible-lab; then + echo "❌ Образы AnsibleTemplate не найдены" + # Отправка уведомления + curl -X POST -H 'Content-type: application/json' \ + --data '{"text":"❌ Образы AnsibleTemplate не найдены"}' \ + $SLACK_WEBHOOK_URL +fi + +# Проверка preset'ов +if [ ! -d "molecule/presets" ]; then + echo "❌ Директория preset'ов не найдена" + # Отправка уведомления + curl -X POST -H 'Content-type: application/json' \ + --data '{"text":"❌ Директория preset'ов не найдена"}' \ + $SLACK_WEBHOOK_URL +fi + +echo "✅ Мониторинг завершен" +``` + +### Настройка cron для мониторинга + +```bash +# Добавление в crontab +crontab -e + +# Проверка каждые 5 минут +*/5 * * * * /path/to/scripts/monitor.sh + +# Проверка каждый час +0 * * * * /path/to/scripts/monitor.sh + +# Проверка каждый день в 9:00 +0 9 * * * /path/to/scripts/monitor.sh +``` + +## 📈 Метрики и отчеты + +### Сбор метрик + +```bash +#!/bin/bash +# scripts/collect-metrics.sh +# Сбор метрик AnsibleTemplate + +echo "📊 Сбор метрик AnsibleTemplate..." + +# Создание директории для метрик +mkdir -p metrics + +# Метрики Docker +echo "=== Docker Metrics ===" > metrics/docker.txt +docker info >> metrics/docker.txt +docker images >> metrics/docker.txt +docker ps -a >> metrics/docker.txt + +# Метрики системы +echo "=== System Metrics ===" > metrics/system.txt +df -h >> metrics/system.txt +free -h >> metrics/system.txt +uptime >> metrics/system.txt + +# Метрики Ansible +echo "=== Ansible Metrics ===" > metrics/ansible.txt +ansible --version >> metrics/ansible.txt +ansible-galaxy list >> metrics/ansible.txt + +# Метрики ролей +echo "=== Roles Metrics ===" > metrics/roles.txt +find roles/ -name "main.yml" -path "*/tasks/*" | wc -l >> metrics/roles.txt +ls -la roles/ >> metrics/roles.txt + +echo "✅ Метрики собраны" +``` + +### Генерация отчетов + +```bash +#!/bin/bash +# scripts/generate-report.sh +# Генерация отчета о состоянии AnsibleTemplate + +echo "📋 Генерация отчета..." + +# Создание директории для отчетов +mkdir -p reports + +# Отчет о Docker +cat > reports/docker-report.md << EOF +# Docker Report + +## Образы +\`\`\` +$(docker images | grep inecs/ansible-lab) +\`\`\` + +## Контейнеры +\`\`\` +$(docker ps -a) +\`\`\` + +## Сети +\`\`\` +$(docker network ls) +\`\`\` +EOF + +# Отчет о ролях +cat > reports/roles-report.md << EOF +# Roles Report + +## Количество ролей +$(find roles/ -name "main.yml" -path "*/tasks/*" | wc -l) + +## Список ролей +\`\`\` +$(find roles/ -name "main.yml" -path "*/tasks/*" | sed 's|roles/||; s|/tasks/main.yml||') +\`\`\` +EOF + +# Отчет о preset'ах +cat > reports/presets-report.md << EOF +# Presets Report + +## Количество preset'ов +$(ls -1 molecule/presets/*.yml | wc -l) + +## Список preset'ов +\`\`\` +$(ls -1 molecule/presets/*.yml | sed 's|molecule/presets/||g' | sed 's|\.yml||g') +\`\`\` +EOF + +echo "✅ Отчеты сгенерированы" +``` + +## 🔍 Отладка проблем + +### Общие проблемы + +#### 1. Docker не запускается + +```bash +# Проверка статуса Docker +sudo systemctl status docker + +# Запуск Docker +sudo systemctl start docker + +# Проверка логов +sudo journalctl -u docker.service +``` + +#### 2. Образы не собираются + +```bash +# Проверка builder'а +make docker diagnose + +# Сброс builder'а +make docker reset-builder + +# Очистка кеша +make docker clean +``` + +#### 3. Тесты не проходят + +```bash +# Проверка preset'ов +make presets list + +# Проверка инвентори +cat ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini + +# Проверка логов +docker logs ansible-controller +``` + +#### 4. Роли не работают + +```bash +# Проверка синтаксиса +make role lint + +# Проверка переменных +ansible-inventory --list -i inventory/hosts.ini + +# Тестирование с verbose +ansible-playbook -i inventory/hosts.ini site.yml -vvv +``` + +### Логи для отладки + +```bash +# Сбор всех логов +mkdir -p debug-logs + +# Логи Docker +docker info > debug-logs/docker-info.txt +docker images > debug-logs/docker-images.txt +docker ps -a > debug-logs/docker-containers.txt + +# Логи системы +df -h > debug-logs/disk-usage.txt +free -h > debug-logs/memory-usage.txt +ps aux > debug-logs/processes.txt + +# Логи Ansible +ansible --version > debug-logs/ansible-version.txt +ansible-galaxy list > debug-logs/ansible-galaxy.txt + +# Логи ролей +find roles/ -name "*.yml" -exec ansible-playbook --syntax-check {} \; > debug-logs/roles-syntax.txt +``` + +## 📊 Дашборд мониторинга + +### Простой дашборд + +```bash +#!/bin/bash +# scripts/dashboard.sh +# Простой дашборд мониторинга + +echo "📊 AnsibleTemplate Dashboard" +echo "==========================" + +# Статус Docker +if docker info >/dev/null 2>&1; then + echo "✅ Docker: Запущен" +else + echo "❌ Docker: Не запущен" +fi + +# Количество образов +IMAGES=$(docker images | grep inecs/ansible-lab | wc -l) +echo "📦 Образы: $IMAGES" + +# Количество ролей +ROLES=$(find roles/ -name "main.yml" -path "*/tasks/*" | wc -l) +echo "🎭 Роли: $ROLES" + +# Количество preset'ов +PRESETS=$(ls -1 molecule/presets/*.yml 2>/dev/null | wc -l) +echo "⚙️ Preset'ы: $PRESETS" + +# Использование диска +DISK=$(df -h . | tail -1 | awk '{print $5}') +echo "💾 Диск: $DISK" + +# Использование памяти +MEMORY=$(free -h | grep Mem | awk '{print $3 "/" $2}') +echo "🧠 Память: $MEMORY" + +echo "==========================" +``` + +### Веб-дашборд + +```html + + +
+