feat: Полная переработка документации и структуры проекта

- Переписан главный README.md с подробной навигацией
- Создана структурированная документация в docs/:
  - getting-started.md - быстрый старт
  - creating-roles.md - создание ролей
  - cicd-setup.md - настройка CI/CD
  - monitoring.md - мониторинг и диагностика
  - site-yml-guide.md - руководство по site.yml
  - molecule-guide.md - подробное руководство по Molecule
- Переписан dockerfiles/README.md с детальным описанием всех образов
- Перенесен deploy.yml из корня в roles/ для лучшей организации
- Обновлен site.yml для импорта roles/deploy.yml
- Добавлены fallback значения в create.yml для надежности
- Созданы скрипты автоматизации:
  - update-playbooks.sh - обновление playbook'ов
  - generate-role-docs.sh - генерация документации
  - setup-cicd.sh - настройка CI/CD
- Добавлен env.example с примерами переменных
- Обновлен Makefile с новыми командами автоматизации
- Улучшена навигация по документации
This commit is contained in:
Сергей Антропов
2025-10-25 18:11:36 +03:00
parent 1a4e52aab2
commit 94560ffaaa
19 changed files with 6986 additions and 270 deletions

View File

View File

@@ -40,7 +40,7 @@ DOCKER_BUILDX_BUILDER ?= multiarch-builder
# Базовые образы и их теги
BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi quay.io/centos/centos:stream9 almalinux:8 rockylinux:8
.PHONY: role vault git docker presets controller help
.PHONY: role vault git docker presets controller help update-playbooks generate-docs setup-cicd
# =============================================================================
# КОМАНДЫ ДЛЯ РАБОТЫ С РОЛЯМИ
@@ -97,7 +97,7 @@ role:
-v ~/.ssh:/root/.ssh:ro \
-e ANSIBLE_FORCE_COLOR=1 \
$(DOCKER_IMAGE) \
bash -c "ansible-playbook -i inventory/hosts.ini deploy.yml --check"; \
bash -c "ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check"; \
echo ""; \
read -p "Продолжить развертывание? (y/N): " confirm; \
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
@@ -105,7 +105,7 @@ role:
-v ~/.ssh:/root/.ssh:ro \
-e ANSIBLE_FORCE_COLOR=1 \
$(DOCKER_IMAGE) \
bash -c "ansible-playbook -i inventory/hosts.ini deploy.yml"; \
bash -c "ansible-playbook -i inventory/hosts.ini roles/deploy.yml"; \
else \
echo "❌ Развертывание отменено"; \
fi;; \
@@ -942,6 +942,11 @@ help:
@echo " make docker diagnose - диагностика buildx проблем"
@echo " make docker reset-builder - сброс buildx builder"
@echo " 💡 Поддерживает: amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6"
@echo ""
@echo "🔧 АВТОМАТИЗАЦИЯ:"
@echo " make update-playbooks - обновление playbook'ов при добавлении ролей"
@echo " make generate-docs - генерация документации для ролей"
@echo " make setup-cicd - настройка CI/CD для всех платформ"
@echo " 💡 Безопасно: использует inspect вместо buildx ls (избегает зависаний)"
@echo ""
@echo "🔐 VAULT (управление секретами):"
@@ -1038,6 +1043,25 @@ custom-images:
echo " - inecs/ansible-lab:debian-latest";; \
esac
# =============================================================================
# АВТОМАТИЗАЦИЯ
# =============================================================================
update-playbooks:
@echo "🔄 Обновление playbook'ов..."
@chmod +x scripts/update-playbooks.sh
@./scripts/update-playbooks.sh
generate-docs:
@echo "📚 Генерация документации..."
@chmod +x scripts/generate-role-docs.sh
@./scripts/generate-role-docs.sh
setup-cicd:
@echo "🔧 Настройка CI/CD..."
@chmod +x scripts/setup-cicd.sh
@./scripts/setup-cicd.sh
# Пустые цели для совместимости
view create edit show delete lint deploy new advanced list info test build push pull clean prepare update run stop purge clean-builder setup-builder diagnose reset-builder build-image:
@true

2156
README.md

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +0,0 @@
---
# Плейбук для развертывания ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Test ping role
hosts: all
become: false
roles:
- ping
tags:
- ping
- test

View File

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

913
docs/cicd-setup.md Normal file
View File

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

571
docs/creating-roles.md Normal file
View File

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

291
docs/getting-started.md Normal file
View File

@@ -0,0 +1,291 @@
# Быстрый старт с AnsibleTemplate
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## 🚀 Установка и настройка
### 1. Клонирование репозитория
```bash
git clone https://github.com/your-username/AnsibleTemplate.git
cd AnsibleTemplate
```
### 2. Настройка переменных окружения
```bash
# Копирование файла переменных
cp env.example .env
# Редактирование переменных
nano .env
```
### 3. Настройка Docker
```bash
# Настройка multi-arch builder
make docker setup-builder
# Сборка всех образов
make docker build
# Проверка собранных образов
make docker info
```
## 🧪 Первое тестирование
### 1. Просмотр доступных preset'ов
```bash
# Список всех preset'ов
make presets list
# Информация о конкретном preset'е
make presets info PRESET=default
```
### 2. Тестирование роли ping
```bash
# Тестирование с default preset
make role test
# Тестирование с minimal preset
make role test minimal
```
### 3. Проверка результатов
```bash
# Просмотр логов
docker logs ansible-controller
# Вход в контейнер для отладки
docker exec -it ansible-controller bash
```
## 🔧 Создание первой роли
### 1. Создание структуры роли
```bash
# Создание директории роли
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
# Создание основных файлов
touch roles/my-role/{tasks,handlers,meta}/main.yml
touch roles/my-role/defaults/main.yml
touch roles/my-role/vars/main.yml
touch roles/my-role/README.md
```
### 2. Разработка роли
**`roles/my-role/tasks/main.yml`:**
```yaml
---
# Основные задачи для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Установка пакетов
package:
name: "{{ my_role_packages }}"
state: present
when: my_role_enabled | default(true)
tags:
- my-role
- install
- name: Настройка конфигурации
template:
src: my-role.conf.j2
dest: /etc/my-role/my-role.conf
owner: root
group: root
mode: '0644'
notify: restart my-role
tags:
- my-role
- config
```
**`roles/my-role/defaults/main.yml`:**
```yaml
---
# Переменные по умолчанию для роли my-role
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Основные настройки
my_role_enabled: true
my_role_packages:
- nginx
- curl
# Конфигурация
my_role_config_file: /etc/my-role/my-role.conf
my_role_log_level: info
```
### 3. Тестирование роли
```bash
# Lint проверка
make role lint
# Тестирование в Docker
make role test minimal
# Тестирование с custom preset
make role test my-custom-preset
```
## 🚀 Развертывание на продакшн
### 1. Настройка инвентори
**`inventory/hosts.ini`:**
```ini
# Продакшн серверы
[web_servers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11
[db_servers]
db1.example.com ansible_host=192.168.1.20
db2.example.com ansible_host=192.168.1.21
[all:vars]
ansible_user=devops
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
```
### 2. Настройка SSH ключей
```bash
# Генерация SSH ключа
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
# Копирование ключа на серверы
ssh-copy-id devops@web1.example.com
ssh-copy-id devops@web2.example.com
```
### 3. Тестирование подключения
```bash
# Проверка подключения
ansible all -i inventory/hosts.ini -m ping
# Dry-run развертывания
make role deploy
```
### 4. Развертывание
```bash
# Развертывание на продакшн
make role deploy
# Подтвердить развертывание: y
```
## 🔐 Управление секретами
### 1. Инициализация vault
```bash
# Создание файла пароля
make vault init
# Создание файла секретов
make vault create
```
### 2. Работа с секретами
```bash
# Редактирование секретов
make vault edit
# Просмотр секретов
make vault show
# Шифрование файла
make vault encrypt
```
## 🏗️ CI/CD интеграция
### 1. GitHub Actions
```yaml
# .github/workflows/ansible-test.yml
name: Ansible Testing
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: make role test
```
### 2. Azure DevOps
```yaml
# azure-pipelines.yml
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
stages:
- stage: Test
jobs:
- job: TestJob
steps:
- script: make role test
```
## 📊 Мониторинг и диагностика
### 1. Диагностика Docker
```bash
# Диагностика buildx проблем
make docker diagnose
# Проверка builder'а
make docker setup-builder
# Сброс builder'а при проблемах
make docker reset-builder
```
### 2. Логи и отчеты
```bash
# Просмотр логов контейнера
docker logs ansible-controller
# Вход в контейнер для отладки
docker exec -it ansible-controller bash
```
## 🎯 Следующие шаги
1. **Изучите документацию** по [созданию ролей](creating-roles.md)
2. **Настройте CI/CD** по [инструкции](cicd-setup.md)
3. **Изучите Docker образы** в [dockerfiles/README.md](../dockerfiles/README.md)
4. **Настройте мониторинг** по [руководству](monitoring.md)
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

859
docs/molecule-guide.md Normal file
View File

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

593
docs/monitoring.md Normal file
View File

@@ -0,0 +1,593 @@
# Мониторинг и диагностика AnsibleTemplate
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## 🔍 Диагностика Docker
### Проверка состояния Docker
```bash
# Проверка статуса Docker
docker info
# Проверка запущенных контейнеров
docker ps -a
# Проверка образов
docker images | grep inecs/ansible-lab
# Проверка сетей
docker network ls
```
### Диагностика buildx проблем
```bash
# Диагностика buildx
make docker diagnose
# Проверка builder'а
make docker setup-builder
# Сброс builder'а при проблемах
make docker reset-builder
```
### Логи Docker
```bash
# Логи Docker daemon
sudo journalctl -u docker.service
# Логи конкретного контейнера
docker logs ansible-controller
# Логи с временными метками
docker logs -t ansible-controller
# Следить за логами в реальном времени
docker logs -f ansible-controller
```
## 🧪 Диагностика тестирования
### Проверка preset'ов
```bash
# Список доступных preset'ов
make presets list
# Информация о конкретном preset'е
make presets info PRESET=default
# Проверка файлов preset'ов
ls -la molecule/presets/
```
### Проверка инвентори
```bash
# Проверка тестового инвентори
cat ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini
# Проверка продакшн инвентори
cat inventory/hosts.ini
# Тестирование подключения
ansible all -i inventory/hosts.ini -m ping
```
### Логи тестирования
```bash
# Логи Molecule
ls -la molecule/default/.molecule/
# Логи конкретного теста
cat molecule/default/.molecule/test/ansible.log
# Логи Ansible
cat molecule/default/.molecule/test/ansible.log | grep ERROR
```
## 📊 Мониторинг производительности
### Мониторинг ресурсов
```bash
# Использование CPU и памяти
docker stats
# Использование диска
df -h
# Использование памяти
free -h
# Процессы Docker
ps aux | grep docker
```
### Мониторинг сети
```bash
# Статистика сети
docker network inspect labnet
# Подключения к портам
netstat -tulpn | grep docker
# Проверка DNS
nslookup docker.io
```
### Мониторинг логов
```bash
# Логи системы
sudo journalctl -f
# Логи Docker
sudo journalctl -u docker.service -f
# Логи Ansible
tail -f /var/log/ansible.log
```
## 🔧 Диагностика ролей
### Проверка синтаксиса
```bash
# Lint проверка всех ролей
make role lint
# Lint проверка конкретной роли
ansible-lint roles/my-role/
# Проверка синтаксиса YAML
ansible-playbook --syntax-check roles/my-role/tasks/main.yml
```
### Проверка переменных
```bash
# Проверка переменных роли
ansible-inventory --list -i inventory/hosts.ini
# Проверка переменных для конкретного хоста
ansible-inventory --host web1.example.com -i inventory/hosts.ini
# Проверка переменных группы
ansible-inventory --host web_servers -i inventory/hosts.ini
```
### Тестирование ролей
```bash
# Тестирование с verbose выводом
ansible-playbook -i inventory/hosts.ini site.yml -vvv
# Тестирование конкретной роли
ansible-playbook -i inventory/hosts.ini site.yml --tags my-role
# Тестирование с dry-run
ansible-playbook -i inventory/hosts.ini site.yml --check
```
## 🚨 Алерты и уведомления
### Настройка алертов
```bash
#!/bin/bash
# scripts/monitor.sh
# Скрипт мониторинга AnsibleTemplate
# Проверка Docker
if ! docker info >/dev/null 2>&1; then
echo "❌ Docker не запущен"
# Отправка уведомления
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Docker не запущен в AnsibleTemplate"}' \
$SLACK_WEBHOOK_URL
fi
# Проверка образов
if ! docker images | grep -q inecs/ansible-lab; then
echo "❌ Образы AnsibleTemplate не найдены"
# Отправка уведомления
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Образы AnsibleTemplate не найдены"}' \
$SLACK_WEBHOOK_URL
fi
# Проверка preset'ов
if [ ! -d "molecule/presets" ]; then
echo "❌ Директория preset'ов не найдена"
# Отправка уведомления
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Директория preset'ов не найдена"}' \
$SLACK_WEBHOOK_URL
fi
echo "✅ Мониторинг завершен"
```
### Настройка cron для мониторинга
```bash
# Добавление в crontab
crontab -e
# Проверка каждые 5 минут
*/5 * * * * /path/to/scripts/monitor.sh
# Проверка каждый час
0 * * * * /path/to/scripts/monitor.sh
# Проверка каждый день в 9:00
0 9 * * * /path/to/scripts/monitor.sh
```
## 📈 Метрики и отчеты
### Сбор метрик
```bash
#!/bin/bash
# scripts/collect-metrics.sh
# Сбор метрик AnsibleTemplate
echo "📊 Сбор метрик AnsibleTemplate..."
# Создание директории для метрик
mkdir -p metrics
# Метрики Docker
echo "=== Docker Metrics ===" > metrics/docker.txt
docker info >> metrics/docker.txt
docker images >> metrics/docker.txt
docker ps -a >> metrics/docker.txt
# Метрики системы
echo "=== System Metrics ===" > metrics/system.txt
df -h >> metrics/system.txt
free -h >> metrics/system.txt
uptime >> metrics/system.txt
# Метрики Ansible
echo "=== Ansible Metrics ===" > metrics/ansible.txt
ansible --version >> metrics/ansible.txt
ansible-galaxy list >> metrics/ansible.txt
# Метрики ролей
echo "=== Roles Metrics ===" > metrics/roles.txt
find roles/ -name "main.yml" -path "*/tasks/*" | wc -l >> metrics/roles.txt
ls -la roles/ >> metrics/roles.txt
echo "✅ Метрики собраны"
```
### Генерация отчетов
```bash
#!/bin/bash
# scripts/generate-report.sh
# Генерация отчета о состоянии AnsibleTemplate
echo "📋 Генерация отчета..."
# Создание директории для отчетов
mkdir -p reports
# Отчет о Docker
cat > reports/docker-report.md << EOF
# Docker Report
## Образы
\`\`\`
$(docker images | grep inecs/ansible-lab)
\`\`\`
## Контейнеры
\`\`\`
$(docker ps -a)
\`\`\`
## Сети
\`\`\`
$(docker network ls)
\`\`\`
EOF
# Отчет о ролях
cat > reports/roles-report.md << EOF
# Roles Report
## Количество ролей
$(find roles/ -name "main.yml" -path "*/tasks/*" | wc -l)
## Список ролей
\`\`\`
$(find roles/ -name "main.yml" -path "*/tasks/*" | sed 's|roles/||; s|/tasks/main.yml||')
\`\`\`
EOF
# Отчет о preset'ах
cat > reports/presets-report.md << EOF
# Presets Report
## Количество preset'ов
$(ls -1 molecule/presets/*.yml | wc -l)
## Список preset'ов
\`\`\`
$(ls -1 molecule/presets/*.yml | sed 's|molecule/presets/||g' | sed 's|\.yml||g')
\`\`\`
EOF
echo "✅ Отчеты сгенерированы"
```
## 🔍 Отладка проблем
### Общие проблемы
#### 1. Docker не запускается
```bash
# Проверка статуса Docker
sudo systemctl status docker
# Запуск Docker
sudo systemctl start docker
# Проверка логов
sudo journalctl -u docker.service
```
#### 2. Образы не собираются
```bash
# Проверка builder'а
make docker diagnose
# Сброс builder'а
make docker reset-builder
# Очистка кеша
make docker clean
```
#### 3. Тесты не проходят
```bash
# Проверка preset'ов
make presets list
# Проверка инвентори
cat ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini
# Проверка логов
docker logs ansible-controller
```
#### 4. Роли не работают
```bash
# Проверка синтаксиса
make role lint
# Проверка переменных
ansible-inventory --list -i inventory/hosts.ini
# Тестирование с verbose
ansible-playbook -i inventory/hosts.ini site.yml -vvv
```
### Логи для отладки
```bash
# Сбор всех логов
mkdir -p debug-logs
# Логи Docker
docker info > debug-logs/docker-info.txt
docker images > debug-logs/docker-images.txt
docker ps -a > debug-logs/docker-containers.txt
# Логи системы
df -h > debug-logs/disk-usage.txt
free -h > debug-logs/memory-usage.txt
ps aux > debug-logs/processes.txt
# Логи Ansible
ansible --version > debug-logs/ansible-version.txt
ansible-galaxy list > debug-logs/ansible-galaxy.txt
# Логи ролей
find roles/ -name "*.yml" -exec ansible-playbook --syntax-check {} \; > debug-logs/roles-syntax.txt
```
## 📊 Дашборд мониторинга
### Простой дашборд
```bash
#!/bin/bash
# scripts/dashboard.sh
# Простой дашборд мониторинга
echo "📊 AnsibleTemplate Dashboard"
echo "=========================="
# Статус Docker
if docker info >/dev/null 2>&1; then
echo "✅ Docker: Запущен"
else
echo "❌ Docker: Не запущен"
fi
# Количество образов
IMAGES=$(docker images | grep inecs/ansible-lab | wc -l)
echo "📦 Образы: $IMAGES"
# Количество ролей
ROLES=$(find roles/ -name "main.yml" -path "*/tasks/*" | wc -l)
echo "🎭 Роли: $ROLES"
# Количество preset'ов
PRESETS=$(ls -1 molecule/presets/*.yml 2>/dev/null | wc -l)
echo "⚙️ Preset'ы: $PRESETS"
# Использование диска
DISK=$(df -h . | tail -1 | awk '{print $5}')
echo "💾 Диск: $DISK"
# Использование памяти
MEMORY=$(free -h | grep Mem | awk '{print $3 "/" $2}')
echo "🧠 Память: $MEMORY"
echo "=========================="
```
### Веб-дашборд
```html
<!DOCTYPE html>
<html>
<head>
<title>AnsibleTemplate Dashboard</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.status { padding: 10px; margin: 10px 0; border-radius: 5px; }
.success { background-color: #d4edda; color: #155724; }
.error { background-color: #f8d7da; color: #721c24; }
.info { background-color: #d1ecf1; color: #0c5460; }
</style>
</head>
<body>
<h1>📊 AnsibleTemplate Dashboard</h1>
<div id="status"></div>
<script>
function updateStatus() {
fetch('/api/status')
.then(response => response.json())
.then(data => {
const statusDiv = document.getElementById('status');
statusDiv.innerHTML = `
<div class="status ${data.docker ? 'success' : 'error'}">
Docker: ${data.docker ? '✅ Запущен' : '❌ Не запущен'}
</div>
<div class="status info">
Образы: ${data.images}
</div>
<div class="status info">
Роли: ${data.roles}
</div>
<div class="status info">
Preset'ы: ${data.presets}
</div>
`;
})
.catch(error => {
console.error('Error:', error);
});
}
// Обновление каждые 30 секунд
setInterval(updateStatus, 30000);
updateStatus();
</script>
</body>
</html>
```
## 🔧 Автоматизация мониторинга
### Настройка мониторинга
```bash
#!/bin/bash
# scripts/setup-monitoring.sh
# Настройка мониторинга AnsibleTemplate
echo "🔧 Настройка мониторинга..."
# Создание директорий
mkdir -p {scripts,metrics,reports,debug-logs}
# Создание скрипта мониторинга
cat > scripts/monitor.sh << 'EOF'
#!/bin/bash
# Скрипт мониторинга AnsibleTemplate
# Проверка Docker
if ! docker info >/dev/null 2>&1; then
echo "❌ Docker не запущен"
exit 1
fi
# Проверка образов
if ! docker images | grep -q inecs/ansible-lab; then
echo "❌ Образы AnsibleTemplate не найдены"
exit 1
fi
echo "✅ Мониторинг завершен"
EOF
# Создание скрипта сбора метрик
cat > scripts/collect-metrics.sh << 'EOF'
#!/bin/bash
# Сбор метрик AnsibleTemplate
echo "📊 Сбор метрик..."
# Метрики Docker
docker info > metrics/docker-info.txt
docker images > metrics/docker-images.txt
# Метрики системы
df -h > metrics/disk-usage.txt
free -h > metrics/memory-usage.txt
echo "✅ Метрики собраны"
EOF
# Создание скрипта генерации отчетов
cat > scripts/generate-report.sh << 'EOF'
#!/bin/bash
# Генерация отчета о состоянии AnsibleTemplate
echo "📋 Генерация отчета..."
# Отчет о Docker
cat > reports/docker-report.md << EOL
# Docker Report
## Образы
\`\`\`
$(docker images | grep inecs/ansible-lab)
\`\`\`
EOL
echo "✅ Отчеты сгенерированы"
EOF
# Делаем скрипты исполняемыми
chmod +x scripts/*.sh
echo "✅ Мониторинг настроен"
```
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

248
docs/site-yml-guide.md Normal file
View File

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

256
env.example Normal file
View File

@@ -0,0 +1,256 @@
# AnsibleTemplate - Переменные окружения
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# =============================================================================
# ОСНОВНЫЕ НАСТРОЙКИ
# =============================================================================
# Название проекта
PROJECT_NAME=ansible-template
# Версия проекта
VERSION=2.0.0
# Автор проекта
AUTHOR="Сергей Антропов"
# Сайт автора
SITE="https://devops.org.ru"
# =============================================================================
# DOCKER НАСТРОЙКИ
# =============================================================================
# Docker образ для ansible-controller
DOCKER_IMAGE=inecs/ansible-lab:ansible-controller-latest
# Docker образ для DinD (Docker-in-Docker)
DOCKER_DIND_IMAGE=docker:27-dind
# Имя контейнера ansible-controller
CONTAINER_NAME=ansible-controller
# =============================================================================
# DOCKER HUB НАСТРОЙКИ
# =============================================================================
# Docker registry для образов
DOCKER_REGISTRY=inecs/ansible-lab
# Версия образов
DOCKER_VERSION=latest
# Список образов для сборки
DOCKER_IMAGES=ansible-controller alt-linux astra-linux redos rhel centos alma rocky ubuntu debian
# =============================================================================
# MULTI-ARCH НАСТРОЙКИ
# =============================================================================
# Поддерживаемые архитектуры
DOCKER_PLATFORMS=linux/amd64,linux/arm64
# Имя buildx builder'а
DOCKER_BUILDX_BUILDER=multiarch-builder
# =============================================================================
# ANSIBLE НАСТРОЙКИ
# =============================================================================
# Принудительное использование цветов
ANSIBLE_FORCE_COLOR=1
# Callback для вывода
ANSIBLE_STDOUT_CALLBACK=yaml
# Включенные callback'и
ANSIBLE_CALLBACKS_ENABLED=profile_tasks
# =============================================================================
# MOLECULE НАСТРОЙКИ
# =============================================================================
# Директория для временных файлов Molecule
MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule_workspace
# Preset по умолчанию
MOLECULE_PRESET=default
# =============================================================================
# VAULT НАСТРОЙКИ
# =============================================================================
# Файл пароля для vault
VAULT_PASSWORD_FILE=vault/.vault
# ID для шифрования vault
VAULT_ID=default
# =============================================================================
# SSH НАСТРОЙКИ
# =============================================================================
# Пользователь для SSH подключения
ANSIBLE_USER=devops
# SSH ключ для подключения
ANSIBLE_SSH_PRIVATE_KEY_FILE=~/.ssh/id_rsa
# Дополнительные аргументы SSH
ANSIBLE_SSH_COMMON_ARGS='-o StrictHostKeyChecking=no'
# Проверка SSH ключей
ANSIBLE_HOST_KEY_CHECKING=False
# =============================================================================
# ИНВЕНТОРИ НАСТРОЙКИ
# =============================================================================
# Файл инвентори по умолчанию
ANSIBLE_INVENTORY=inventory/hosts.ini
# Путь к ролям
ANSIBLE_ROLES_PATH=roles/
# Интерпретатор Python
ANSIBLE_INTERPRETER_PYTHON=auto
# =============================================================================
# ЛОГИРОВАНИЕ
# =============================================================================
# Уровень логирования
LOG_LEVEL=INFO
# Файл логов
LOG_FILE=ansible.log
# Максимальный размер лог файла
LOG_MAX_SIZE=100M
# Количество лог файлов
LOG_MAX_FILES=5
# =============================================================================
# УВЕДОМЛЕНИЯ
# =============================================================================
# Slack webhook URL для уведомлений
SLACK_WEBHOOK_URL=
# Teams webhook URL для уведомлений
TEAMS_WEBHOOK_URL=
# Email для уведомлений
NOTIFICATION_EMAIL=
# =============================================================================
# МОНИТОРИНГ
# =============================================================================
# Интервал мониторинга (в секундах)
MONITORING_INTERVAL=300
# Включить мониторинг
MONITORING_ENABLED=true
# Директория для метрик
METRICS_DIRECTORY=metrics
# Директория для отчетов
REPORTS_DIRECTORY=reports
# =============================================================================
# CI/CD НАСТРОЙКИ
# =============================================================================
# Ветка по умолчанию
DEFAULT_BRANCH=main
# Включить автоматическое тестирование
AUTO_TEST_ENABLED=true
# Включить автоматическое развертывание
AUTO_DEPLOY_ENABLED=false
# =============================================================================
# БЕЗОПАСНОСТЬ
# =============================================================================
# Включить сканирование секретов
SECRET_SCANNING_ENABLED=true
# Включить проверку уязвимостей
VULNERABILITY_SCANNING_ENABLED=true
# Включить подписывание образов
IMAGE_SIGNING_ENABLED=false
# =============================================================================
# ПРОИЗВОДИТЕЛЬНОСТЬ
# =============================================================================
# Количество параллельных задач
ANSIBLE_FORKS=5
# Таймаут для задач (в секундах)
ANSIBLE_TIMEOUT=30
# Включить кеширование
ANSIBLE_CACHE_ENABLED=true
# =============================================================================
# РАЗРАБОТКА
# =============================================================================
# Включить автоматическое создание документации
AUTO_DOCS_ENABLED=true
# Включить автоматическое обновление playbook'ов
AUTO_UPDATE_PLAYBOOKS_ENABLED=true
# Включить автоматическое создание скриптов
AUTO_CREATE_SCRIPTS_ENABLED=true
# =============================================================================
# ОТЛАДКА
# =============================================================================
# Включить отладочный режим
DEBUG_MODE=false
# Включить подробные логи
VERBOSE_LOGS=false
# Включить профилирование
PROFILING_ENABLED=false
# =============================================================================
# ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
# =============================================================================
# 1. Копирование файла переменных
# cp env.example .env
# 2. Редактирование переменных
# nano .env
# 3. Загрузка переменных
# source .env
# 4. Использование в Makefile
# make docker build DOCKER_REGISTRY=my-registry.com
# 5. Использование в Ansible
# ansible-playbook site.yml -e "ansible_user=${ANSIBLE_USER}"
# =============================================================================
# ПРИМЕЧАНИЯ
# =============================================================================
# - Все переменные имеют значения по умолчанию
# - Переменные можно переопределить через .env файл
# - Переменные можно передавать через командную строку
# - Переменные можно задавать через переменные окружения
# - Приоритет: командная строка > .env файл > значения по умолчанию

View File

@@ -10,10 +10,15 @@
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
images:
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
rhel: "quay.io/centos/centos:stream9-systemd"
ubuntu: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
centos: "quay.io/centos/centos:stream9-systemd"
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos: "inecs/ansible-lab:centos-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu: "inecs/ansible-lab:ubuntu-latest"
debian: "inecs/ansible-lab:debian-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"

View File

@@ -1,29 +1,181 @@
---
# Универсальный плейбук для тестирования
# Универсальный playbook для тестирования Ansible ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
#
# Этот файл отвечает за:
# 1. Обновление пакетов в контейнерах при запуске тестов
# 2. Установку common tools для корректной работы тестов
# 3. Подготовку окружения для тестирования ролей
# 4. Запуск всех ролей из директории roles/
- name: Base deps
- name: Подготовка окружения для тестирования
hosts: all
become: true
tasks:
- name: Update apt cache (Debian)
# Обновление кеша пакетов для Debian/Ubuntu
- name: Update package cache (Debian/Ubuntu)
apt:
update_cache: true
cache_valid_time: 3600
when: ansible_os_family == 'Debian'
changed_when: false
tags:
- setup
- update
- name: Common tools
raw: dnf install -y curl jq ca-certificates iproute2 iputils procps-ng net-tools sudo vim || yum install -y curl jq ca-certificates iproute2 iputils procps-ng net-tools sudo vim || apt-get update && apt-get install -y curl jq ca-certificates iproute2 iputils-ping procps net-tools sudo vim || true
ignore_errors: true
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
yum:
update_cache: true
when: ansible_os_family == 'RedHat'
changed_when: false
tags:
- setup
- update
- name: Update ansible-lint
raw: pip install --upgrade ansible-lint --quiet --no-warn-script-location || true
ignore_errors: true
# Обновление кеша пакетов для Alt Linux
- name: Update package cache (Alt Linux)
apt:
update_cache: true
when: ansible_distribution == 'Alt'
changed_when: false
tags:
- setup
- update
- name: Install ansible collections
raw: ansible-galaxy collection install -r requirements.yml --force --no-deps --upgrade || true
ignore_errors: true
# Установка common tools для всех ОС
- name: Install common tools (Debian/Ubuntu)
apt:
name:
- curl
- jq
- ca-certificates
- iproute2
- iputils-ping
- procps
- net-tools
- sudo
- vim
- wget
- unzip
- git
state: present
update_cache: false
when: ansible_os_family == 'Debian'
tags:
- setup
- tools
- import_playbook: ../../deploy.yml
- name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
yum:
name:
- curl
- jq
- ca-certificates
- iproute
- iputils
- procps-ng
- net-tools
- sudo
- vim
- wget
- unzip
- git
state: present
when: ansible_os_family == 'RedHat'
tags:
- setup
- tools
- name: Install common tools (Alt Linux)
apt:
name:
- curl
- jq
- ca-certificates
- iproute2
- iputils
- procps
- net-tools
- sudo
- vim
- wget
- unzip
- git
state: present
when: ansible_distribution == 'Alt'
tags:
- setup
- tools
# Установка Python для Ansible (если не установлен)
- name: Install Python (Debian/Ubuntu)
apt:
name:
- python3
- python3-pip
- python3-venv
state: present
when: ansible_os_family == 'Debian'
tags:
- setup
- python
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
yum:
name:
- python3
- python3-pip
state: present
when: ansible_os_family == 'RedHat'
tags:
- setup
- python
- name: Install Python (Alt Linux)
apt:
name:
- python3
- python3-pip
state: present
when: ansible_distribution == 'Alt'
tags:
- setup
- python
# Создание пользователя для тестирования
- name: Create test user
user:
name: testuser
shell: /bin/bash
create_home: yes
state: present
tags:
- setup
- user
# Настройка sudo для тестового пользователя
- name: Configure sudo for test user
lineinfile:
path: /etc/sudoers
line: "testuser ALL=(ALL) NOPASSWD:ALL"
state: present
validate: 'visudo -cf %s'
tags:
- setup
- sudo
# Создание директории для тестов
- name: Create test directory
file:
path: /tmp/ansible-test
state: directory
mode: '0755'
owner: testuser
group: testuser
tags:
- setup
- directory
- import_playbook: ../../roles/deploy.yml

9
roles/deploy.yml Normal file
View File

@@ -0,0 +1,9 @@
---
# Playbook для развертывания на продакшн серверах
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Развертывание всех ролей
hosts: all
roles:
- ping

View File

@@ -13,7 +13,7 @@
## Как использовать:
### Вариант 1: Использование в deploy.yml (уже добавлено)
### Вариант 1: Использование в roles/deploy.yml (уже добавлено)
```bash
# Запуск только роли ping

58
scripts/generate-role-docs.sh Executable file
View File

@@ -0,0 +1,58 @@
#!/bin/bash
# Автоматическое создание документации для новых ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
set -euo pipefail
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 "✅ Документация сгенерирована"

103
scripts/setup-cicd.sh Executable file
View File

@@ -0,0 +1,103 @@
#!/bin/bash
# Автоматическая настройка CI/CD для AnsibleTemplate
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
set -euo pipefail
echo "🔧 Настройка CI/CD для AnsibleTemplate..."
# Создание директории .github/workflows
mkdir -p .github/workflows
# Создание базового workflow для GitHub Actions
echo "📝 Создание GitHub Actions workflow..."
cat > .github/workflows/ansible-test.yml << 'EOF'
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
EOF
# Создание Azure DevOps pipeline
echo "📝 Создание Azure DevOps pipeline..."
cat > azure-pipelines.yml << 'EOF'
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
stages:
- stage: Test
jobs:
- job: TestJob
steps:
- script: make role test
EOF
# Создание Jenkinsfile
echo "📝 Создание Jenkinsfile..."
cat > Jenkinsfile << 'EOF'
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'make role test'
}
}
}
}
EOF
# Создание GitLab CI
echo "📝 Создание GitLab CI..."
cat > .gitlab-ci.yml << 'EOF'
stages:
- test
test:
stage: test
script:
- make role test
EOF
echo "✅ CI/CD настроен"

222
scripts/update-playbooks.sh Executable file
View File

@@ -0,0 +1,222 @@
#!/bin/bash
# Автоматическое обновление playbook'ов при добавлении новых ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
set -euo pipefail
echo "🔍 Обнаружение новых ролей..."
# Получаем список всех ролей
ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | sed 's|^/||' | grep -v '^$' | tr '\n' ' ')
echo "📋 Найденные роли: $ROLES"
# Обновляем molecule/default/site.yml (только если файл не существует)
if [ ! -f "molecule/default/site.yml" ]; then
echo "📝 Создание molecule/default/site.yml..."
cat > molecule/default/site.yml << 'EOF'
---
# Универсальный playbook для тестирования Ansible ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
#
# Этот файл отвечает за:
# 1. Обновление пакетов в контейнерах при запуске тестов
# 2. Установку common tools для корректной работы тестов
# 3. Подготовку окружения для тестирования ролей
# 4. Импорт roles/deploy.yml для запуска ролей
- name: Подготовка окружения для тестирования
hosts: all
become: true
tasks:
# Обновление кеша пакетов для Debian/Ubuntu
- name: Update package cache (Debian/Ubuntu)
apt:
update_cache: true
cache_valid_time: 3600
when: ansible_os_family == 'Debian'
changed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
yum:
update_cache: true
when: ansible_os_family == 'RedHat'
changed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для Alt Linux
- name: Update package cache (Alt Linux)
apt:
update_cache: true
when: ansible_distribution == 'Alt'
changed_when: false
tags:
- setup
- update
# Установка common tools для всех ОС
- name: Install common tools (Debian/Ubuntu)
apt:
name:
- curl
- jq
- ca-certificates
- iproute2
- iputils-ping
- procps
- net-tools
- sudo
- vim
- wget
- unzip
- git
state: present
update_cache: false
when: ansible_os_family == 'Debian'
tags:
- setup
- tools
- name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
yum:
name:
- curl
- jq
- ca-certificates
- iproute
- iputils
- procps-ng
- net-tools
- sudo
- vim
- wget
- unzip
- git
state: present
when: ansible_os_family == 'RedHat'
tags:
- setup
- tools
- name: Install common tools (Alt Linux)
apt:
name:
- curl
- jq
- ca-certificates
- iproute2
- iputils
- procps
- net-tools
- sudo
- vim
- wget
- unzip
- git
state: present
when: ansible_distribution == 'Alt'
tags:
- setup
- tools
# Установка Python для Ansible (если не установлен)
- name: Install Python (Debian/Ubuntu)
apt:
name:
- python3
- python3-pip
- python3-venv
state: present
when: ansible_os_family == 'Debian'
tags:
- setup
- python
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
yum:
name:
- python3
- python3-pip
state: present
when: ansible_os_family == 'RedHat'
tags:
- setup
- python
- name: Install Python (Alt Linux)
apt:
name:
- python3
- python3-pip
state: present
when: ansible_distribution == 'Alt'
tags:
- setup
- python
# Создание пользователя для тестирования
- name: Create test user
user:
name: testuser
shell: /bin/bash
create_home: yes
state: present
tags:
- setup
- user
# Настройка sudo для тестового пользователя
- name: Configure sudo for test user
lineinfile:
path: /etc/sudoers
line: "testuser ALL=(ALL) NOPASSWD:ALL"
state: present
validate: 'visudo -cf %s'
tags:
- setup
- sudo
# Создание директории для тестов
- name: Create test directory
file:
path: /tmp/ansible-test
state: directory
mode: '0755'
owner: testuser
group: testuser
tags:
- setup
- directory
- import_playbook: ../../roles/deploy.yml
EOF
else
echo "📝 Файл molecule/default/site.yml уже существует, пропускаем создание"
fi
# Обновляем 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'и обновлены"