Files
DevOpsLab/README.md
Сергей Антропов 34e0cbd570
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
docs: обновлена документация и help для линтинга ролей
- Обновлена основная справка make help с примерами использования
- Добавлена подробная справка по линтингу в make role
- Создана документация docs/linting-guide.md с полным руководством
- Обновлен README.md с примерами команд линтинга
- Добавлена ссылка на новую документацию в секции разработки

Новая документация включает:
- Команды линтинга (все роли и конкретные)
- Профили линтинга (production, basic, min)
- Типы ошибок и способы исправления
- Интеграция с CI/CD
- Лучшие практики и устранение неполадок
2025-10-25 20:44:51 +03:00

2160 lines
68 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AnsibleLab - Универсальная система тестирования Ansible ролей
**Автор:** Сергей Антропов
**Сайт:** 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
## ✨ Ключевые возможности
### 🐳 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
## 📁 Структура проекта
```
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 образ
```
## 📋 Важные изменения
### Перемещение 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/AnsibleLab.git
cd AnsibleLab
```
### 2. Настройка Docker
```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
make role test
# Тестирование с minimal preset
make role test minimal
# Тестирование всех образов (9 контейнеров)
make role test all-images
# Тестирование с custom preset
make role test my-custom-preset
```
## 🧪 Тестирование
### Preset система
Система поддерживает неограниченное количество preset'ов без изменения Makefile:
```bash
# Просмотр всех доступных preset'ов
make presets list
# Информация о конкретном preset'е
make presets info PRESET=etcd-patroni
# Тестирование с preset'ом
make presets test PRESET=performance
```
### Доступные 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 | Любое количество | Пользовательские сценарии |
### Тестирование с собственными образами
```bash
# Проверка наличия собственных образов
make custom-images check
# Тестирование с собственными образами
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` (настраивается в Makefile)
**Пример продакшн инвентори:**
```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
# Интерактивное подтверждение
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
# Создание новой роли (интерактивно)
make role create
# Удаление роли (интерактивно)
make role delete
# Проверка синтаксиса ролей
make role lint # проверить все роли
make role lint devops # проверить конкретную роль
make role lint ping # проверить другую роль
```
### Docker команды
```bash
# Очистка Docker ресурсов
make docker clean
# Полная очистка Docker (ОСТОРОЖНО!)
make docker purge
# Обновление всех образов
make docker update
```
### Другие команды
```bash
# Создание секретов
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:
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
```
## 🤝 Вклад в проект
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)
## 📞 Поддержка
При возникновении проблем:
1. Проверьте наличие Docker и Docker Compose
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 функциональности**
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'ы для тестирования
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru