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:
0
.cursor/commands/roles.md
Normal file
0
.cursor/commands/roles.md
Normal file
30
Makefile
30
Makefile
@@ -40,7 +40,7 @@ DOCKER_BUILDX_BUILDER ?= multiarch-builder
|
|||||||
# Базовые образы и их теги
|
# Базовые образы и их теги
|
||||||
BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi quay.io/centos/centos:stream9 almalinux:8 rockylinux:8
|
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 \
|
-v ~/.ssh:/root/.ssh:ro \
|
||||||
-e ANSIBLE_FORCE_COLOR=1 \
|
-e ANSIBLE_FORCE_COLOR=1 \
|
||||||
$(DOCKER_IMAGE) \
|
$(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 ""; \
|
echo ""; \
|
||||||
read -p "Продолжить развертывание? (y/N): " confirm; \
|
read -p "Продолжить развертывание? (y/N): " confirm; \
|
||||||
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
||||||
@@ -105,7 +105,7 @@ role:
|
|||||||
-v ~/.ssh:/root/.ssh:ro \
|
-v ~/.ssh:/root/.ssh:ro \
|
||||||
-e ANSIBLE_FORCE_COLOR=1 \
|
-e ANSIBLE_FORCE_COLOR=1 \
|
||||||
$(DOCKER_IMAGE) \
|
$(DOCKER_IMAGE) \
|
||||||
bash -c "ansible-playbook -i inventory/hosts.ini deploy.yml"; \
|
bash -c "ansible-playbook -i inventory/hosts.ini roles/deploy.yml"; \
|
||||||
else \
|
else \
|
||||||
echo "❌ Развертывание отменено"; \
|
echo "❌ Развертывание отменено"; \
|
||||||
fi;; \
|
fi;; \
|
||||||
@@ -942,6 +942,11 @@ help:
|
|||||||
@echo " make docker diagnose - диагностика buildx проблем"
|
@echo " make docker diagnose - диагностика buildx проблем"
|
||||||
@echo " make docker reset-builder - сброс buildx builder"
|
@echo " make docker reset-builder - сброс buildx builder"
|
||||||
@echo " 💡 Поддерживает: amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6"
|
@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 " 💡 Безопасно: использует inspect вместо buildx ls (избегает зависаний)"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "🔐 VAULT (управление секретами):"
|
@echo "🔐 VAULT (управление секретами):"
|
||||||
@@ -1038,6 +1043,25 @@ custom-images:
|
|||||||
echo " - inecs/ansible-lab:debian-latest";; \
|
echo " - inecs/ansible-lab:debian-latest";; \
|
||||||
esac
|
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:
|
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
|
@true
|
||||||
|
|||||||
13
deploy.yml
13
deploy.yml
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
# Плейбук для развертывания ролей
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
- name: Test ping role
|
|
||||||
hosts: all
|
|
||||||
become: false
|
|
||||||
roles:
|
|
||||||
- ping
|
|
||||||
tags:
|
|
||||||
- ping
|
|
||||||
- test
|
|
||||||
@@ -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/
|
dockerfiles/
|
||||||
@@ -12,150 +16,667 @@ dockerfiles/
|
|||||||
├── alt-linux/ # ALT Linux с systemd
|
├── alt-linux/ # ALT Linux с systemd
|
||||||
├── astra-linux/ # Astra Linux с systemd
|
├── astra-linux/ # Astra Linux с systemd
|
||||||
├── redos/ # RED OS с systemd
|
├── redos/ # RED OS с systemd
|
||||||
├── Makefile # Команды для сборки образов
|
├── rhel/ # Red Hat Enterprise Linux с systemd
|
||||||
└── README.md # Документация
|
├── centos/ # CentOS Stream с systemd
|
||||||
|
├── alma/ # AlmaLinux с systemd
|
||||||
|
├── rocky/ # Rocky Linux с systemd
|
||||||
|
├── ubuntu/ # Ubuntu с systemd
|
||||||
|
├── debian/ # Debian с systemd
|
||||||
|
└── README.md # Документация
|
||||||
```
|
```
|
||||||
|
|
||||||
## Доступные образы
|
## 🚀 Доступные образы
|
||||||
|
|
||||||
### ansible-controller
|
### 1. 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)
|
|
||||||
|
|
||||||
### alt-linux
|
**Базовый образ:** `ubuntu:22.04`
|
||||||
- **Базовый образ:** `altlinux/p9`
|
**Тег:** `inecs/ansible-lab:ansible-controller-latest`
|
||||||
- **Описание:** ALT Linux с systemd
|
**Описание:** Ansible контроллер с предустановленными коллекциями и инструментами
|
||||||
- **Компоненты:**
|
|
||||||
- systemd
|
|
||||||
- Docker
|
|
||||||
- Docker Compose
|
|
||||||
- Python3
|
|
||||||
- Пользователь ansible
|
|
||||||
|
|
||||||
### astra-linux
|
#### Компоненты:
|
||||||
- **Базовый образ:** `astralinux/astra-1.7`
|
- **Ansible Core** с последними коллекциями
|
||||||
- **Описание:** Astra Linux с systemd
|
- **Docker CLI** для работы с контейнерами
|
||||||
- **Компоненты:**
|
- **kubectl** для управления Kubernetes
|
||||||
- systemd
|
- **Helm** для управления пакетами Kubernetes
|
||||||
- Docker
|
- **Kind** для локального Kubernetes
|
||||||
- Docker Compose
|
- **yq** для работы с YAML
|
||||||
- Python3
|
- **jq** для работы с JSON
|
||||||
- Пользователь ansible
|
|
||||||
|
|
||||||
### redos
|
#### Предустановленные коллекции:
|
||||||
- **Базовый образ:** `redos/redos:9`
|
```yaml
|
||||||
- **Описание:** RED OS с systemd
|
collections:
|
||||||
- **Компоненты:**
|
- name: community.docker
|
||||||
- systemd
|
version: ">=3.0.0"
|
||||||
- Docker
|
- name: community.general
|
||||||
- Docker Compose
|
version: ">=7.0.0"
|
||||||
- Python3
|
- name: ansible.posix
|
||||||
- Пользователь ansible
|
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
|
```bash
|
||||||
make docker-build
|
# Сборка всех образов (multi-arch)
|
||||||
|
make docker build
|
||||||
|
|
||||||
|
# Сборка конкретного образа
|
||||||
|
make docker build-image IMAGE=ubuntu
|
||||||
|
|
||||||
|
# Полная пересборка с очисткой кеша
|
||||||
|
make docker rebuild
|
||||||
```
|
```
|
||||||
|
|
||||||
### Сборка конкретного образа
|
### Отправка в Docker Hub
|
||||||
```bash
|
|
||||||
make docker-build IMAGE=ansible-controller
|
|
||||||
```
|
|
||||||
|
|
||||||
### Отправка образов в registry
|
|
||||||
```bash
|
```bash
|
||||||
make docker-push
|
# Отправка всех образов
|
||||||
|
make docker push
|
||||||
|
|
||||||
|
# Загрузка всех образов
|
||||||
|
make docker pull
|
||||||
```
|
```
|
||||||
|
|
||||||
### Очистка образов
|
### Очистка образов
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make docker-clean
|
# Очистка локальных образов
|
||||||
|
make docker clean
|
||||||
|
|
||||||
|
# Полная очистка Docker
|
||||||
|
make docker purge
|
||||||
```
|
```
|
||||||
|
|
||||||
### Информация об образах
|
### Информация об образах
|
||||||
```bash
|
|
||||||
make docker-info
|
|
||||||
```
|
|
||||||
|
|
||||||
## Настройка registry
|
|
||||||
|
|
||||||
По умолчанию образы собираются с тегом `localhost:5000/имя:latest`. Для изменения registry:
|
|
||||||
|
|
||||||
```bash
|
```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
|
```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:
|
images:
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
ubuntu: "inecs/ansible-lab:ubuntu-latest"
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
debian: "inecs/ansible-lab:debian-latest"
|
||||||
alt: "localhost:5000/alt-linux:latest"
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
astra: "localhost:5000/astra-linux:latest"
|
centos: "inecs/ansible-lab:centos-latest"
|
||||||
redos: "localhost:5000/redos: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:
|
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
|
family: alt
|
||||||
groups: [servers]
|
groups: [security]
|
||||||
- name: astra-server
|
- name: astra1
|
||||||
family: astra
|
family: astra
|
||||||
groups: [servers]
|
groups: [security]
|
||||||
- name: redos-server
|
- name: redos1
|
||||||
family: redos
|
family: redos
|
||||||
groups: [servers]
|
groups: [security]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Лучшие практики
|
### Тестирование с собственными образами
|
||||||
|
|
||||||
### 1. Версионирование образов
|
|
||||||
```bash
|
```bash
|
||||||
make docker-build VERSION=v1.0.0
|
# Тестирование с собственными образами
|
||||||
|
make custom-images test full
|
||||||
|
|
||||||
|
# Проверка наличия образов
|
||||||
|
make custom-images check
|
||||||
|
|
||||||
|
# Сборка всех образов
|
||||||
|
make custom-images build
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Использование registry
|
## 📊 Мониторинг и диагностика
|
||||||
|
|
||||||
|
### Проверка образов
|
||||||
|
|
||||||
```bash
|
```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
|
```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. **Builder не создается:**
|
||||||
1. Убедитесь, что registry доступен
|
```bash
|
||||||
2. Проверьте аутентификацию
|
make docker diagnose
|
||||||
3. Проверьте права на push
|
make docker reset-builder
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Образы не собираются:**
|
||||||
|
```bash
|
||||||
|
make docker clean
|
||||||
|
make docker setup-builder
|
||||||
|
make docker build
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Проблемы с multi-arch:**
|
||||||
|
```bash
|
||||||
|
make docker clean-builder
|
||||||
|
make docker setup-builder
|
||||||
|
```
|
||||||
|
|
||||||
### Проблемы с образами
|
### Проблемы с образами
|
||||||
1. Проверьте размер образов
|
|
||||||
2. Убедитесь, что все зависимости установлены
|
|
||||||
3. Проверьте совместимость с базовыми образами
|
|
||||||
|
|
||||||
## Заключение
|
1. **Образы не запускаются:**
|
||||||
|
```bash
|
||||||
|
# Проверка systemd
|
||||||
|
docker run --rm --privileged inecs/ansible-lab:ubuntu-latest systemctl status
|
||||||
|
|
||||||
|
# Проверка Docker
|
||||||
|
docker run --rm --privileged inecs/ansible-lab:ubuntu-latest docker --version
|
||||||
|
```
|
||||||
|
|
||||||
Эти Docker образы предоставляют готовую среду для тестирования Ansible ролей на различных операционных системах. Используйте их в своих preset'ах для создания универсальной системы тестирования.
|
2. **Проблемы с правами:**
|
||||||
|
```bash
|
||||||
|
# Проверка пользователя ansible
|
||||||
|
docker run --rm inecs/ansible-lab:ubuntu-latest id ansible
|
||||||
|
|
||||||
|
# Проверка sudo прав
|
||||||
|
docker run --rm inecs/ansible-lab:ubuntu-latest sudo -l
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📈 Производительность
|
||||||
|
|
||||||
|
### Оптимизация сборки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Использование кеша Docker
|
||||||
|
make docker build
|
||||||
|
|
||||||
|
# Очистка кеша при проблемах
|
||||||
|
make docker rebuild
|
||||||
|
```
|
||||||
|
|
||||||
|
### Оптимизация образов
|
||||||
|
|
||||||
|
- **Многоэтапная сборка** для уменьшения размера
|
||||||
|
- **Кеширование слоев** для ускорения сборки
|
||||||
|
- **Минимальные базовые образы** для безопасности
|
||||||
|
- **Оптимизированные зависимости** для производительности
|
||||||
|
|
||||||
|
## 🔒 Безопасность
|
||||||
|
|
||||||
|
### Безопасность образов
|
||||||
|
|
||||||
|
- **Регулярные обновления** базовых образов
|
||||||
|
- **Минимальные права** для пользователей
|
||||||
|
- **Сканирование уязвимостей** в CI/CD
|
||||||
|
- **Подписанные образы** для целостности
|
||||||
|
|
||||||
|
### Лучшие практики
|
||||||
|
|
||||||
|
1. **Используйте конкретные теги** вместо `latest`
|
||||||
|
2. **Регулярно обновляйте** базовые образы
|
||||||
|
3. **Сканируйте образы** на уязвимости
|
||||||
|
4. **Используйте multi-arch** для совместимости
|
||||||
|
|
||||||
|
## 📚 Дополнительные ресурсы
|
||||||
|
|
||||||
|
- [Docker Multi-Arch Build](https://docs.docker.com/buildx/working-with-buildx/)
|
||||||
|
- [Ansible Collections](https://docs.ansible.com/ansible/latest/collections_guide/index.html)
|
||||||
|
- [Molecule Documentation](https://molecule.readthedocs.io/)
|
||||||
|
- [Systemd in Containers](https://systemd.io/CONTAINER_INTERFACE/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
913
docs/cicd-setup.md
Normal file
913
docs/cicd-setup.md
Normal 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
571
docs/creating-roles.md
Normal 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
291
docs/getting-started.md
Normal 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
859
docs/molecule-guide.md
Normal 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
593
docs/monitoring.md
Normal 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
248
docs/site-yml-guide.md
Normal 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
256
env.example
Normal 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 файл > значения по умолчанию
|
||||||
@@ -10,10 +10,15 @@
|
|||||||
docker_network: labnet
|
docker_network: labnet
|
||||||
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
images:
|
images:
|
||||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
alt: "inecs/ansible-lab:alt-linux-latest"
|
||||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
ubuntu: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
centos: "quay.io/centos/centos:stream9-systemd"
|
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:
|
systemd_defaults:
|
||||||
privileged: true
|
privileged: true
|
||||||
command: "/sbin/init"
|
command: "/sbin/init"
|
||||||
|
|||||||
@@ -1,29 +1,181 @@
|
|||||||
---
|
---
|
||||||
# Универсальный плейбук для тестирования
|
# Универсальный playbook для тестирования Ansible ролей
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
#
|
||||||
|
# Этот файл отвечает за:
|
||||||
|
# 1. Обновление пакетов в контейнерах при запуске тестов
|
||||||
|
# 2. Установку common tools для корректной работы тестов
|
||||||
|
# 3. Подготовку окружения для тестирования ролей
|
||||||
|
# 4. Запуск всех ролей из директории roles/
|
||||||
|
|
||||||
- name: Base deps
|
- name: Подготовка окружения для тестирования
|
||||||
hosts: all
|
hosts: all
|
||||||
become: true
|
become: true
|
||||||
tasks:
|
tasks:
|
||||||
- name: Update apt cache (Debian)
|
# Обновление кеша пакетов для Debian/Ubuntu
|
||||||
|
- name: Update package cache (Debian/Ubuntu)
|
||||||
apt:
|
apt:
|
||||||
update_cache: true
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
when: ansible_os_family == 'Debian'
|
when: ansible_os_family == 'Debian'
|
||||||
changed_when: false
|
changed_when: false
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- update
|
||||||
|
|
||||||
- name: Common tools
|
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
|
||||||
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
|
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
|
||||||
ignore_errors: true
|
yum:
|
||||||
|
update_cache: true
|
||||||
|
when: ansible_os_family == 'RedHat'
|
||||||
|
changed_when: false
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- update
|
||||||
|
|
||||||
- name: Update ansible-lint
|
# Обновление кеша пакетов для Alt Linux
|
||||||
raw: pip install --upgrade ansible-lint --quiet --no-warn-script-location || true
|
- name: Update package cache (Alt Linux)
|
||||||
ignore_errors: true
|
apt:
|
||||||
|
update_cache: true
|
||||||
|
when: ansible_distribution == 'Alt'
|
||||||
|
changed_when: false
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- update
|
||||||
|
|
||||||
- name: Install ansible collections
|
# Установка common tools для всех ОС
|
||||||
raw: ansible-galaxy collection install -r requirements.yml --force --no-deps --upgrade || true
|
- name: Install common tools (Debian/Ubuntu)
|
||||||
ignore_errors: true
|
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
9
roles/deploy.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
# Playbook для развертывания на продакшн серверах
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: Развертывание всех ролей
|
||||||
|
hosts: all
|
||||||
|
roles:
|
||||||
|
- ping
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
## Как использовать:
|
## Как использовать:
|
||||||
|
|
||||||
### Вариант 1: Использование в deploy.yml (уже добавлено)
|
### Вариант 1: Использование в roles/deploy.yml (уже добавлено)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Запуск только роли ping
|
# Запуск только роли ping
|
||||||
|
|||||||
58
scripts/generate-role-docs.sh
Executable file
58
scripts/generate-role-docs.sh
Executable 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
103
scripts/setup-cicd.sh
Executable 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
222
scripts/update-playbooks.sh
Executable 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'и обновлены"
|
||||||
Reference in New Issue
Block a user