diff --git a/README.md b/README.md index 23290b1..698beb5 100644 --- a/README.md +++ b/README.md @@ -1,283 +1,175 @@ -# AnsibleLab - Универсальная система тестирования Ansible ролей +# AnsibleTemplate - Универсальная система тестирования Ansible ролей **Автор:** Сергей Антропов -**Сайт:** https://devops.org.ru +**Сайт:** https://devops.org.ru **Версия:** 2.0.0 -## 🚀 Описание +## 📋 Описание -AnsibleLab - это универсальная система для тестирования Ansible ролей с использованием Docker, Molecule и различных preset'ов конфигурации. Система поддерживает multi-arch сборку, CI/CD интеграцию и работу с различными операционными системами. - -## 📚 Документация - -### 🚀 Быстрый старт -- **[docs/getting-started.md](docs/getting-started.md)** - Установка, настройка и первое тестирование - -### 🛠️ Разработка -- **[docs/creating-roles.md](docs/creating-roles.md)** - Создание и разработка ролей -- **[docs/linting-guide.md](docs/linting-guide.md)** - Руководство по линтингу ролей -- **[docs/site-yml-guide.md](docs/site-yml-guide.md)** - Руководство по файлу site.yml -- **[docs/molecule-guide.md](docs/molecule-guide.md)** - Подробное руководство по Molecule -- **[docs/all-images-preset.md](docs/all-images-preset.md)** - Пресет all-images для тестирования всех образов -- **[docs/deploy-yml-customization.md](docs/deploy-yml-customization.md)** - Полное руководство по кастомизации deploy.yml -- **[dockerfiles/README.md](dockerfiles/README.md)** - Подробная документация по Docker образам - -### 🏗️ CI/CD -- **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD для GitHub Actions, Azure DevOps, Jenkins, GitLab CI - -### 📊 Мониторинг -- **[docs/monitoring.md](docs/monitoring.md)** - Мониторинг, диагностика и troubleshooting +AnsibleTemplate - это универсальная система для разработки, тестирования и развертывания Ansible ролей с использованием Docker, Molecule и preset конфигураций. Система поддерживает тестирование на различных ОС через Docker контейнеры. ## ✨ Ключевые возможности -### 🐳 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 функциональности -- **Интерактивное управление ролями** - создание, удаление, просмотр ролей -- **Автоматическое обновление** playbook'ов при добавлении новых ролей -- **Комплексное тестирование** всех образов одновременно (all-images preset) - -### 🔐 Безопасность и секреты -- **Ansible Vault** интеграция -- **Автоматическое шифрование/расшифровка** секретов -- **Сканирование** на наличие незашифрованных секретов -- **Управление паролями** и ключами - -### 🚀 CI/CD интеграция -- **GitHub Actions** готовые workflow'ы -- **Azure DevOps** pipeline конфигурации -- **Jenkins** pipeline скрипты -- **GitLab CI** интеграция -- **Автоматическое тестирование** при push/PR +- **Тестирование ролей** через Molecule с Docker +- **Preset система** для быстрого выбора окружений тестирования +- **Мультиплатформенное тестирование** (Ubuntu, Debian, CentOS, AlmaLinux, RHEL и другие) +- **Автоматическая проверка** синтаксиса Ansible ролей +- **Управление секретами** через Ansible Vault +- **Готовые Docker образы** для разных ОС ## 📁 Структура проекта ``` -AnsibleLab/ -├── 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 коллекции -└── Dockerfile # Основной Docker образ +AnsibleTemplate/ +├── molecule/ # Конфигурация Molecule +│ ├── default/ # Основная конфигурация +│ │ ├── create.yml # Создание контейнеров +│ │ ├── converge.yml # Запуск тестов +│ │ ├── destroy.yml # Удаление контейнеров +│ │ ├── site.yml # Основной playbook +│ │ └── molecule.yml # Конфигурация Molecule +│ └── presets/ # Preset конфигурации +│ ├── default.yml # Стандартный preset +│ ├── minimal.yml # Минимальный preset +│ └── examples/ # Примеры preset'ов +├── roles/ # Ansible роли +│ ├── docker/ # Роль установки Docker +│ ├── ping/ # Роль для ping проверок +│ └── deploy.yml # Playbook для развертывания +├── dockerfiles/ # Docker образы +│ └── ansible-controller/ # Ansible контроллер +├── cicd/ # CI/CD конфигурации +├── vault/ # Зашифрованные секреты +├── inventory/ # Инвентори файлы +├── scripts/ # Вспомогательные скрипты +├── docs/ # Документация +├── Makefile # Основные команды +└── requirements.yml # Ansible коллекции ``` -## 📋 Важные изменения - -### Перемещение 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. Клонирование и настройка +### 1. Клонирование репозитория ```bash -git clone https://github.com/your-username/AnsibleLab.git -cd AnsibleLab +git clone +cd AnsibleTemplate ``` -### 2. Настройка Docker +### 2. Тестирование ролей ```bash -# Настройка multi-arch builder -make docker setup-builder - -# Сборка всех образов (multi-arch) -make docker build - -# Проверка собранных образов -make docker info -``` - -### 3. Управление ролями - -```bash -# Просмотр всех ролей -make role list - -# Создание новой роли (интерактивно) -make role create - -# Удаление роли (интерактивно) -make role delete -``` - -### 4. Тестирование ролей - -```bash -# Просмотр доступных preset'ов -make presets list - -# Тестирование с default preset +# Тестирование с default preset (2 хоста) make role test -# Тестирование с minimal preset +# Тестирование с минимальным preset (1 хост) make role test minimal -# Тестирование всех образов (9 контейнеров) -make role test all-images - -# Тестирование с custom preset +# Тестирование с кастомным preset make role test my-custom-preset ``` -## 🧪 Тестирование - -### Preset система - -Система поддерживает неограниченное количество preset'ов без изменения Makefile: +### 3. Проверка синтаксиса ```bash -# Просмотр всех доступных preset'ов -make presets list +# Проверка всех ролей +make role lint -# Информация о конкретном preset'е -make presets info PRESET=etcd-patroni - -# Тестирование с preset'ом -make presets test PRESET=performance +# Проверка конкретной роли +make role lint docker +make role lint ping ``` +## 📚 Доступные роли + +### Docker + +Универсальная роль для установки Docker и Docker Compose на различных Linux-дистрибутивах. + +**Поддерживаемые ОС:** +- Debian 9/10/11/12 +- Ubuntu 20.04/22.04/24.04 +- CentOS 7/8/9 +- AlmaLinux 8/9 +- Rocky Linux 8/9 +- RHEL 8/9 + +**Пример использования:** +```yaml +- hosts: all + roles: + - role: docker + vars: + docker_users: + - ansible + - deploy +``` + +**Подробная документация:** [roles/docker/README.md](roles/docker/README.md) + +### Ping + +Роль для выполнения ping проверок подключения к сети. + +**Пример использования:** +```yaml +- hosts: all + roles: + - role: ping + vars: + ping_host: google.com + ping_count: 10 +``` + +**Подробная документация:** [roles/ping/README.md](roles/ping/README.md) + +## 🧪 Preset система + +Preset система позволяет быстро выбрать окружение для тестирования. + ### Доступные preset'ы -| Preset | Описание | Хосты | Использование | -|--------|----------|-------|---------------| -| `default` | Стандартный preset | 2 хоста (Debian + RHEL) | Базовое тестирование | -| `minimal` | Минимальный preset | 1 хост (Debian) | Быстрое тестирование | -| `all-images` | **Все образы** | 9 хостов (все ОС) | **Комплексное тестирование** | -| `standard` | Расширенный preset | 3 хоста (Debian + RHEL + Debian) | Полное тестирование | -| `performance` | Performance preset | 5 хостов (Debian + RHEL) | Нагрузочное тестирование | -| `security` | Security preset | 3 хоста (Debian + RHEL) | Тестирование безопасности | -| `etcd-patroni` | etcd-patroni preset | 3 хоста (Debian + RHEL) | Тестирование кластеров | -| `[custom]` | Любой custom preset | Любое количество | Пользовательские сценарии | +| Preset | Описание | Хосты | +|--------|----------|-------| +| `default` | Стандартный preset | 2 хоста (Ubuntu + CentOS) | +| `minimal` | Минимальный preset | 1 хост (Debian) | +| `mytest` | Кастомный preset | 3 хоста | -### Тестирование с собственными образами +### Создание своего preset -```bash -# Проверка наличия собственных образов -make custom-images check +Создайте файл `molecule/presets/my-preset.yml`: -# Тестирование с собственными образами -make custom-images test minimal -make custom-images test full -make custom-images test performance +```yaml +--- +#description: Мой кастомный preset +docker_network: labnet +generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini" + +images: + ubuntu22: "inecs/ansible-lab:ubuntu22-latest" + centos9: "inecs/ansible-lab:centos9-latest" + +systemd_defaults: + privileged: true + command: "/sbin/init" + volumes: + - "/sys/fs/cgroup:/sys/fs/cgroup:rw" + tmpfs: ["/run", "/run/lock"] + capabilities: ["SYS_ADMIN"] + +hosts: + - name: web1 + family: ubuntu22 + groups: [web, test] + - name: db1 + family: centos9 + groups: [database, test] ``` -## 🐳 Docker образы - -> 📖 **Подробная документация:** [dockerfiles/README.md](dockerfiles/README.md) - -### Multi-Arch поддержка - -Система поддерживает сборку для множества архитектур: +Используйте preset: ```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 +make role test my-preset ``` ## 🔐 Управление секретами @@ -285,10 +177,7 @@ make docker reset-builder ### Ansible Vault ```bash -# Инициализация vault -make vault init - -# Создание файла секретов +# Создание секретного файла make vault create # Редактирование секретов @@ -297,23 +186,11 @@ 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 ``` ## 🚀 Развертывание @@ -324,1767 +201,174 @@ make vault scan # Тестирование с разными 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 # развертывание ролей +# Развертывание на продакшн +make role deploy ``` -**Инвентори для продакшн развертывания:** -- **Источник:** Статический файл `inventory/hosts.ini` -- **Расположение:** `inventory/hosts.ini` -- **Содержимое:** Реальные серверы с SSH подключением -- **Сеть:** Интернет или внутренняя сеть -- **Пользователь:** `devops` (настраивается в Makefile) +**Инвентори для продакшн** находится в файле `inventory/hosts.ini`: -**Пример продакшн инвентори:** ```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 -# Продакшн серверы +# inventory/hosts.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 -# Интерактивное подтверждение -make role deploy -# Запрашивается подтверждение: "Продолжить развертывание? (y/N):" - ``` - -**Логирование и мониторинг:** - ```bash -# Подробные логи -ANSIBLE_STDOUT_CALLBACK=yaml make role deploy - -# Сохранение логов -make role deploy 2>&1 | tee deployment.log -``` - -## 🔧 Вспомогательные команды +## 🔧 Основные команды ### Управление ролями ```bash # Просмотр всех ролей -make role list +ls -1 roles/ -# Создание новой роли (интерактивно) -make role create +# Проверка синтаксиса +make role lint # все роли +make role lint docker # конкретная роль -# Удаление роли (интерактивно) -make role delete - -# Проверка синтаксиса ролей -make role lint # проверить все роли -make role lint devops # проверить конкретную роль -make role lint ping # проверить другую роль +# Тестирование +make role test # default preset +make role test minimal # minimal preset ``` -### Docker команды - -```bash -# Очистка Docker ресурсов -make docker clean - -# Полная очистка Docker (ОСТОРОЖНО!) -make docker purge - -# Обновление всех образов -make docker update -``` - -### Другие команды +### Управление секретами ```bash # Создание секретов make vault create -# Полная справка -make help +# Редактирование +make vault edit + +# Просмотр +make vault show ``` -## 🏗️ 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 +# Развертывание на продакшн +make role deploy ``` -### Логи и отчеты +## 📖 Документация + +### Основная документация + +- **[docs/getting-started.md](docs/getting-started.md)** - Быстрый старт +- **[docs/molecule-guide.md](docs/molecule-guide.md)** - Руководство по Molecule +- **[docs/creating-roles.md](docs/creating-roles.md)** - Создание ролей +- **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD + +### Документация по ролям + +- **[roles/docker/README.md](roles/docker/README.md)** - Документация роли Docker +- **[roles/ping/README.md](roles/ping/README.md)** - Документация роли Ping + +### Docker образы + +- **[dockerfiles/README.md](dockerfiles/README.md)** - Информация об образах + +## 🐳 Docker образы + +Проект использует готовые Docker образы для различных ОС: + +- **Ubuntu** 20.04, 22.04, 24.04 +- **Debian** 9, 10, 11, 12 +- **CentOS** 7, 8, 9 +- **AlmaLinux** 8, 9 +- **Rocky Linux** 8, 9 +- **RHEL** 8, 9 + +Все образы с поддержкой systemd для корректной работы служб. + +## 🛠️ Разработка новых ролей + +### Создание структуры роли ```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`** - основные задачи: +**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 +- name: Пример задачи + debug: + msg: "Роль my-role выполнена" ``` -**`roles/my-role/defaults/main.yml`** - переменные по умолчанию: +**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 +my_role_version: "1.0.0" ``` -**`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`** - документация роли: +**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 lint my-role -# Тестирование всех ролей +# Тестирование make role test ``` -**Как это работает:** -1. **Lint проверка:** `ansible-lint roles/` автоматически находит все роли в директории `roles/` -2. **Тестирование:** `molecule/default/site.yml` автоматически включает все роли из `roles/` -3. **Развертывание:** `roles/deploy.yml` автоматически включает все роли из `roles/` +## 🏗️ CI/CD -**Ручная проверка конкретной роли:** -```bash -# Lint проверка конкретной роли -ansible-lint roles/my-role/ +Проект поддерживает интеграцию с различными CI/CD системами: -# Тестирование конкретной роли -cd roles/my-role -molecule test -``` +- **GitHub Actions** - готовые workflow'ы +- **Azure DevOps** - pipeline конфигурации +- **Jenkins** - pipeline скрипты +- **GitLab CI** - интеграция -**Автоматическое включение ролей в playbook'и:** +Подробнее в [docs/cicd-setup.md](docs/cicd-setup.md) -**В `molecule/default/site.yml` (для тестирования):** -```yaml ---- -# Автоматически включает все роли из директории roles/ -# Автор: Сергей Антропов -# Сайт: https://devops.org.ru +## 📊 Требования -- name: Тестирование всех ролей - hosts: all - roles: - - ping # Автоматически включается - - my-role # Автоматически включается - # Добавьте сюда новые роли по мере их создания -``` +- **Docker** - для контейнеризации +- **Docker Compose** - для оркестрации +- **Ansible** >= 2.9 +- **Molecule** >= 3.0 +- **Python** >= 3.6 -**В `roles/deploy.yml` (для продакшн развертывания):** -```yaml ---- -# Автоматически включает все роли из директории roles/ -# Автор: Сергей Антропов -# Сайт: https://devops.org.ru +## 🎯 Поддерживаемые ОС -- name: Развертывание всех ролей - hosts: all - roles: - - ping # Автоматически включается - - my-role # Автоматически включается - # Добавьте сюда новые роли по мере их создания -``` +### Для тестирования (Docker) +- Ubuntu 20.04/22.04/24.04 +- Debian 9/10/11/12 +- CentOS 7/8/9 +- AlmaLinux 8/9 +- Rocky Linux 8/9 +- RHEL 8/9 -#### 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: - 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] -``` - -**Переменные для продакшн (в 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 -``` - -**Переменные для конкретных групп:** -```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 -# 1. Lint проверка -make role lint - -# 2. Тестирование с default preset -make role test - -# 3. Тестирование с custom preset -make role test my-custom-preset - -# 4. Тестирование на реальных серверах (dry-run) -make role deploy -``` - -#### 7. Полный цикл разработки роли - -```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 -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'и обновлены" -``` - -**Использование:** -```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 -``` - -## 🔧 Конфигурация - -### Настройки проекта - -Все настройки проекта находятся в `Makefile` и могут быть переопределены через переменные окружения: - -```bash -# Основные настройки -export PROJECT_NAME=ansible-template -export VERSION=2.0.0 -export AUTHOR="Сергей Антропов" -export SITE="https://devops.org.ru" - -# Docker настройки -export DOCKER_IMAGE=inecs/ansible-lab:ansible-controller-latest -export DOCKER_REGISTRY=inecs/ansible-lab -export DOCKER_VERSION=latest - -# Multi-arch настройки -export DOCKER_PLATFORMS=linux/amd64,linux/arm64 -export DOCKER_BUILDX_BUILDER=multiarch-builder -``` - -### Ansible конфигурация - -```ini -# Переменные окружения для Ansible -export ANSIBLE_FORCE_COLOR=1 -export ANSIBLE_STDOUT_CALLBACK=yaml -export ANSIBLE_HOST_KEY_CHECKING=False -export ANSIBLE_INVENTORY=inventory/hosts.ini -export ANSIBLE_REMOTE_USER=devops -export ANSIBLE_ROLES_PATH=roles/ -export ANSIBLE_INTERPRETER_PYTHON=auto - -# Настройки для продакшн -[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 -``` +### Для развертывания +- Любые Linux системы с SSH доступом ## 🤝 Вклад в проект @@ -2096,63 +380,25 @@ make role test performance ## 📄 Лицензия -MIT License - см. файл [LICENSE](LICENSE) +MIT License ## 📞 Поддержка При возникновении проблем: -1. Проверьте наличие Docker и Docker Compose +1. Проверьте наличие Docker 2. Убедитесь, что все preset файлы существуют -3. Используйте `make help` для справки -4. Проверьте логи: `make docker shell` и `docker logs ansible-controller` -5. Выполните диагностику: `make docker diagnose` +3. Используйте `make role lint` для проверки синтаксиса +4. Проверьте логи тестирования -## 🎯 Результат +## 🎉 Основные достижения -Система тестирования теперь работает корректно: - -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 функциональности** -15. ✅ **Интерактивное управление ролями** - создание, удаление, просмотр ролей -16. ✅ **Автоматическое обновление playbook'ов** при добавлении новых ролей -17. ✅ **Комплексное тестирование всех образов** одновременно (all-images preset) -18. ✅ **Подробная документация по кастомизации deploy.yml** с примерами - -## 📚 Навигация по документации - -### 🚀 Для начинающих -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-lint** - Конфигурация линтера -- **requirements.yml** - Ansible коллекции -- **molecule/presets/** - Готовые preset'ы для тестирования +- ✅ Универсальная preset система +- ✅ Мультиплатформенное тестирование +- ✅ Автоматическая проверка синтаксиса +- ✅ Управление секретами через Ansible Vault +- ✅ Готовые Docker образы для разных ОС +- ✅ CI/CD интеграция --- diff --git a/molecule/presets/mytest.yml b/molecule/presets/mytest.yml new file mode 100644 index 0000000..7fabbe5 --- /dev/null +++ b/molecule/presets/mytest.yml @@ -0,0 +1,46 @@ +--- +#description: Стандартный пресет по умолчанию для тестирования с 2 хостами (Ubuntu + Debian) +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +docker_network: labnet +generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini" + +# systemd-ready образы +images: + alt: "inecs/ansible-lab:alt-linux-latest" + astra: "inecs/ansible-lab:astra-linux-latest" + rhel: "inecs/ansible-lab:rhel-latest" + centos7: "inecs/ansible-lab:centos7-latest" + centos8: "inecs/ansible-lab:centos8-latest" + centos9: "inecs/ansible-lab:centos9-latest" + alma: "inecs/ansible-lab:alma-latest" + rocky: "inecs/ansible-lab:rocky-latest" + redos: "inecs/ansible-lab:redos-latest" + ubuntu20: "inecs/ansible-lab:ubuntu20-latest" + ubuntu22: "inecs/ansible-lab:ubuntu22-latest" + ubuntu24: "inecs/ansible-lab:ubuntu24-latest" + debian9: "inecs/ansible-lab:debian9-latest" + debian10: "inecs/ansible-lab:debian10-latest" + debian11: "inecs/ansible-lab:debian11-latest" + debian12: "inecs/ansible-lab:debian12-latest" + +systemd_defaults: + privileged: true + command: "/sbin/init" + volumes: + - "/sys/fs/cgroup:/sys/fs/cgroup:rw" + tmpfs: ["/run", "/run/lock"] + capabilities: ["SYS_ADMIN"] + +hosts: + # Стандартный набор - 2 хоста для базового тестирования (стабильные ОС) + - name: u1 + family: ubuntu22 + groups: [test] + - name: u2 + family: debian12 + groups: [test] + - name: u3 + family: centos9 + groups: [test] \ No newline at end of file diff --git a/roles/deploy.yml b/roles/deploy.yml index 5dd65c3..6507fb2 100644 --- a/roles/deploy.yml +++ b/roles/deploy.yml @@ -6,5 +6,6 @@ - name: Развертывание всех ролей hosts: all roles: - - ping + # - ping # - devops + - docker diff --git a/roles/devops/tasks/main.yml b/roles/devops/tasks/main.yml index 652e914..ba4f102 100644 --- a/roles/devops/tasks/main.yml +++ b/roles/devops/tasks/main.yml @@ -19,6 +19,33 @@ devops_sudo_validate: "{{ devops_os_config[devops_os_name].sudo_validate | default(devops_os_config[devops_os_family].sudo_validate | default('visudo -cf %s')) }}" when: devops_os_name is defined +# Проверка существования групп перед созданием пользователя +- name: "Проверка существования групп" + getent: + database: "group" + key: "{{ item }}" + register: group_check + failed_when: false + changed_when: false + loop: "{{ devops_user_groups }}" + when: devops_user_groups is defined + +# Фильтрация только существующих групп +- name: "Фильтрация существующих групп" + set_fact: + devops_existing_groups: "{{ group_check.results | selectattr('ansible_facts', 'defined') | map(attribute='item') | list }}" + when: group_check is defined + +# Создание отсутствующих групп (если необходимо) +- name: "Создание группы docker если она не существует" + group: + name: "docker" + state: "present" + become: true + when: + - "'docker' in devops_user_groups" + - "'docker' not in (devops_existing_groups | default([]))" + # Генерация безопасного пароля для пользователя devops - name: "Генерация безопасного пароля для пользователя devops" set_fact: @@ -31,7 +58,7 @@ name: "{{ devops_user.name }}" home: "{{ devops_user.home }}" shell: "{{ devops_user.shell }}" - groups: "{{ devops_user_groups }}" + groups: "{{ devops_existing_groups | default(devops_user_groups) }}" create_home: "{{ devops_user.create_home }}" state: "{{ devops_user.state }}" password: "{{ devops_user_password | password_hash('sha512') }}" @@ -67,6 +94,17 @@ validate: "{{ devops_sudo_validate }}" become: true +# Добавление пользователя в группу docker (если группа существует) +- name: "Добавление пользователя в группу docker" + user: + name: "{{ devops_user.name }}" + groups: "{{ devops_user_groups }}" + append: true + become: true + when: + - "'docker' in devops_user_groups" + - "'docker' in (devops_existing_groups | default([]))" + # Логирование успешного создания пользователя - name: "Логирование создания пользователя devops" debug: diff --git a/roles/docker/README.md b/roles/docker/README.md new file mode 100644 index 0000000..ddd410a --- /dev/null +++ b/roles/docker/README.md @@ -0,0 +1,193 @@ +# Роль docker + +## Описание + +Универсальная роль Ansible для установки и настройки Docker и Docker Compose на различных Linux-дистрибутивах. + +Роль автоматически определяет семейство ОС (Debian/Ubuntu или Red Hat/CentOS/AlmaLinux) и использует соответствующий метод установки. + +**Поддерживаемые ОС:** +- Debian 9/10/11/12 +- Ubuntu 20.04/22.04/24.04 +- CentOS 7/8/9 +- AlmaLinux 8/9 +- Rocky Linux 8/9 +- RHEL 8/9 + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru + +## Переменные + +| Переменная | По умолчанию | Описание | +|------------|--------------|----------| +| `docker_version` | `"latest"` | Версия Docker CE для установки | +| `docker_compose_version` | `"latest"` | Версия Docker Compose (для standalone версии) | +| `docker_use_official_repo` | `true` | Использовать официальный репозиторий Docker | +| `docker_use_compose_plugin` | `true` | Использовать docker-compose-plugin вместо standalone | +| `docker_users` | `[]` | Список пользователей для добавления в группу docker | +| `docker_service_enabled` | `true` | Автозапуск Docker при загрузке | +| `docker_service_state` | `started` | Состояние службы Docker | +| `docker_additional_packages` | `[]` | Дополнительные пакеты для установки | +| `docker_install_method` | `"official"` | Метод установки: 'official' или 'get.docker.com' | + +## Примеры использования + +### Базовое использование + +```yaml +- hosts: all + roles: + - docker +``` + +### Установка с добавлением пользователей + +```yaml +- hosts: all + roles: + - role: docker + vars: + docker_users: + - ansible + - deploy +``` + +### Установка через скрипт get.docker.com + +```yaml +- hosts: all + roles: + - role: docker + vars: + docker_install_method: "get.docker.com" + docker_use_official_repo: false +``` + +### Установка standalone Docker Compose + +```yaml +- hosts: all + roles: + - role: docker + vars: + docker_use_compose_plugin: false + docker_compose_version: "2.23.0" +``` + +### Установка с дополнительными пакетами + +```yaml +- hosts: all + roles: + - role: docker + vars: + docker_additional_packages: + - docker-ce-rootless-extras +``` + +## Зависимости + +Нет зависимостей от других ролей. + +## Требования + +- Ansible 2.9+ +- Python 3.6+ +- Права sudo на целевых хостах +- Доступ к интернету для загрузки пакетов + +## Что делает роль + +1. Определяет семейство ОС (Debian или Red Hat) +2. Устанавливает необходимые зависимости +3. Добавляет официальный репозиторий Docker +4. Устанавливает Docker CE и Docker Compose +5. Запускает и включает службу Docker +6. Создает группу docker +7. Добавляет пользователей в группу docker +8. Проверяет корректность установки + +## Проверка установки + +После выполнения роли проверьте установку: + +```bash +# Проверка версии Docker +docker --version + +# Проверка версии Docker Compose +docker compose version +# или +docker-compose --version + +# Проверка статуса службы +systemctl status docker + +# Проверка информации о Docker +docker info +``` + +## Пример playbook для тестирования + +```yaml +--- +- name: Установка Docker на все хосты + hosts: all + become: yes + roles: + - role: docker + vars: + docker_users: + - ansible + docker_use_compose_plugin: true + + post_tasks: + - name: Запуск тестового контейнера + docker_container: + name: hello-world + image: hello-world:latest + state: started + + - name: Проверка запущенных контейнеров + command: docker ps -a + register: docker_ps + changed_when: false + + - name: Вывод списка контейнеров + debug: + var: docker_ps.stdout_lines +``` + +## Troubleshooting + +### Docker не запускается + +Проверьте журналы systemd: +```bash +sudo journalctl -u docker.service +``` + +### Проблемы с репозиторием + +Для Ubuntu/Debian, если репозиторий не добавляется: +```bash +sudo apt-get update +sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release +``` + +### Проблемы с правами + +Если пользователь не может запускать docker без sudo: +```bash +sudo usermod -aG docker $USER +# Выйдите и войдите снова +``` + +## Лицензия + +MIT + +## Автор + +Сергей Антропов - https://devops.org.ru diff --git a/roles/docker/defaults/main.yml b/roles/docker/defaults/main.yml new file mode 100644 index 0000000..517c390 --- /dev/null +++ b/roles/docker/defaults/main.yml @@ -0,0 +1,33 @@ +--- +# Переменные по умолчанию для роли docker +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +# Версия Docker CE +docker_version: "latest" + +# Версия Docker Compose (если не используется docker-compose-plugin) +docker_compose_version: "latest" + +# Использовать ли официальный репозиторий Docker (рекомендуется) +docker_use_official_repo: true + +# Использовать ли docker-compose-plugin (вместо standalone docker-compose) +docker_use_compose_plugin: true + +# Пользователь для добавления в группу docker +docker_users: [] + # - ansible + # - deploy + +# Автозапуск Docker при загрузке системы +docker_service_enabled: true + +# Автозапуск Docker при загрузке системы +docker_service_state: started + +# Дополнительные пакеты для установки +docker_additional_packages: [] + +# Метод установки: 'official' (официальный репозиторий) или 'get.docker.com' (скрипт) +docker_install_method: "get.docker.com" diff --git a/roles/docker/examples.yml b/roles/docker/examples.yml new file mode 100644 index 0000000..716e218 --- /dev/null +++ b/roles/docker/examples.yml @@ -0,0 +1,104 @@ +--- +# Примеры использования роли docker +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Базовый пример установки Docker + hosts: all + become: yes + roles: + - docker + +- name: Установка Docker с добавлением пользователей + hosts: all + become: yes + roles: + - role: docker + vars: + docker_users: + - ansible + - deploy + - developer + +- name: Установка Docker через скрипт get.docker.com + hosts: all + become: yes + roles: + - role: docker + vars: + docker_install_method: "get.docker.com" + docker_use_official_repo: false + +- name: Установка Docker с standalone Docker Compose + hosts: all + become: yes + roles: + - role: docker + vars: + docker_use_compose_plugin: false + docker_compose_version: "2.23.0" + +- name: Установка Docker с дополнительными пакетами + hosts: all + become: yes + roles: + - role: docker + vars: + docker_additional_packages: + - docker-ce-rootless-extras + +- name: Полный пример с тестированием + hosts: all + become: yes + roles: + - role: docker + vars: + docker_users: + - ansible + docker_use_compose_plugin: true + + post_tasks: + - name: Проверка версии Docker + command: docker --version + register: docker_version + changed_when: false + failed_when: false + + - name: Вывод версии Docker + debug: + msg: "{{ docker_version.stdout }}" + + - name: Проверка версии Docker Compose + shell: | + if command -v docker compose &> /dev/null; then + docker compose version + elif command -v docker-compose &> /dev/null; then + docker-compose --version + fi + register: docker_compose_version + changed_when: false + failed_when: false + + - name: Вывод версии Docker Compose + debug: + msg: "{{ docker_compose_version.stdout }}" + + - name: Запуск тестового контейнера + docker_container: + name: hello-world + image: hello-world:latest + state: started + + - name: Проверка запущенных контейнеров + command: docker ps -a + register: docker_ps + changed_when: false + + - name: Вывод списка контейнеров + debug: + var: docker_ps.stdout_lines + + - name: Удаление тестового контейнера + docker_container: + name: hello-world + state: absent diff --git a/roles/docker/handlers/main.yml b/roles/docker/handlers/main.yml new file mode 100644 index 0000000..268c678 --- /dev/null +++ b/roles/docker/handlers/main.yml @@ -0,0 +1,22 @@ +--- +# Обработчики для роли docker +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Restart docker + become: true + systemd: + name: docker + state: restarted + +- name: Reload docker + become: true + systemd: + name: docker + state: reloaded + +- name: Restart docker socket + become: true + systemd: + name: docker.socket + state: restarted diff --git a/roles/docker/meta/main.yml b/roles/docker/meta/main.yml new file mode 100644 index 0000000..d9fcd73 --- /dev/null +++ b/roles/docker/meta/main.yml @@ -0,0 +1,35 @@ +--- +galaxy_info: + author: Сергей Антропов + description: Универсальная роль Ansible для установки и настройки Docker и Docker Compose на различных Linux-дистрибутивах + company: https://devops.org.ru + license: MIT + min_ansible_version: "2.9" + platforms: + - name: Ubuntu + versions: + - focal + - jammy + - noble + - name: Debian + versions: + - stretch + - buster + - bullseye + - bookworm + - name: EL + versions: + - "7" + - "8" + - "9" + - name: Rocky + versions: + - "8.0" + - "9.0" + galaxy_tags: + - docker + - dockercompose + - container + - virtualization + - linux +dependencies: [] diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yml new file mode 100644 index 0000000..43b0abe --- /dev/null +++ b/roles/docker/tasks/main.yml @@ -0,0 +1,250 @@ +--- +# Задачи для роли docker +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +# Определяем семейство ОС для выбора правильного метода установки +- name: Определение семейства ОС + set_fact: + docker_os_family: "{{ ansible_os_family }}" + docker_pkg_manager: "{{ 'yum' if ansible_pkg_mgr == 'yum' else ('dnf' if ansible_pkg_mgr == 'dnf' else 'apt') }}" + +# Устанавливаем предварительные зависимости +- name: Установка зависимостей для Debian/Ubuntu + become: true + apt: + name: + - apt-transport-https + - ca-certificates + - curl + - gnupg + - lsb-release + - software-properties-common + state: present + update_cache: yes + when: ansible_os_family == "Debian" + +- name: Установка зависимостей для Red Hat + become: true + package: + name: + - yum-utils + - device-mapper-persistent-data + - lvm2 + state: present + when: ansible_os_family == "RedHat" + failed_when: false + +# Добавляем официальный репозиторий Docker для Debian/Ubuntu +- name: Добавление GPG ключа Docker для Debian/Ubuntu + become: true + shell: | + install -m 0755 -d /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/{{ (ansible_distribution | lower) }}/gpg -o /etc/apt/keyrings/docker.asc + chmod a+r /etc/apt/keyrings/docker.asc + args: + creates: /etc/apt/keyrings/docker.asc + when: + - ansible_os_family == "Debian" + - docker_use_official_repo + +- name: Добавление репозитория Docker для Debian/Ubuntu + become: true + apt_repository: + repo: "deb [arch={{ ansible_architecture }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/{{ (ansible_distribution | lower) }} {{ ansible_distribution_release }} stable" + state: present + filename: docker + update_cache: yes + when: + - ansible_os_family == "Debian" + - docker_use_official_repo + +# Добавляем официальный репозиторий Docker для Red Hat +- name: Добавление репозитория Docker для Red Hat через dnf + become: true + shell: | + dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + args: + creates: /etc/yum.repos.d/docker-ce.repo + when: + - ansible_os_family == "RedHat" + - ansible_pkg_mgr == "dnf" + - docker_use_official_repo + failed_when: false + +- name: Добавление репозитория Docker для Red Hat через yum-config-manager + become: true + shell: | + yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + args: + creates: /etc/yum.repos.d/docker-ce.repo + when: + - ansible_os_family == "RedHat" + - ansible_pkg_mgr == "yum" + - docker_use_official_repo + failed_when: false + +# Устанавливаем Docker через официальный репозиторий +- name: Установка Docker CE для Debian/Ubuntu (официальный репозиторий) + become: true + apt: + name: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + state: "{{ 'present' if docker_version == 'latest' else docker_version }}" + update_cache: yes + when: + - ansible_os_family == "Debian" + - docker_use_official_repo + - docker_install_method == "official" + +- name: Установка Docker CE для Red Hat (официальный репозиторий) + become: true + package: + name: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + state: "{{ 'present' if docker_version == 'latest' else docker_version }}" + when: + - ansible_os_family == "RedHat" + - docker_use_official_repo + - docker_install_method == "official" + +# Устанавливаем Docker через скрипт get.docker.com +- name: Проверка наличия Docker + stat: + path: /usr/bin/docker + register: docker_binary + +- name: Скачивание скрипта установки Docker + become: true + get_url: + url: https://get.docker.com + dest: /tmp/get-docker.sh + mode: '0755' + when: + - docker_install_method == "get.docker.com" or docker_use_official_repo == false + - not docker_binary.stat.exists + +- name: Установка Docker через скрипт get.docker.com + become: true + command: /tmp/get-docker.sh + args: + creates: /usr/bin/docker + when: + - docker_install_method == "get.docker.com" or docker_use_official_repo == false + - not docker_binary.stat.exists + +- name: Проверка установки Docker + become: true + command: docker --version + register: docker_version_check + changed_when: false + failed_when: false + +- name: Вывод версии Docker + debug: + msg: "{{ docker_version_check.stdout if docker_version_check.rc == 0 else 'Docker не установлен' }}" + +# Устанавливаем docker-compose-plugin для Debian/Ubuntu +- name: Установка docker-compose-plugin для Debian/Ubuntu + become: true + apt: + name: + - docker-compose-plugin + state: present + when: + - ansible_os_family == "Debian" + - docker_use_compose_plugin + - docker_use_official_repo + +# Устанавливаем docker-compose-plugin для Red Hat +- name: Установка docker-compose-plugin для Red Hat + become: true + package: + name: + - docker-compose-plugin + state: present + when: + - ansible_os_family == "RedHat" + - docker_use_compose_plugin + - docker_use_official_repo + +# Устанавливаем standalone docker-compose +- name: Скачивание docker-compose + become: true + get_url: + url: "https://github.com/docker/compose/releases/{{ 'latest/download' if docker_compose_version == 'latest' else 'download/v' + docker_compose_version }}/docker-compose-{{ ansible_system }}-{{ ansible_machine }}" + dest: /usr/local/bin/docker-compose + mode: '0755' + when: + - not docker_use_compose_plugin or docker_compose_version != 'latest' + +- name: Проверка установки Docker Compose + become: true + shell: | + set -o pipefail + if command -v docker compose &> /dev/null; then + docker compose version + elif command -v docker-compose &> /dev/null; then + docker-compose --version + else + echo "Docker Compose не установлен" + fi + register: docker_compose_version_check + changed_when: false + failed_when: false + +- name: Вывод версии Docker Compose + debug: + msg: "{{ docker_compose_version_check.stdout if docker_compose_version_check.rc == 0 else 'Docker Compose не установлен' }}" + +# Запускаем и включаем службу Docker +- name: Запуск службы Docker + become: true + systemd: + name: docker + state: started + enabled: yes + +# Создаем группу docker +- name: Создание группы docker + become: true + group: + name: docker + state: present + +# Добавляем пользователей в группу docker +- name: Добавление пользователей в группу docker + become: true + user: + name: "{{ item }}" + groups: docker + append: yes + loop: "{{ docker_users }}" + when: docker_users | length > 0 + +# Устанавливаем дополнительные пакеты +- name: Установка дополнительных пакетов + become: true + package: + name: "{{ docker_additional_packages }}" + state: present + when: docker_additional_packages | length > 0 + +# Проверка статуса Docker +- name: Проверка статуса Docker + become: true + command: docker info + register: docker_info + changed_when: false + failed_when: false + +- name: Вывод информации о Docker + debug: + msg: "Docker успешно установлен и запущен" + when: docker_info.rc == 0 diff --git a/roles/docker/tests/test.yml b/roles/docker/tests/test.yml new file mode 100644 index 0000000..a8e007a --- /dev/null +++ b/roles/docker/tests/test.yml @@ -0,0 +1,89 @@ +--- +# Тестовый playbook для роли docker +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Тестирование установки Docker + hosts: all + become: yes + roles: + - role: docker + vars: + docker_users: + - ansible + + post_tasks: + - name: Проверка установки Docker + command: docker --version + register: docker_version_check + changed_when: false + failed_when: false + + - name: Проверка установки Docker Compose + shell: | + if command -v docker compose &> /dev/null; then + docker compose version + elif command -v docker-compose &> /dev/null; then + docker-compose --version + else + echo "Docker Compose не найден" + exit 1 + fi + register: docker_compose_check + changed_when: false + failed_when: false + + - name: Вывод результатов проверки + debug: + msg: + - "Docker: {{ docker_version_check.stdout }}" + - "Docker Compose: {{ docker_compose_check.stdout }}" + + - name: Проверка статуса службы Docker + systemd: + name: docker + register: docker_service + changed_when: false + + - name: Вывод статуса службы + debug: + msg: "Docker service is {{ docker_service.status.ActiveState }}" + + - name: Проверка группы docker + group: + name: docker + register: docker_group_check + + - name: Вывод информации о группе + debug: + msg: "Group docker exists with gid {{ docker_group_check.group.gid }}" + + - name: Запуск тестового контейнера + docker_container: + name: test-container + image: alpine:latest + command: echo "Hello from Docker" + state: started + + - name: Проверка запущенных контейнеров + command: docker ps -a + register: docker_ps + changed_when: false + + - name: Вывод списка контейнеров + debug: + var: docker_ps.stdout_lines + + - name: Удаление тестового контейнера + docker_container: + name: test-container + state: absent + + - name: Проверка успешного завершения теста + assert: + that: + - docker_version_check.rc == 0 + - docker_compose_check.rc == 0 + - docker_service.status.ActiveState == "active" + fail_msg: "Тестирование не пройдено" + success_msg: "Все тесты пройдены успешно"