2025-03-18 17:25:06 +03:00

AnsibleLab - Универсальная система тестирования Ansible ролей

Автор: Сергей Антропов
Сайт: https://devops.org.ru Версия: 2.0.0

🚀 Описание

AnsibleLab - это универсальная система для тестирования Ansible ролей с использованием Docker, Molecule и различных preset'ов конфигурации. Система поддерживает multi-arch сборку, CI/CD интеграцию и работу с различными операционными системами.

📚 Документация

🚀 Быстрый старт

🛠️ Разработка

🏗️ CI/CD

  • docs/cicd-setup.md - Настройка CI/CD для GitHub Actions, Azure DevOps, Jenkins, GitLab CI

📊 Мониторинг

Ключевые возможности

🐳 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

1. Клонирование и настройка

git clone https://github.com/your-username/AnsibleLab.git
cd AnsibleLab

2. Настройка Docker

# Настройка multi-arch builder
make docker setup-builder

# Сборка всех образов (multi-arch)
make docker build

# Проверка собранных образов
make docker info

3. Управление ролями

# Просмотр всех ролей
make role list

# Создание новой роли (интерактивно)
make role create

# Удаление роли (интерактивно)
make role delete

4. Тестирование ролей

# Просмотр доступных 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:

# Просмотр всех доступных 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 Любое количество Пользовательские сценарии

Тестирование с собственными образами

# Проверка наличия собственных образов
make custom-images check

# Тестирование с собственными образами
make custom-images test minimal
make custom-images test full
make custom-images test performance

🐳 Docker образы

📖 Подробная документация: dockerfiles/README.md

Multi-Arch поддержка

Система поддерживает сборку для множества архитектур:

# Настройка 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

Управление образами

# Информация об образах
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

# Инициализация 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 контейнеры)

# Тестирование с разными 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 правами)

Пример динамического инвентори для тестирования:

# Автоматически создается из 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

Развертывание (Реальные серверы)

# Развертывание на реальные серверы
make role deploy                 # развертывание ролей

Инвентори для продакшн развертывания:

  • Источник: Статический файл inventory/hosts.ini
  • Расположение: inventory/hosts.ini
  • Содержимое: Реальные серверы с SSH подключением
  • Сеть: Интернет или внутренняя сеть
  • Пользователь: devops (настраивается в Makefile)

Пример продакшн инвентори:

# 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:

# Продакшн серверы
[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 ключей:

# Генерация 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. Тестирование подключения:

# Проверка подключения к серверам
ansible all -i inventory/hosts.ini -m ping

# Проверка конкретной группы
ansible web_servers -i inventory/hosts.ini -m ping

Особенности развертывания

Dry-run проверка:

# Проверка без изменений
make role deploy
# Выполняется: ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check

Подтверждение развертывания:

# Интерактивное подтверждение
make role deploy
# Запрашивается подтверждение: "Продолжить развертывание? (y/N):"

Логирование и мониторинг:

# Подробные логи
ANSIBLE_STDOUT_CALLBACK=yaml make role deploy

# Сохранение логов
make role deploy 2>&1 | tee deployment.log

🔧 Вспомогательные команды

Управление ролями

# Просмотр всех ролей
make role list

# Создание новой роли (интерактивно)
make role create

# Удаление роли (интерактивно)
make role delete

# Проверка синтаксиса ролей
make role lint                    # проверить все роли
make role lint devops             # проверить конкретную роль
make role lint ping               # проверить другую роль

Docker команды

# Очистка Docker ресурсов
make docker clean

# Полная очистка Docker (ОСТОРОЖНО!)
make docker purge

# Обновление всех образов
make docker update

Другие команды

# Создание секретов
make vault create

# Полная справка
make help

🏗️ CI/CD интеграция

📖 Подробное руководство: docs/cicd-setup.md

GitHub Actions

# .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

# 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

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

# .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 пайплайны автоматически тестируют новую роль

Настройка уведомлений:

# .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. Автоматическое обнаружение новых ролей:

# .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'ов:

#!/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:

# .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. Настройка уведомлений о новых ролях:

# .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. Автоматическое создание документации для новых ролей:

#!/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:

# .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. Автоматическое создание скриптов:

#!/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

Диагностика Docker

# Диагностика buildx проблем
make docker diagnose

# Проверка builder'а
make docker setup-builder

# Сброс builder'а при проблемах
make docker reset-builder

Логи и отчеты

# Просмотр логов контейнера
docker logs ansible-controller

# Вход в контейнер для отладки
docker exec -it ansible-controller bash

🛠️ Разработка

📖 Подробное руководство: docs/creating-roles.md

Создание новых preset'ов

  1. Создайте файл molecule/presets/my-preset.yml:
#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]
  1. Используйте preset:
make role test my-preset

Создание новых ролей

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. Структура файлов роли

roles/my-role/tasks/main.yml - основные задачи:

---
# Основные задачи для роли 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 - переменные по умолчанию:

---
# Переменные по умолчанию для роли 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 - обработчики:

---
# Обработчики для роли 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 - метаданные роли:

---
# Метаданные роли 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 - документация роли:

# Роль 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/

Ручная проверка конкретной роли:

# Lint проверка конкретной роли
ansible-lint roles/my-role/

# Тестирование конкретной роли
cd roles/my-role
molecule test

Автоматическое включение ролей в playbook'и:

В molecule/default/site.yml (для тестирования):

---
# Автоматически включает все роли из директории roles/
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru

- name: Тестирование всех ролей
  hosts: all
  roles:
    - ping          # Автоматически включается
    - my-role       # Автоматически включается
    # Добавьте сюда новые роли по мере их создания

В roles/deploy.yml (для продакшн развертывания):

---
# Автоматически включает все роли из директории roles/
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru

- name: Развертывание всех ролей
  hosts: all
  roles:
    - ping          # Автоматически включается
    - my-role       # Автоматически включается
    # Добавьте сюда новые роли по мере их создания

4. Интеграция с основным playbook

Обновление molecule/default/site.yml:

---
# Основной 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:

---
# 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 файлах):

# 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):

# 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

Переменные для конкретных групп:

# 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;
      }
  }

Переменные для конкретных хостов:

# inventory/host_vars/web1.example.com.yml
---
# Переменные для конкретного хоста
my_role_hostname: web1
my_role_domain: example.com
my_role_ssl_enabled: true

6. Тестирование новой роли

# 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. Полный цикл разработки роли

# 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 команду для автоматического обновления:

# Автоматическое обновление 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'и обновлены"

Использование:

# Автоматическое обновление playbook'ов
make update-playbooks

# Проверка обновленных playbook'ов
make role test

9. Автоматическое создание документации

Добавьте в 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 "✅ Документация сгенерирована"

Использование:

# Автоматическое создание документации
make generate-docs

# Проверка созданной документации
ls -la roles/*/README.md

10. Полный цикл с автоматизацией

# 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 и могут быть переопределены через переменные окружения:

# Основные настройки
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 конфигурация

# Переменные окружения для 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 - общие переменные:

---
# Общие переменные для всех серверов
# Автор: Сергей Антропов
# Сайт: 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 серверов:

---
# Переменные для 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 - переменные для конкретного хоста:

---
# Переменные для 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 - зашифрованные секреты:

---
# Зашифрованные секреты
# Автор: Сергей Антропов
# Сайт: 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:

---
# Основные задачи для роли 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:

# Конфигурация 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 не создается:

    make docker diagnose
    make docker reset-builder
    
  2. Образы не собираются:

    make docker clean
    make docker setup-builder
    make docker build
    
  3. Проблемы с multi-arch:

    make docker clean-builder
    make docker setup-builder
    

Проблемы с тестированием

  1. Preset не найден:

    make presets list
    # Проверьте наличие файла molecule/presets/your-preset.yml
    
  2. Контейнеры не создаются:

    make docker clean
    make role test
    
  3. Проблемы с systemd:

    # Проверьте, что образы поддерживают systemd
    make custom-images check
    

📈 Производительность

Оптимизация сборки

# Использование кеша Docker
make docker build

# Очистка кеша при проблемах
make docker rebuild

Оптимизация тестирования

# Использование 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

📞 Поддержка

При возникновении проблем:

  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 - Установка и первое тестирование
  2. dockerfiles/README.md - Изучение Docker образов
  3. docs/creating-roles.md - Создание первой роли

🛠️ Для разработчиков

  1. docs/creating-roles.md - Полное руководство по созданию ролей
  2. docs/cicd-setup.md - Настройка CI/CD
  3. docs/monitoring.md - Мониторинг и диагностика

🏗️ Для DevOps

  1. docs/cicd-setup.md - Настройка CI/CD для всех платформ
  2. docs/monitoring.md - Мониторинг и troubleshooting
  3. dockerfiles/README.md - Управление Docker образами

📖 Дополнительные ресурсы

  • Makefile - Все доступные команды
  • .ansible-lint - Конфигурация линтера
  • requirements.yml - Ansible коллекции
  • molecule/presets/ - Готовые preset'ы для тестирования

Автор: Сергей Антропов
Сайт: https://devops.org.ru

Description
DevOpsLab - это универсальная DevOps платформа для разработки, тестирования и развертывания инфраструктуры. Система объединяет Ansible роли, Docker контейнеры и Kubernetes кластеры в единую среду для автоматизации и управления инфраструктурой.
https://devops.org.ru
Readme 2.6 MiB
Languages
Makefile 46.6%
Dockerfile 21.3%
Python 19.5%
Shell 12.6%