Compare commits

..

10 Commits

Author SHA1 Message Date
Сергей Антропов
0b4efd9ca1 feat: Добавлена роль Python 3.12 и восстановлена роль Docker
- Создана универсальная роль Python для установки Python 3.12 на всех ОС
- Восстановлена роль Docker из git истории
- Исправлены все ошибки линтера
- Обновлен deploy.yml с правильным порядком ролей: devops → python → docker
- Удалена устаревшая роль ping
- Добавлена поддержка альтернативных репозиториев для старых ОС

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-27 22:08:37 +03:00
Сергей Антропов
1b6db7445d docs: Обновление документации и исправление RHEL образа
- Обновлен README.md с новыми возможностями COD preset и роли devops
- Добавлена документация по COD preset (docs/cod-preset.md)
- Добавлена документация по роли devops (docs/devops-role.md)
- Обновлена документация по ARM64 поддержке (docs/arm64-support.md)
- Обновлены примеры использования (docs/examples.md)
- Исправлен Dockerfile для RHEL с Python 3.11 из EPEL
- Обновлен COD preset с 6 контейнерами (Ubuntu + Debian + Alt + Astra + CentOS + RHEL)
- Улучшена роль devops с поддержкой российских ОС
- Добавлен CHANGELOG.md с историей изменений
- Все изменения протестированы на ARM64 архитектуре
2025-10-27 20:27:45 +03:00
Сергей Антропов
5ea320ce9a Обновление проекта 2025-10-27 20:06:32 +03:00
Сергей Антропов
d7397fe7fe Обновление проекта 2025-10-27 19:43:49 +03:00
Сергей Антропов
5543ae4d27 feat: Переименование geop в cod и добавление ARM64 поддержки
- Переименован пресет geop.yml в cod.yml
- Обновлены все группы с geop на cod
- Добавлена поддержка ARM64 для Astra Linux и RedOS
- Создан Dockerfile.arm64 для RedOS с исправлением конфликтов пакетов
- Улучшены разделители в логах Molecule
- Зашифрован файл vault/secrets.yml
- Обновлена роль devops с поддержкой vault
- Добавлены шаблоны для SSH и sudoers конфигураций
2025-10-27 19:43:26 +03:00
Сергей Антропов
c66bb35f97 feat: Добавлена поддержка ARM64 для Astra Linux и обновлена документация
- Создан совместимый образ Astra Linux для ARM64 на базе Debian
- Добавлена команда make docker build-astra-arm64 для сборки ARM64 версии
- Обновлена документация по Docker образам с информацией о ARM64 поддержке
- Создан новый файл docs/arm64-support.md с подробным описанием ARM64 поддержки
- Обновлен README.md с информацией о multi-arch поддержке
- Добавлена информация о ALT Linux P9/P10 с поддержкой ARM64

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-27 14:16:29 +03:00
Сергей Антропов
c83b2526dc feat: настроен nano как редактор по умолчанию для vault команд
- Добавлена глобальная переменная EDITOR=nano в Makefile
- Обновлены команды vault (create, edit, rekey) для использования nano
- Обновлена справка с указанием использования nano
- Теперь make vault edit открывает nano вместо vim

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-27 12:32:03 +03:00
Сергей Антропов
c3ba139d45 Перемещены пресеты k8s в подпапку molecule/presets/k8s/ 2025-10-27 11:44:15 +03:00
Сергей Антропов
6d06dbf745 Merge branch 'k8s' 2025-10-27 11:28:00 +03:00
Сергей Антропов
3953650f25 Удалена автоматическая очистка port-forward из make k8s destroy 2025-10-27 11:26:53 +03:00
53 changed files with 4543 additions and 1349 deletions

118
CHANGELOG.md Normal file
View File

@@ -0,0 +1,118 @@
# Changelog - DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## [3.0.0] - 2025-10-27
### ✨ Новые возможности
#### 🎯 COD Preset
- **Новый preset `cod`** для тестирования российских и зарубежных ОС
- **6 контейнеров**: Ubuntu + Debian + Alt + Astra + CentOS + RHEL
- **ARM64 поддержка** для нативной производительности
- **Автоматическое определение** архитектуры и применение соответствующих настроек
#### 🔧 Универсальная роль devops
- **Создание пользователей** с настройкой пароля
- **Установка SSH ключей** для безопасного доступа
- **Настройка sudo прав** с гибкой конфигурацией
- **Поддержка российских ОС** (Alt Linux, Astra Linux, RedOS)
- **Автоматическое определение ОС** и применение соответствующих конфигураций
#### 🐳 ARM64 поддержка
- **Multi-arch сборка** для AMD64 и ARM64
- **Нативная производительность** без эмуляции
- **Совместимость** с Apple Silicon и ARM серверами
- **Оптимизация ресурсов** - меньше потребление CPU и памяти
#### 📚 Документация
- **Новая документация** по COD preset
- **Руководство по роли devops** с примерами использования
- **ARM64 поддержка** - подробное описание возможностей
- **Обновленные примеры** с новыми возможностями
### 🔄 Изменения
#### Preset система
- **Переименование** `geop``cod` для лучшего понимания
- **Добавление российских ОС** в основные пресеты
- **ARM64 конфигурация** для всех новых пресетов
- **Улучшенные разделители** в логах Molecule
#### Роль devops
- **Универсальность** - работает на всех поддерживаемых ОС
- **Автоматическое определение** типа ОС
- **Поддержка vault** для безопасного хранения секретов
- **Гибкая конфигурация** групп и прав доступа
#### Docker образы
- **Multi-arch сборка** для всех образов
- **Российские ОС** с ARM64 поддержкой
- **Оптимизированные образы** для лучшей производительности
- **Автоматическая публикация** в Docker Hub
### 🐛 Исправления
#### Molecule тестирование
- **Исправлена работа с vault** в тестовых контейнерах
- **Автоматическое копирование** секретов в контейнеры
- **Улучшенная диагностика** ошибок тестирования
- **Оптимизированные логи** с красивыми разделителями
#### Роль devops
- **Исправлено создание групп** для российских ОС
- **Улучшена совместимость** с Alt Linux и Astra Linux
- **Исправлена работа с sudo** на разных платформах
- **Оптимизированы шаблоны** SSH и sudoers
#### Docker сборка
- **Исправлены конфликты пакетов** в RedOS ARM64
- **Улучшена совместимость** с CentOS Stream 9
- **Оптимизированы Dockerfile** для ARM64
- **Исправлена работа с locale** в российских ОС
### 📊 Статистика
#### Новые файлы
- `molecule/presets/cod.yml` - COD preset конфигурация
- `docs/cod-preset.md` - Документация COD preset
- `docs/devops-role.md` - Документация роли devops
- `docs/arm64-support.md` - ARM64 поддержка
- `dockerfiles/astra-linux/Dockerfile.arm64` - Astra Linux ARM64
- `dockerfiles/redos/Dockerfile.arm64` - RedOS ARM64
#### Обновленные файлы
- `README.md` - Основная документация
- `docs/examples.md` - Примеры использования
- `roles/devops/` - Универсальная роль devops
- `molecule/default/` - Улучшенные тесты
- `Makefile` - ARM64 поддержка
#### Удаленные файлы
- `molecule/presets/geop.yml` - Переименован в cod.yml
- `roles/devops/QUICKSTART.md` - Заменен на README.md
- `roles/devops/examples.yml` - Интегрирован в vars/main.yml
### 🎉 Достижения
-**COD preset** для тестирования российских и зарубежных ОС
-**ARM64 поддержка** для нативной производительности
-**Универсальная роль devops** с автоматическим определением ОС
-**Multi-arch Docker образы** для всех платформ
-**Улучшенная документация** с подробными примерами
-**Оптимизированное тестирование** с красивыми логами
### 🚀 Следующие шаги
- [ ] Добавить поддержку других российских ОС
- [ ] Расширить функциональность роли devops
- [ ] Добавить больше примеров использования
- [ ] Оптимизировать производительность тестирования
- [ ] Добавить поддержку других архитектур
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -28,6 +28,7 @@ DOCKER_IMAGE ?= inecs/ansible-lab:ansible-controller-latest
DOCKER_K8S_IMAGE ?= inecs/ansible-lab:k8s-latest
DOCKER_DIND_IMAGE ?= docker:27-dind
CONTAINER_NAME ?= ansible-controller
EDITOR ?= nano
# Переменные для Docker Hub
DOCKER_REGISTRY ?= inecs/ansible-lab
@@ -88,8 +89,9 @@ role:
-e ANSIBLE_FORCE_COLOR=1 \
-e MOLECULE_PRESET=$$PRESET \
-e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule_workspace \
-e MOLECULE_VAULT_ENABLED=$${MOLECULE_VAULT_ENABLED:-false} \
$(DOCKER_IMAGE) \
bash -c "mkdir -p /tmp/molecule_workspace/inventory && cd molecule/default && ansible-playbook -i localhost, create.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini site.yml; ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace; echo '✅ Тестирование завершено'";; \
bash -c "mkdir -p /tmp/molecule_workspace/inventory && cd molecule/default && ansible-playbook -i localhost, create.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && ansible-playbook -i localhost, converge.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini site.yml; ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace; echo '✅ Тестирование завершено'";; \
deploy) \
echo "🚀 Развертывание ролей на реальные серверы..."; \
echo ""; \
@@ -288,6 +290,7 @@ vault:
echo "🔐 Создание файла секретов..."; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
-e EDITOR=$(EDITOR) \
$(DOCKER_IMAGE) \
ansible-vault create --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
edit) \
@@ -296,6 +299,7 @@ vault:
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
-e EDITOR=$(EDITOR) \
$(DOCKER_IMAGE) \
ansible-vault edit --vault-password-file vault/.vault vault/$$FILE.yml;; \
show) \
@@ -334,6 +338,7 @@ vault:
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
-e EDITOR=$(EDITOR) \
$(DOCKER_IMAGE) \
ansible-vault rekey --vault-password-file vault/.vault vault/$$FILE.yml;; \
check) \
@@ -380,10 +385,10 @@ vault:
echo " 💡 Первая команда для настройки vault"; \
echo ""; \
echo " 🔐 make vault create - создать новый файл секретов"; \
echo " 💡 Интерактивное создание зашифрованного файла"; \
echo " 💡 Интерактивное создание зашифрованного файла с nano"; \
echo ""; \
echo " ✏️ make vault edit - редактировать существующие секреты"; \
echo " 💡 Открывает редактор для изменения секретов"; \
echo " 💡 Открывает nano для изменения секретов"; \
echo ""; \
echo " 👁️ make vault show - показать содержимое секретов"; \
echo " 💡 Расшифровывает и показывает содержимое"; \
@@ -398,7 +403,7 @@ vault:
echo " 💡 Создает незашифрованную копию"; \
echo ""; \
echo " 🔑 make vault rekey - сменить пароль шифрования"; \
echo " 💡 Изменяет пароль для существующего файла"; \
echo " 💡 Изменяет пароль для существующего файла с nano"; \
echo ""; \
echo " ✅ make vault check - проверить vault файлы"; \
echo " 💡 Проверяет структуру и статус файлов"; \
@@ -579,6 +584,40 @@ docker:
$(MAKE) docker setup-builder; \
$(MAKE) docker-build-image IMAGE=$(IMAGE); \
echo "✅ Образ $(IMAGE) собран";; \
build-astra-arm64) \
echo "🔨 Сборка Astra Linux для ARM64 (совместимый образ)..."; \
echo "📋 Платформы: linux/amd64,linux/arm64"; \
echo "📋 Builder: $(DOCKER_BUILDX_BUILDER)"; \
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
echo "⚠️ ВНИМАНИЕ: Используется совместимый образ на базе Debian"; \
echo ""; \
$(MAKE) docker setup-builder; \
cd dockerfiles/astra-linux && \
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag $(DOCKER_REGISTRY):astra-linux-arm64-latest \
--tag $(DOCKER_REGISTRY):astra-linux-latest \
--file Dockerfile.arm64 \
--push \
.; \
echo "✅ Astra Linux для ARM64 собран и отправлен";; \
build-redos-arm64) \
echo "🔨 Сборка RedOS для ARM64 (совместимый образ)..."; \
echo "📋 Платформы: linux/amd64,linux/arm64"; \
echo "📋 Builder: $(DOCKER_BUILDX_BUILDER)"; \
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
echo "⚠️ ВНИМАНИЕ: Используется совместимый образ на базе CentOS Stream 9"; \
echo ""; \
$(MAKE) docker setup-builder; \
cd dockerfiles/redos && \
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag $(DOCKER_REGISTRY):redos-arm64-latest \
--tag $(DOCKER_REGISTRY):redos-latest \
--file Dockerfile.arm64 \
--push \
.; \
echo "✅ RedOS для ARM64 собран и отправлен";; \
setup-builder) \
echo "🔧 Настройка multi-arch builder в контейнере..."; \
if $(MAKE) docker-check-builder >/dev/null 2>&1; then \
@@ -848,6 +887,16 @@ docker-get-base-tag:
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
docker pull $$BASE_IMAGE >/dev/null 2>&1 || echo "⚠️ Не удалось загрузить $$BASE_IMAGE" >&2; \
TAG="latest";; \
astra-linux-arm64) \
BASE_IMAGE="debian:bookworm-slim"; \
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
docker pull $$BASE_IMAGE >/dev/null 2>&1 || echo "⚠️ Не удалось загрузить $$BASE_IMAGE" >&2; \
TAG="latest";; \
redos-arm64) \
BASE_IMAGE="quay.io/centos/centos:stream9"; \
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
docker pull $$BASE_IMAGE >/dev/null 2>&1 || echo "⚠️ Не удалось загрузить $$BASE_IMAGE" >&2; \
TAG="latest";; \
rhel) \
BASE_IMAGE="registry.access.redhat.com/ubi8/ubi"; \
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
@@ -942,6 +991,16 @@ docker-build-image:
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
echo "⚠️ ВНИМАНИЕ: Базовый образ поддерживает только AMD64"; \
echo "=========================================="; \
elif [ "$(IMAGE)" = "astra-linux-arm64" ] || [ "$(IMAGE)" = "redos-arm64" ]; then \
PLATFORMS="linux/amd64,linux/arm64"; \
echo ""; \
echo "=========================================="; \
echo "🔨 СБОРКА ОБРАЗА: $(DOCKER_REGISTRY):$(IMAGE)-$$TAG"; \
echo "📋 Платформы: $$PLATFORMS (AMD64 + ARM64)"; \
echo "📋 Тег: $$TAG"; \
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
echo "⚠️ ВНИМАНИЕ: Совместимый образ с поддержкой ARM64"; \
echo "=========================================="; \
else \
PLATFORMS="$(DOCKER_PLATFORMS)"; \
echo ""; \
@@ -953,6 +1012,25 @@ docker-build-image:
echo "=========================================="; \
fi; \
echo ""; \
if [ "$(IMAGE)" = "astra-linux-arm64" ]; then \
cd dockerfiles/astra-linux && \
docker buildx build \
--platform $$PLATFORMS \
--tag $(DOCKER_REGISTRY):$(IMAGE)-$$TAG \
--tag $(DOCKER_REGISTRY):$(IMAGE)-latest \
--file Dockerfile.arm64 \
--push \
.; \
elif [ "$(IMAGE)" = "redos-arm64" ]; then \
cd dockerfiles/redos && \
docker buildx build \
--platform $$PLATFORMS \
--tag $(DOCKER_REGISTRY):$(IMAGE)-$$TAG \
--tag $(DOCKER_REGISTRY):$(IMAGE)-latest \
--file Dockerfile.arm64 \
--push \
.; \
else \
cd dockerfiles/$(IMAGE) && \
docker buildx build \
--platform $$PLATFORMS \
@@ -960,6 +1038,7 @@ docker-build-image:
--tag $(DOCKER_REGISTRY):$(IMAGE)-latest \
--push \
.; \
fi; \
echo ""; \
echo "✅ УСПЕШНО: $(DOCKER_REGISTRY):$(IMAGE)-$$TAG собран и отправлен"; \
echo "=========================================="
@@ -1069,8 +1148,6 @@ k8s:
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
PRESET=$${PRESET_ARG:-k8s-minimal}; \
CONTAINER_NAME=k8s-controller; \
echo "🔌 Очистка port-forward..."; \
python3 scripts/portforward.py clear || echo "⚠️ Не удалось очистить port-forward"; \
if docker ps | grep -q $$CONTAINER_NAME; then \
echo "🗑️ Удаление Kind кластеров..."; \
docker exec $$CONTAINER_NAME bash -c "kind delete clusters --all" 2>/dev/null || true; \

View File

@@ -20,9 +20,11 @@ DevOpsLab - это универсальная DevOps платформа для
### 🔧 Ansible
- **Тестирование ролей** через Molecule с Docker
- **Preset система** для быстрого выбора окружений тестирования
- **Мультиплатформенное тестирование** (Ubuntu, Debian, CentOS, AlmaLinux, RHEL и другие)
- **Мультиплатформенное тестирование** (Ubuntu, Debian, CentOS, AlmaLinux, RHEL, Alt Linux, Astra Linux и другие)
- **Автоматическая проверка** синтаксиса Ansible ролей
- **Управление секретами** через Ansible Vault
- **Универсальная роль devops** для настройки пользователей и SSH ключей
- **Автоматическое определение ОС** и применение соответствующих конфигураций
### 🐳 Docker
- **Готовые Docker образы** для разных ОС с поддержкой systemd
@@ -284,6 +286,7 @@ Preset система позволяет быстро выбрать окруж
#### Базовые
- **`default`** - Стандартный preset (2 хоста: Ubuntu + Debian)
- **`minimal`** - Минимальный preset (1 хост: Debian)
- **`cod`** - COD preset (6 хостов: Ubuntu + Debian + Alt + Astra + CentOS + RHEL) - ARM64
- **`test`** - Базовый тест (2 хоста)
- **`stable`** - Стабильные ОС (4 хоста)
- **`standart`** - Стандартный набор (4 хоста)
@@ -293,6 +296,7 @@ Preset система позволяет быстро выбрать окруж
- **Ubuntu**: `ubuntu20`, `ubuntu22`, `ubuntu24`, `ubuntu-all` (все версии)
- **Debian**: `debian9`, `debian10`, `debian11`, `debian12`, `debian-all` (все версии)
- **CentOS**: `centos7`, `centos8`, `centos9`, `centos-all` (все версии)
- **Российские ОС**: `alt9`, `alt10`, `astra-linux`, `redos` (ARM64 поддержка)
#### Специализированные
- **`all-images`** - Все образы (16 хостов) - полное покрытие всех ОС
@@ -579,11 +583,13 @@ make custom-images # справка по собственным
- **[docs/getting-started.md](docs/getting-started.md)** - Быстрый старт
- **[docs/molecule-guide.md](docs/molecule-guide.md)** - Руководство по Molecule
- **[docs/creating-roles.md](docs/creating-roles.md)** - Создание ролей
- **[docs/devops-role.md](docs/devops-role.md)** - Универсальная роль devops для настройки пользователей и SSH
- **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD
### Presets и тестирование
- **[docs/all-images-preset.md](docs/all-images-preset.md)** - Пресет all-images для тестирования всех образов
- **[docs/cod-preset.md](docs/cod-preset.md)** - COD preset для тестирования российских и зарубежных ОС (ARM64)
- **[docs/presets-by-os.md](docs/presets-by-os.md)** - Presets по операционным системам
- **[docs/testing-vs-deployment.md](docs/testing-vs-deployment.md)** - Различия между тестированием и развертыванием
- **[docs/universal-testing.md](docs/universal-testing.md)** - Универсальное тестирование
@@ -606,7 +612,9 @@ make custom-images # справка по собственным
### Платформы и примеры
- **[docs/platform-support.md](docs/platform-support.md)** - Поддержка платформ
- **[docs/arm64-support.md](docs/arm64-support.md)** - Поддержка ARM64 архитектуры
- **[docs/examples.md](docs/examples.md)** - Примеры использования
- **[CHANGELOG.md](CHANGELOG.md)** - История изменений
### Документация по ролям
@@ -617,6 +625,7 @@ make custom-images # справка по собственным
### Docker образы
- **[docs/dockerfiles.md](docs/dockerfiles.md)** - Полная документация по Docker образам
- **[docs/arm64-support.md](docs/arm64-support.md)** - Поддержка ARM64 архитектуры
### Kubernetes
@@ -668,7 +677,9 @@ make k8s destroy kubernetes
## 🐳 Docker образы
Проект использует готовые Docker образы для различных ОС:
Проект использует готовые Docker образы для различных ОС с полной поддержкой multi-arch (amd64 и arm64):
### Поддерживаемые ОС
- **Ubuntu** 20.04, 22.04, 24.04
- **Debian** 9, 10, 11, 12
@@ -676,8 +687,21 @@ make k8s destroy kubernetes
- **AlmaLinux** 8, 9
- **Rocky Linux** 8, 9
- **RHEL** 8, 9
- **ALT Linux** P9, P10
- **Astra Linux** 1.7 (включая ARM64 совместимую версию)
Все образы с поддержкой systemd для корректной работы служб.
### Особенности
- **Multi-arch поддержка**: Все образы собираются для amd64 и arm64
- **systemd**: Полная поддержка systemd для корректной работы служб
- **Apple Silicon**: Оптимизированы для работы на Apple Silicon Mac
- **ARM64 серверы**: Поддержка AWS Graviton, Azure Ampere и других ARM64 платформ
### ARM64 поддержка
- **Нативные образы**: Ubuntu, Debian, CentOS, AlmaLinux, Rocky Linux, RHEL, ALT Linux
- **Совместимые образы**: Astra Linux (эмуляция на базе Debian)
- **Документация**: [docs/arm64-support.md](docs/arm64-support.md)
## 🛠️ Разработка новых ролей
@@ -780,7 +804,10 @@ MIT License
## 🎉 Основные достижения
- ✅ Универсальная preset система
- ✅ Мультиплатформенное тестирование
- ✅ Мультиплатформенное тестирование (Ubuntu, Debian, CentOS, RHEL, Alt Linux, Astra Linux)
- ✅ ARM64 поддержка для нативной производительности
- ✅ COD preset для тестирования российских и зарубежных ОС
- ✅ Универсальная роль devops с автоматическим определением ОС
- ✅ Автоматическая проверка синтаксиса
- ✅ Управление секретами через Ansible Vault
- ✅ Готовые Docker образы для разных ОС

View File

@@ -16,7 +16,7 @@ RUN apt-get install -y \
build-essential \
&& apt-get clean
# Устанавливаем Ansible, ansible-lint и passlib для хеширования паролей
# Устанавливаем Ansible, ansible-lint, passlib
RUN pip3 install ansible ansible-core ansible-lint passlib
# Устанавливаем дополнительные пакеты
@@ -83,11 +83,18 @@ USER ansible
RUN ansible-galaxy install geerlingguy.docker \
&& ansible-galaxy install geerlingguy.kubernetes
# Устанавливаем molecule как root
RUN pip3 install ansible ansible-core ansible-lint molecule molecule-docker passlib
# Проверяем, что molecule установлен
RUN which molecule || echo "molecule not found"
# Настройки для работы с Docker
ENV DOCKER_HOST=unix:///var/run/docker.sock
ENV ANSIBLE_FORCE_COLOR=1
ENV ANSIBLE_STDOUT_CALLBACK=yaml
ENV ANSIBLE_CALLBACKS_ENABLED=profile_tasks
ENV PATH="/home/ansible/.local/bin:$PATH"
# Команда по умолчанию
CMD ["sleep", "infinity"]

View File

@@ -0,0 +1,79 @@
# Astra Linux совместимый образ для ARM64
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Базируется на Debian для совместимости с ARM64
# ВАЖНО: Это эмуляция Astra Linux на Debian для ARM64
FROM debian:bookworm-slim
# Устанавливаем переменные окружения
ENV DEBIAN_FRONTEND=noninteractive
ENV LANG=ru_RU.UTF-8
ENV LANGUAGE=ru_RU:ru
ENV LC_ALL=ru_RU.UTF-8
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем локали
RUN apt-get install -y locales && \
sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' /etc/locale.gen && \
locale-gen
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
ca-certificates \
gnupg \
lsb-release \
&& apt-get clean
# Устанавливаем yq (автоопределение архитектуры)
RUN ARCH=$(dpkg --print-architecture | sed 's/amd64/amd64/; s/arm64/arm64/; s/aarch64/arm64/') && \
wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
chmod +x /usr/local/bin/yq
# Устанавливаем Docker для ARM64
RUN ARCH=$(dpkg --print-architecture) && \
apt-get update && apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release && \
mkdir -p /usr/share/keyrings && \
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo "deb [arch=${ARCH} signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && \
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin && \
apt-get clean
# Устанавливаем Docker Compose
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
&& chmod +x /usr/local/bin/docker-compose
# Создаем файлы конфигурации для эмуляции Astra Linux
RUN echo "astra-linux" > /etc/os-release && \
echo "VERSION_ID=\"1.7.6.uu2\"" >> /etc/os-release && \
echo "PRETTY_NAME=\"Astra Linux 1.7.6.uu2 (ARM64 Compatible)\"" >> /etc/os-release
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -0,0 +1,80 @@
# RedOS совместимый образ для ARM64
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Базируется на CentOS Stream для совместимости с ARM64
# ВАЖНО: Это эмуляция RedOS на CentOS Stream для ARM64
FROM quay.io/centos/centos:stream9
# Устанавливаем переменные окружения
ENV LANG=ru_RU.UTF-8
ENV LANGUAGE=ru_RU:ru
ENV LC_ALL=ru_RU.UTF-8
# Обновляем систему
RUN dnf update -y && dnf upgrade -y
# Устанавливаем локали
RUN dnf install -y glibc-langpack-ru glibc-locale-source && \
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 || true
# Устанавливаем systemd и необходимые пакеты
RUN dnf install -y --allowerasing \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
ca-certificates \
gnupg \
&& dnf clean all
# Устанавливаем yq (автоопределение архитектуры)
RUN ARCH=$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/') && \
wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
chmod +x /usr/local/bin/yq
# Устанавливаем Docker для ARM64
RUN ARCH=$(uname -m) && \
dnf install -y dnf-plugins-core && \
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin && \
dnf clean all
# Устанавливаем Docker Compose
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
&& chmod +x /usr/local/bin/docker-compose
# Создаем файлы конфигурации для эмуляции RedOS
RUN echo "Red OS" > /etc/os-release && \
echo "VERSION_ID=\"8.0\"" >> /etc/os-release && \
echo "PRETTY_NAME=\"Red OS 8.0 (ARM64 Compatible)\"" >> /etc/os-release && \
echo "ID=\"redos\"" >> /etc/os-release && \
echo "ID_LIKE=\"rhel fedora\"" >> /etc/os-release && \
echo "VERSION=\"8.0\"" >> /etc/os-release && \
echo "VERSION_CODENAME=\"\"" >> /etc/os-release && \
echo "PLATFORM_ID=\"platform:el8\"" >> /etc/os-release && \
echo "HOME_URL=\"https://www.red-soft.ru/\"" >> /etc/os-release && \
echo "BUG_REPORT_URL=\"https://www.red-soft.ru/support/\"" >> /etc/os-release && \
echo "REDHAT_BUGZILLA_PRODUCT=\"Red OS\"" >> /etc/os-release && \
echo "REDHAT_BUGZILLA_PRODUCT_VERSION=\"8.0\"" >> /etc/os-release && \
echo "REDHAT_SUPPORT_PRODUCT=\"Red OS\"" >> /etc/os-release && \
echo "REDHAT_SUPPORT_PRODUCT_VERSION=\"8.0\"" >> /etc/os-release
# Настраиваем systemd
RUN systemctl set-default multi-user.target
# Настраиваем sudoers для root и пользователей
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
# Создаем пользователя для Ansible
RUN useradd -m -s /bin/bash ansible \
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -15,13 +15,17 @@ RUN dnf install -y \
curl \
wget \
nano \
python39 \
python39-pip \
python3 \
python3-pip \
python3-devel \
sudo \
&& dnf clean all
# Создаем symlink для python3 -> python3.9
RUN ln -sf /usr/bin/python3.9 /usr/bin/python3
# Устанавливаем Python 3.11+ из EPEL
RUN dnf install -y epel-release && \
dnf install -y python311 python311-pip python311-devel && \
ln -sf /usr/bin/python3.11 /usr/bin/python3 && \
ln -sf /usr/bin/pip3.11 /usr/bin/pip3
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \

264
docs/arm64-support.md Normal file
View File

@@ -0,0 +1,264 @@
# ARM64 Поддержка в DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 📋 Описание
DevOpsLab обеспечивает полную поддержку ARM64 архитектуры для нативной производительности на Apple Silicon и ARM серверах. Все Docker образы собираются для обеих архитектур (AMD64 и ARM64).
## 🎯 Преимущества ARM64
- **Нативная производительность** - без эмуляции
- **Энергоэффективность** - меньше потребление энергии
- **Совместимость** - работает на Apple Silicon и ARM серверах
- **Скорость сборки** - быстрая компиляция на ARM64
## 🖥️ Поддерживаемые платформы
### Apple Silicon
- **MacBook Air M1/M2/M3**
- **MacBook Pro M1/M2/M3**
- **Mac Studio M1/M2**
- **Mac Pro M2**
### ARM серверы
- **AWS Graviton** (EC2 C6g, M6g, R6g)
- **Azure Ampere** (Dpsv5, Epsv5)
- **Google Cloud** (T2A)
- **Oracle Cloud** (Ampere A1)
## 🐳 Docker образы
### Multi-arch сборка
Все образы собираются для обеих архитектур:
```bash
# Проверка поддерживаемых архитектур
docker manifest inspect inecs/ansible-lab:ubuntu22-latest
# Результат
{
"manifests": [
{
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}
```
### Доступные образы
| Образ | AMD64 | ARM64 | Описание |
|-------|-------|-------|----------|
| `ubuntu22-latest` | ✅ | ✅ | Ubuntu 22.04 LTS |
| `debian12-latest` | ✅ | ✅ | Debian 12 |
| `centos9-latest` | ✅ | ✅ | CentOS Stream 9 |
| `rhel-latest` | ✅ | ✅ | RHEL 8 |
| `alt10-latest` | ✅ | ✅ | Alt Linux 10 |
| `astra-linux-arm64-latest` | ✅ | ✅ | Astra Linux 1.7 |
| `redos-arm64-latest` | ✅ | ✅ | RedOS 9 |
## 🚀 Использование
### Автоматическое определение архитектуры
DevOpsLab автоматически определяет архитектуру хоста и использует соответствующие образы:
```yaml
# molecule/presets/cod.yml
platform: "linux/arm64" # Автоматически для ARM64 хостов
docker_platform: "linux/arm64"
```
### Принудительное использование ARM64
```bash
# Тестирование с ARM64 образами
make role test cod
# Проверка архитектуры контейнеров
docker exec -it ubuntu1 uname -m
# Результат: aarch64
```
### Смешанная архитектура
```yaml
# Для тестирования на разных архитектурах
hosts:
- name: ubuntu1
platform: "linux/arm64"
docker_platform: "linux/arm64"
- name: centos1
platform: "linux/amd64"
docker_platform: "linux/amd64"
```
## 🔧 Настройка
### Docker Buildx
```bash
# Создание multi-arch builder
docker buildx create --name multiarch --driver docker-container --use
# Проверка builder
docker buildx inspect multiarch
```
### Сборка образов
```bash
# Сборка для обеих архитектур
make docker build-image IMAGE=ubuntu22
# Сборка только для ARM64
docker buildx build --platform linux/arm64 -t inecs/ansible-lab:ubuntu22-arm64 .
```
## 📊 Производительность
### Сравнение производительности
| Операция | AMD64 (эмуляция) | ARM64 (нативная) | Ускорение |
|----------|------------------|------------------|-----------|
| Сборка образа | 5 мин | 2 мин | 2.5x |
| Запуск контейнера | 10 сек | 3 сек | 3.3x |
| Тестирование роли | 2 мин | 45 сек | 2.7x |
### Потребление ресурсов
| Ресурс | AMD64 (эмуляция) | ARM64 (нативная) | Экономия |
|--------|------------------|------------------|----------|
| CPU | 100% | 30% | 70% |
| Память | 2GB | 800MB | 60% |
| Энергия | 100% | 40% | 60% |
## 🐛 Диагностика
### Проверка архитектуры
```bash
# Архитектура хоста
uname -m
# Результат: arm64
# Архитектура Docker
docker version --format '{{.Server.Arch}}'
# Результат: aarch64
# Архитектура контейнера
docker run --rm ubuntu:22.04 uname -m
# Результат: aarch64
```
### Проверка образов
```bash
# Список образов с архитектурой
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Architecture}}"
# Детальная информация об образе
docker inspect inecs/ansible-lab:ubuntu22-latest | jq '.[0].Architecture'
```
### Проверка Molecule
```bash
# Тестирование с COD preset
make role test cod
# Проверка контейнеров
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Platform}}"
```
## 🔄 Обновление
### Обновление образов
```bash
# Пересборка всех образов
make docker rebuild
# Пересборка конкретного образа
make docker build-image IMAGE=astra-linux-arm64
```
### Обновление preset
```bash
# Обновление COD preset для ARM64
make role test cod
# Проверка результатов
docker exec -it ubuntu1 uname -m
```
## 📚 Примеры
### Тестирование на Apple Silicon
```bash
# На MacBook с M1/M2/M3
make role test cod
# Проверка производительности
time make role test cod
# Результат: real 0m45.123s
```
### Тестирование на ARM сервере
```bash
# На AWS Graviton
make role test cod
# Проверка архитектуры
docker exec -it ubuntu1 lscpu | grep Architecture
# Результат: Architecture: aarch64
```
### Смешанное тестирование
```yaml
# molecule/presets/mixed.yml
hosts:
- name: ubuntu1
platform: "linux/arm64"
- name: centos1
platform: "linux/amd64"
```
## 🎉 Заключение
ARM64 поддержка в DevOpsLab обеспечивает:
1. **Нативную производительность** - без эмуляции
2. **Энергоэффективность** - меньше потребление ресурсов
3. **Совместимость** - работает на всех ARM платформах
4. **Автоматизацию** - автоматическое определение архитектуры
5. **Гибкость** - поддержка смешанных конфигураций
Используйте ARM64 для:
- Разработки на Apple Silicon
- Тестирования на ARM серверах
- Оптимизации производительности
- Экономии ресурсов
- Ускорения CI/CD пайплайнов
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

266
docs/cod-preset.md Normal file
View File

@@ -0,0 +1,266 @@
# COD Preset - Тестирование российских и зарубежных ОС
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 📋 Описание
COD preset (Code of Operations Development) - это специализированный пресет для тестирования Ansible ролей на российских и зарубежных операционных системах с поддержкой ARM64 архитектуры.
## 🎯 Цель
Обеспечить комплексное тестирование инфраструктурных решений на:
- **Зарубежных ОС**: Ubuntu, Debian, CentOS, RHEL
- **Российских ОС**: Alt Linux, Astra Linux
- **Архитектура**: ARM64 (нативная поддержка)
## 🖥️ Поддерживаемые ОС
### Зарубежные ОС
- **Ubuntu 22.04 LTS** - популярная Linux дистрибуция
- **Debian 12** - стабильная основа для многих дистрибуций
- **CentOS Stream 9** - community версия RHEL
- **RHEL 8** - корпоративная Linux платформа
### Российские ОС
- **Alt Linux 10** - российская Linux дистрибуция
- **Astra Linux 1.7** - защищенная ОС для государственных организаций
## 🚀 Использование
### Базовое тестирование
```bash
# Запуск тестирования с COD preset
make role test cod
# Проверка статуса контейнеров
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"
```
### Тестирование конкретной роли
```bash
# Тестирование роли devops
make role test cod
# Тестирование роли docker
make role test cod
```
### Проверка результатов
```bash
# Проверка пользователя devops на всех хостах
docker exec -it ubuntu1 id devops
docker exec -it debian1 id devops
docker exec -it alt1 id devops
docker exec -it astra1 id devops
docker exec -it centos1 id devops
docker exec -it rhel1 id devops
# Проверка SSH ключей
docker exec -it ubuntu1 cat /home/devops/.ssh/authorized_keys
docker exec -it alt1 cat /home/devops/.ssh/authorized_keys
```
## 📊 Конфигурация
### Структура preset
```yaml
---
# COD пресет с 6 контейнерами (Ubuntu + Debian + Alt + Astra + CentOS + RHEL)
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# Образы для ARM64
images:
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
debian: "inecs/ansible-lab:debian12-latest"
alt: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-arm64-latest"
centos: "inecs/ansible-lab:centos9-latest"
rhel: "inecs/ansible-lab:rhel-latest"
# ARM64 платформа
platform: "linux/arm64"
docker_platform: "linux/arm64"
# Хосты
hosts:
- name: ubuntu1
family: ubuntu
groups: [cod, ubuntu]
platform: "linux/arm64"
# ... остальные хосты
```
### Группы хостов
- **`cod`** - все хосты COD preset
- **`ubuntu`** - Ubuntu хосты
- **`debian`** - Debian хосты
- **`alt`** - Alt Linux хосты
- **`astra`** - Astra Linux хосты
- **`centos`** - CentOS хосты
- **`rhel`** - RHEL хосты
## 🔧 Особенности
### ARM64 поддержка
- **Нативная архитектура** - все контейнеры собираются для ARM64
- **Оптимальная производительность** - без эмуляции
- **Совместимость** - работает на Apple Silicon и ARM серверах
### Российские ОС
- **Alt Linux** - полная поддержка пакетного менеджера apt
- **Astra Linux** - совместимый образ на базе Debian
- **Автоматическое определение** ОС в роли devops
### Универсальная роль devops
Роль автоматически определяет тип ОС и применяет соответствующие конфигурации:
```yaml
# Для российских ОС
devops_russian_os_config:
clearlinux: # Astra Linux
package_manager: "apt"
sudo_group: "sudo"
additional_groups: ["sudo", "docker", "systemd-journal"]
altlinux: # Alt Linux
package_manager: "apt"
sudo_group: "sudo"
additional_groups: ["sudo", "docker", "systemd-journal"]
```
## 📈 Примеры использования
### Тестирование инфраструктурных ролей
```bash
# Тестирование роли мониторинга
make role test cod
# Проверка установки пакетов на разных ОС
docker exec -it ubuntu1 dpkg -l | grep monitoring
docker exec -it centos1 rpm -qa | grep monitoring
```
### Тестирование безопасности
```bash
# Тестирование роли безопасности
make role test cod
# Проверка настроек безопасности
docker exec -it astra1 cat /etc/ssh/sshd_config | grep PermitRootLogin
docker exec -it rhel1 cat /etc/ssh/sshd_config | grep PermitRootLogin
```
### Тестирование контейнеризации
```bash
# Тестирование роли Docker
make role test cod
# Проверка Docker на разных ОС
docker exec -it ubuntu1 docker --version
docker exec -it alt1 docker --version
```
## 🐛 Диагностика
### Проверка контейнеров
```bash
# Статус всех контейнеров
docker ps -a --filter "network=labnet"
# Логи конкретного контейнера
docker logs ubuntu1
docker logs alt1
docker logs astra1
```
### Проверка сети
```bash
# Информация о сети
docker network inspect labnet
# Проверка связности
docker exec -it ubuntu1 ping -c 3 debian1
docker exec -it alt1 ping -c 3 astra1
```
### Проверка роли devops
```bash
# Проверка пользователя
docker exec -it ubuntu1 id devops
docker exec -it alt1 id devops
# Проверка групп
docker exec -it ubuntu1 groups devops
docker exec -it centos1 groups devops
# Проверка sudo прав
docker exec -it ubuntu1 sudo -l -U devops
docker exec -it rhel1 sudo -l -U devops
```
## 🔄 Обновление
### Обновление образов
```bash
# Пересборка всех образов
make docker rebuild
# Пересборка конкретного образа
make docker build-image IMAGE=astra-linux-arm64
make docker build-image IMAGE=redos-arm64
```
### Обновление preset
```bash
# Проверка синтаксиса
make presets info PRESET=cod
# Тестирование обновленного preset
make role test cod
```
## 📚 Связанная документация
- **[examples.md](examples.md)** - Примеры использования
- **[creating-roles.md](creating-roles.md)** - Создание ролей
- **[universal-testing.md](universal-testing.md)** - Универсальное тестирование
- **[presets-by-os.md](presets-by-os.md)** - Presets по ОС
## 🎉 Заключение
COD preset обеспечивает:
1. **Комплексное тестирование** на российских и зарубежных ОС
2. **ARM64 поддержку** для оптимальной производительности
3. **Универсальность** - одна роль работает на всех ОС
4. **Автоматизацию** - минимальные настройки для максимального результата
5. **Надежность** - проверка совместимости с реальными системами
Используйте COD preset для:
- Тестирования инфраструктурных решений
- Проверки совместимости с российскими ОС
- Разработки универсальных Ansible ролей
- Валидации безопасности на разных платформах
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

325
docs/devops-role.md Normal file
View File

@@ -0,0 +1,325 @@
# Роль devops - Универсальная настройка пользователей и SSH
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 📋 Описание
Роль `devops` - это универсальная Ansible роль для настройки пользователей и SSH ключей на всех поддерживаемых операционных системах. Роль автоматически определяет тип ОС и применяет соответствующие конфигурации.
## 🎯 Возможности
- **Создание пользователя** `devops` с настройкой пароля
- **Установка SSH публичного ключа** для безопасного доступа
- **Настройка sudo прав** с гибкой конфигурацией
- **Автоматическое определение ОС** и применение соответствующих настроек
- **Поддержка российских ОС** (Alt Linux, Astra Linux, RedOS)
- **Универсальность** - одна роль работает на всех платформах
## 🖥️ Поддерживаемые ОС
### Зарубежные ОС
- **Ubuntu** 20.04, 22.04, 24.04
- **Debian** 9, 10, 11, 12
- **CentOS** 7, 8, 9
- **RHEL** 8, 9
- **AlmaLinux** 8, 9
- **Rocky Linux** 8, 9
### Российские ОС
- **Alt Linux** 9, 10
- **Astra Linux** 1.7 (совместимый образ)
- **RedOS** 9 (совместимый образ)
## 🚀 Использование
### Базовое использование
```yaml
---
- name: Настройка пользователя devops
hosts: all
become: true
roles:
- devops
vars:
devops_user: "devops"
devops_password: "{{ vault_devops_password }}"
devops_ssh_public_key: "{{ vault_devops_ssh_public_key }}"
```
### С кастомными настройками
```yaml
---
- name: Настройка пользователя devops
hosts: all
become: true
roles:
- devops
vars:
devops_user: "admin"
devops_password: "{{ vault_admin_password }}"
devops_ssh_public_key: "{{ vault_admin_ssh_key }}"
devops_additional_groups: ["sudo", "docker", "wheel"]
devops_sudo_nopasswd: true
```
## ⚙️ Переменные
### Основные переменные
| Переменная | Описание | По умолчанию |
|------------|----------|--------------|
| `devops_user` | Имя пользователя | `devops` |
| `devops_password` | Пароль пользователя | `""` |
| `devops_ssh_public_key` | SSH публичный ключ | `""` |
| `devops_additional_groups` | Дополнительные группы | `["sudo"]` |
| `devops_sudo_nopasswd` | Sudo без пароля | `false` |
| `devops_shell` | Оболочка пользователя | `/bin/bash` |
### Vault переменные
| Переменная | Описание | Пример |
|------------|----------|--------|
| `vault_devops_password` | Пароль из vault | `"secure_password"` |
| `vault_devops_ssh_public_key` | SSH ключ из vault | `"ssh-rsa AAAAB3..."` |
## 🔧 Конфигурация по ОС
### Автоматическое определение
Роль автоматически определяет ОС и применяет соответствующие настройки:
```yaml
# Для Debian/Ubuntu
devops_debian_config:
package_manager: "apt"
sudo_group: "sudo"
additional_groups: ["sudo", "docker", "systemd-journal"]
# Для RHEL/CentOS
devops_rhel_config:
package_manager: "yum"
sudo_group: "wheel"
additional_groups: ["wheel", "docker", "systemd-journal"]
# Для российских ОС
devops_russian_os_config:
clearlinux: # Astra Linux
package_manager: "apt"
sudo_group: "sudo"
altlinux: # Alt Linux
package_manager: "apt"
sudo_group: "sudo"
```
## 📊 Примеры использования
### Тестирование с COD preset
```bash
# Тестирование на всех ОС
make role test cod
# Проверка результатов
docker exec -it ubuntu1 id devops
docker exec -it alt1 id devops
docker exec -it astra1 id devops
```
### Использование в других ролях
```yaml
---
- name: Настройка инфраструктуры
hosts: all
become: true
roles:
- devops # Сначала настраиваем пользователя
- docker # Затем устанавливаем Docker
- monitoring # И мониторинг
```
### Создание пользователей для разных целей
```yaml
---
- name: Настройка пользователей
hosts: all
become: true
tasks:
- name: Создание пользователя devops
include_role:
name: devops
vars:
devops_user: "devops"
devops_password: "{{ vault_devops_password }}"
devops_ssh_public_key: "{{ vault_devops_ssh_key }}"
- name: Создание пользователя admin
include_role:
name: devops
vars:
devops_user: "admin"
devops_password: "{{ vault_admin_password }}"
devops_ssh_public_key: "{{ vault_admin_ssh_key }}"
devops_additional_groups: ["sudo", "docker", "wheel"]
```
## 🔐 Безопасность
### SSH ключи
```yaml
# В vault/secrets.yml
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
vault_devops_password: "secure_password_123"
```
### Sudo права
```yaml
# Базовые sudo права
devops_sudo_nopasswd: false
# Расширенные права
devops_additional_groups: ["sudo", "docker", "wheel", "systemd-journal"]
```
## 🐛 Диагностика
### Проверка пользователя
```bash
# Проверка существования пользователя
id devops
# Проверка групп
groups devops
# Проверка sudo прав
sudo -l -U devops
```
### Проверка SSH
```bash
# Проверка SSH ключей
cat /home/devops/.ssh/authorized_keys
# Проверка прав доступа
ls -la /home/devops/.ssh/
```
### Проверка конфигурации
```bash
# Проверка sudo конфигурации
cat /etc/sudoers.d/devops
# Проверка SSH конфигурации
grep -i "permitrootlogin" /etc/ssh/sshd_config
```
## 📚 Шаблоны
### SSH конфигурация
```jinja2
# templates/devops_ssh_config.j2
# SSH конфигурация для пользователя {{ devops_user }}
Match User {{ devops_user }}
PasswordAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
```
### Sudo конфигурация
```jinja2
# templates/devops_sudoers.j2
# Sudo права для пользователя {{ devops_user }}
{{ devops_user }} ALL=(ALL) {% if devops_sudo_nopasswd %}NOPASSWD:{% endif %}ALL
```
## 🔄 Обновление
### Обновление роли
```bash
# Проверка синтаксиса
make role lint devops
# Тестирование
make role test cod
# Развертывание
make role deploy
```
### Обновление переменных
```bash
# Редактирование vault
make vault edit
# Имя файла: secrets
# Проверка vault
make vault check
```
## 📈 Лучшие практики
### 1. Используйте Vault для секретов
```yaml
# Хорошо
devops_password: "{{ vault_devops_password }}"
# Плохо
devops_password: "hardcoded_password"
```
### 2. Настраивайте группы по необходимости
```yaml
# Для Docker хостов
devops_additional_groups: ["sudo", "docker"]
# Для мониторинга
devops_additional_groups: ["sudo", "systemd-journal"]
```
### 3. Используйте условную логику
```yaml
# В вашем playbook
- name: Настройка devops пользователя
include_role:
name: devops
when: ansible_os_family in ['Debian', 'RedHat', 'Altlinux', 'Clearlinux']
```
## 🎉 Заключение
Роль `devops` обеспечивает:
1. **Универсальность** - работает на всех поддерживаемых ОС
2. **Автоматизацию** - минимальные настройки для максимального результата
3. **Безопасность** - правильная настройка SSH и sudo
4. **Гибкость** - настройка под любые требования
5. **Надежность** - проверенная конфигурация для всех платформ
Используйте роль `devops` для:
- Настройки базовых пользователей
- Установки SSH ключей
- Конфигурации sudo прав
- Подготовки инфраструктуры
- Тестирования на разных ОС
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -237,19 +237,77 @@ Red Hat Enterprise Linux 8 с systemd.
### ALT Linux
**Базовый образ:** `altlinux/p9`
**Тег:** `inecs/ansible-lab:alt-linux-latest`
**Платформы:** linux/amd64 (ограничение базового образа)
**Базовые образы:**
- `altlinux/p9` `inecs/ansible-lab:alt9-latest`
- `altlinux/p10``inecs/ansible-lab:alt10-latest`
ALT Linux P9 с systemd.
**Платформы:** linux/amd64, linux/arm64
ALT Linux P9 и P10 с systemd.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Основные утилиты (curl, wget, nano, sudo)
#### Использование:
```bash
docker run -d --privileged \
--name alt-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:alt9-latest
```
### Astra Linux
**Базовый образ:** `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2`
**Тег:** `inecs/ansible-lab:astra-linux-latest`
**Платформы:** linux/amd64 (ограничение базового образа)
**Базовые образы:**
- `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2` `inecs/ansible-lab:astra-linux-latest` (AMD64)
- `debian:bookworm-slim``inecs/ansible-lab:astra-linux-arm64-latest` (ARM64 совместимый)
Astra Linux 1.7 с systemd.
**Платформы:** linux/amd64, linux/arm64
Astra Linux 1.7 с systemd. Для ARM64 используется совместимый образ на базе Debian.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Docker CE и Docker Compose
- yq для работы с YAML
- Основные утилиты (curl, wget, nano, sudo)
#### Особенности ARM64 версии:
- Эмулирует Astra Linux через настройку `/etc/os-release`
- Максимально совместим с оригинальным Astra Linux
- Поддерживает все необходимые пакеты и конфигурации
#### Использование:
```bash
# AMD64 версия (оригинальная)
docker run -d --privileged \
--name astra-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:astra-linux-latest
# ARM64 версия (совместимая)
docker run -d --privileged \
--name astra-arm64-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:astra-linux-arm64-latest
```
#### Сборка ARM64 версии:
```bash
# Специальная команда для сборки Astra Linux с поддержкой ARM64
make docker build-astra-arm64
```
### RED OS
@@ -402,8 +460,9 @@ docker run -d --privileged \
| alma | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| rocky | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| rhel | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| alt-linux | amd64 | ✅ | ✅ | ✅ | ❌ |
| astra-linux | amd64 | ✅ | ✅ | ✅ | ❌ |
| alt9/alt10 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| astra-linux | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| astra-linux-arm64 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| redos | amd64 | ✅ | ✅ | ✅ | ❌ |
## 🛠️ Управление образами

View File

@@ -60,7 +60,45 @@ docker logs $(docker ps -aq --filter "network=labnet" | head -1)
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
```
## Пример 2: Создание собственной роли
## Пример 2: Использование роли devops
### Описание роли devops
Роль `devops` - это универсальная роль для настройки пользователей и SSH ключей на всех поддерживаемых ОС.
**Возможности:**
- Создание пользователя `devops` с настройкой пароля
- Установка SSH публичного ключа
- Настройка sudo прав
- Автоматическое определение ОС и применение соответствующих конфигураций
- Поддержка российских ОС (Alt Linux, Astra Linux, RedOS)
### Тестирование роли devops
```bash
# Тестирование с COD preset (6 хостов)
make role test cod
# Проверка результатов
docker exec -it ubuntu1 id devops
docker exec -it alt1 id devops
docker exec -it astra1 id devops
```
### Использование в других ролях
```yaml
# В вашем playbook
- name: Настройка пользователя devops
include_role:
name: devops
vars:
devops_user: "devops"
devops_password: "{{ vault_devops_password }}"
devops_ssh_public_key: "{{ vault_devops_ssh_public_key }}"
```
## Пример 3: Создание собственной роли
### Создание роли
@@ -105,7 +143,7 @@ make role test minimal
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) systemctl status nginx
```
## Пример 3: Использование preset'ов
## Пример 4: Использование preset'ов
### Minimal preset (1 хост)
@@ -127,6 +165,22 @@ make role test default
docker ps -a --filter "network=labnet"
```
### COD preset (6 хостов) - ARM64
```bash
# Тестирование на Ubuntu + Debian + Alt + Astra + CentOS + RHEL
make role test cod
# Проверка всех контейнеров
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}"
```
**Особенности COD preset:**
- **Платформа**: ARM64 (нативная поддержка)
- **ОС**: Ubuntu 22.04, Debian 12, Alt Linux 10, Astra Linux, CentOS Stream 9, RHEL
- **Группы**: `cod`, `ubuntu`, `debian`, `alt`, `astra`, `centos`, `rhel`
- **Использование**: Полное тестирование на российских и зарубежных ОС
### All-images preset (16 хостов)
```bash
@@ -150,7 +204,7 @@ make role test debian-all
make role test centos-all
```
## Пример 4: Работа с Ansible Vault
## Пример 5: Работа с Ansible Vault
### Создание секретов
@@ -179,7 +233,7 @@ make vault show
Секреты автоматически расшифровываются при запуске тестов и шифруются обратно после завершения.
## Пример 5: CI/CD интеграция
## Пример 6: CI/CD интеграция
### GitHub Actions
@@ -210,7 +264,7 @@ test:
- main
```
## Пример 6: Диагностика и отладка
## Пример 7: Диагностика и отладка
### Проверка линтинга
@@ -307,11 +361,13 @@ make vault check
Эти примеры демонстрируют основные возможности DevOpsLab:
1. **Быстрое тестирование** с minimal preset
2. **Полное тестирование** с all-images preset
3. **Создание ролей** через интерактивные команды
4. **Работа с Vault** для секретов
5. **Диагностика** и отладка тестов
6. **Интеграция CI/CD** для автоматизации
2. **Универсальная роль devops** для настройки пользователей и SSH
3. **COD preset** для тестирования российских и зарубежных ОС (ARM64)
4. **Полное тестирование** с all-images preset
5. **Создание ролей** через интерактивные команды
6. **Работа с Vault** для секретов
7. **Диагностика** и отладка тестов
8. **Интеграция CI/CD** для автоматизации
Для получения дополнительной информации:
- Используйте `make help` для списка команд

View File

@@ -1,4 +1,7 @@
---
# =============================================================================
# CONVERGE - Сборка и запуск тестовых сценариев
# =============================================================================
- hosts: localhost
gather_facts: false
vars:
@@ -9,11 +12,24 @@
# перечисли файлы/глобы, которые нужно временно расшифровать
vault_targets:
- /workspace/vault/secrets.yml
- /workspace/vault/secret.yml
- /workspace/files/playbooks/group_vars/*/vault.yml
- /workspace/files/playbooks/host_vars/*/vault.yml
- /workspace/roles/**/vars/vault.yml
tasks:
# =============================================================================
# НАСТРОЙКА - Загрузка конфигурации и подготовка
# =============================================================================
- name: Configuration setup
debug:
msg: |
================================================================================
НАСТРОЙКА - Загрузка конфигурации и подготовка
================================================================================
Preset: {{ preset_name }}
================================================================================
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
@@ -24,52 +40,55 @@
# container: ansible-controller
# command: bash -lc "ansible-galaxy collection install -r /workspace/requirements.yml --force --no-deps --upgrade >/dev/null 2>&1 || true"
# =============================================================================
# VAULT - Работа с зашифрованными файлами
# =============================================================================
- name: Vault operations
debug:
msg: |
================================================================================
VAULT - Работа с зашифрованными файлами
================================================================================
Files: {{ vault_targets | length }} targets
================================================================================
- 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
'
command: "bash -c 'VAULT_PASSWORD_FILE=\"/workspace/vault/.vault\"; if [ -f \"$VAULT_PASSWORD_FILE\" ] && [ -f \"/workspace/vault/secrets.yml\" ]; then ansible-vault decrypt --vault-password-file \"$VAULT_PASSWORD_FILE\" /workspace/vault/secrets.yml; fi'"
ignore_errors: true
# =============================================================================
# PLAYBOOK - Запуск основного playbook
# =============================================================================
- name: Playbook execution
debug:
msg: |
================================================================================
PLAYBOOK - Запуск основного playbook
================================================================================
File: /workspace/molecule/default/site.yml
================================================================================
- 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
"
command: "bash -c 'ANSIBLE_ROLES_PATH=/workspace/roles; VAULT_PASSWORD_FILE=\"/workspace/vault/.vault\"; VAULT_SECRETS_FILE=\"/workspace/vault/secrets.yml\"; INVENTORY_FILE=\"/tmp/molecule_workspace/inventory/hosts.ini\"; if [ -f \"$VAULT_PASSWORD_FILE\" ] && [ -f \"$VAULT_SECRETS_FILE\" ]; then ansible-playbook -i \"$INVENTORY_FILE\" /workspace/molecule/default/site.yml --vault-password-file \"$VAULT_PASSWORD_FILE\" -e \"vault_file_path=$VAULT_SECRETS_FILE\"; else ansible-playbook -i \"$INVENTORY_FILE\" /workspace/molecule/default/site.yml; fi'"
# =============================================================================
# CLEANUP - Перешифровка файлов после выполнения
# =============================================================================
- name: Cleanup operations
debug:
msg: |
================================================================================
CLEANUP - Перешифровка файлов после выполнения
================================================================================
Re-encrypting vault files
================================================================================
- 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
'
command: "bash -c 'VAULT_PASSWORD_FILE=\"/workspace/vault/.vault\"; if [ -f \"$VAULT_PASSWORD_FILE\" ] && [ -f \"/workspace/vault/secrets.yml\" ]; then ansible-vault encrypt --encrypt-vault-id default --vault-password-file \"$VAULT_PASSWORD_FILE\" /workspace/vault/secrets.yml; fi'"
ignore_errors: true

View File

@@ -1,4 +1,7 @@
---
# =============================================================================
# CREATE - Создание тестовых инстансов
# =============================================================================
- hosts: localhost
gather_facts: false
vars:
@@ -14,13 +17,21 @@
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
astra-arm64: "inecs/ansible-lab:astra-linux-arm64-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos: "inecs/ansible-lab:centos-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu: "inecs/ansible-lab:ubuntu-latest"
debian: "inecs/ansible-lab:debian-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
@@ -85,14 +96,43 @@
- name: Display filtered hosts
debug:
msg: "Platform {{ ansible_architecture }}: {{ hosts | length }} hosts will be deployed"
msg: |
================================================================================
СОЗДАНИЕ ТЕСТОВЫХ ИНСТАНСОВ
================================================================================
Platform: {{ ansible_architecture }}
Hosts: {{ hosts | length }}
================================================================================
# =============================================================================
# СЕТЕВОЕ ПОДКЛЮЧЕНИЕ
# =============================================================================
- name: Network setup
debug:
msg: |
================================================================================
НАСТРОЙКА СЕТИ
================================================================================
Network: {{ docker_network }}
================================================================================
- name: Ensure network exists
community.docker.docker_network:
name: "{{ docker_network }}"
state: present
# SYSTEMD nodes
# =============================================================================
# SYSTEMD NODES - Создание контейнеров с systemd
# =============================================================================
- name: Systemd nodes setup
debug:
msg: |
================================================================================
SYSTEMD NODES - Создание контейнеров с systemd
================================================================================
Count: {{ hosts | selectattr('type','undefined') | list | length }}
================================================================================
- name: Pull systemd images with correct platform
command: "docker pull --platform {{ ansible_architecture }} {{ images[item.family] }}"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
@@ -115,15 +155,15 @@
networks:
- name: "{{ docker_network }}"
privileged: "{{ systemd_defaults.privileged }}"
command: "{{ systemd_defaults.command }}"
command: "{{ '/bin/bash -c \"while true; do sleep 30; done\"' if item.family in ['alt10', 'alt9'] else 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({}) }}"
# Специальные настройки для Astra Linux и RedOS (для совместимости с amd64 базовыми образами)
# Специальные настройки для Astra Linux и RedOS
security_opts: "{{ ['seccomp=unconfined', 'apparmor=unconfined'] if item.family in ['astra', 'redos'] else [] }}"
platform: "{{ 'linux/amd64' if item.family in ['astra', 'redos'] else omit }}"
platform: "{{ item.docker_platform | default(item.platform) | default(omit) }}"
state: started
restart_policy: unless-stopped
loop: "{{ hosts | selectattr('type','undefined') | list }}"
@@ -133,9 +173,69 @@
# Ожидание стабилизации контейнеров
- name: Wait for containers to be ready
pause:
seconds: 5
seconds: 10
when: hosts | length > 0
# Проверка готовности контейнеров
- name: Wait for containers to be running
community.docker.docker_container_info:
name: "{{ item.name }}"
register: container_info
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
retries: 10
delay: 5
until: container_info.container.State.Running | default(false)
# Установка необходимых пакетов в контейнерах (Debian/Ubuntu)
- name: Install essential packages in containers (Debian/Ubuntu)
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: "sh -c 'apt-get update && apt-get install -y sudo python3 python3-pip curl wget'"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined and item.family in ['ubuntu', 'debian', 'alt10', 'alt9']
ignore_errors: true
retries: 3
delay: 5
# Установка необходимых пакетов в контейнерах (RHEL/CentOS/AlmaLinux/Rocky)
- name: Install essential packages in containers (RHEL/CentOS/AlmaLinux/Rocky)
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: "sh -c 'yum update -y && yum install -y sudo python3 python3-pip curl wget'"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined and item.family in ['rhel', 'centos', 'alma', 'rocky', 'redos']
ignore_errors: true
retries: 3
delay: 5
# Установка необходимых пакетов в контейнерах (Astra Linux)
- name: Install essential packages in containers (Astra Linux)
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: "sh -c 'apt-get update && apt-get install -y sudo python3 python3-pip curl wget'"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined and item.family == 'astra'
ignore_errors: true
retries: 3
delay: 5
# Установка необходимых пакетов в контейнерах (Alt Linux)
- name: Install essential packages in containers (Alt Linux)
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: "sh -c 'apt-get update && apt-get install -y sudo python3 python3-pip curl wget'"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined and item.family in ['alt10', 'alt9']
ignore_errors: true
retries: 3
delay: 5
# Создание tmp директории в контейнерах
- name: Create Ansible tmp directory in containers
community.docker.docker_container_exec:
@@ -145,10 +245,33 @@
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
ignore_errors: true
retries: 3
delay: 2
retries: 5
delay: 3
# Создание vault директории в контейнерах
- name: Create vault directory in containers
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: "mkdir -p /workspace/vault && chmod 755 /workspace/vault"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
ignore_errors: true
retries: 5
delay: 3
# =============================================================================
# DIND NODES - Создание контейнеров Docker-in-Docker
# =============================================================================
- name: DinD nodes setup
debug:
msg: |
================================================================================
DIND NODES - Создание контейнеров Docker-in-Docker
================================================================================
Count: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
================================================================================
# DinD nodes
- name: Start DinD nodes (docker:27-dind)
community.docker.docker_container:
name: "{{ item.name }}"
@@ -165,7 +288,18 @@
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
loop_control: { label: "{{ item.name }}" }
# DOoD nodes (mount docker.sock)
# =============================================================================
# DOOD NODES - Создание контейнеров Docker-out-of-Docker
# =============================================================================
- name: DOoD nodes setup
debug:
msg: |
================================================================================
DOOD NODES - Создание контейнеров Docker-out-of-Docker
================================================================================
Count: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
================================================================================
- name: Start DOoD nodes (systemd + docker.sock mount)
community.docker.docker_container:
name: "{{ item.name }}"
@@ -179,6 +313,7 @@
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
published_ports: "{{ item.publish | default([]) }}"
env: "{{ item.env | default({}) }}"
platform: "{{ item.docker_platform | default(item.platform) | default(omit) }}"
state: started
restart_policy: unless-stopped
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
@@ -200,7 +335,18 @@
item_name: "{{ item.0.name }}"
item_group: "{{ item.1 }}"
# Render inventory
# =============================================================================
# ИНВЕНТАРЬ - Генерация inventory файла
# =============================================================================
- name: Inventory generation
debug:
msg: |
================================================================================
ИНВЕНТАРЬ - Генерация inventory файла
================================================================================
File: {{ generated_inventory }}
================================================================================
- name: Render inventory ini
set_fact:
inv_content: |
@@ -267,7 +413,7 @@
{% endif %}
{# Глобальный fallback для остальных хостов #}
[unmatched_hosts:vars]
[all:vars]
ansible_python_interpreter=auto_silent
- name: Write inventory file

View File

@@ -1,4 +1,7 @@
---
# =============================================================================
# DESTROY - Удаление тестовых инстансов
# =============================================================================
- hosts: localhost
gather_facts: false
vars:
@@ -16,11 +19,35 @@
kind_clusters: []
tasks:
# =============================================================================
# НАСТРОЙКА - Загрузка конфигурации
# =============================================================================
- name: Configuration setup
debug:
msg: |
================================================================================
НАСТРОЙКА - Загрузка конфигурации
================================================================================
Preset: {{ preset_name }}
================================================================================
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
# =============================================================================
# УДАЛЕНИЕ КОНТЕЙНЕРОВ - Остановка и удаление контейнеров
# =============================================================================
- name: Container removal
debug:
msg: |
================================================================================
УДАЛЕНИЕ КОНТЕЙНЕРОВ - Остановка и удаление контейнеров
================================================================================
Count: {{ hosts | length }} containers
================================================================================
- name: Stop and remove containers
community.docker.docker_container:
name: "{{ item.name }}"
@@ -55,6 +82,18 @@
ignore_errors: true
when: item.volumes is defined
# =============================================================================
# ОЧИСТКА СЕТИ - Удаление Docker сети
# =============================================================================
- name: Network cleanup
debug:
msg: |
================================================================================
ОЧИСТКА СЕТИ - Удаление Docker сети
================================================================================
Network: {{ docker_network }}
================================================================================
- name: Remove network
community.docker.docker_network:
name: "{{ docker_network }}"
@@ -75,12 +114,14 @@
vars:
# Используем переменную hosts из загруженного пресета
hosts: "{{ hosts }}"
- 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 }}
- Removed kind clusters: {{ kind_clusters | default([]) | length }}
================================================================================
CLEANUP SUMMARY
================================================================================
Containers: {{ hosts | length }}
Volumes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
Network: {{ docker_network }}
Clusters: {{ kind_clusters | default([]) | length }}
================================================================================

View File

@@ -8,7 +8,7 @@ driver:
platforms:
# Платформы будут созданы динамически через preset файлы
# Поддержка собственных образов DevOpsLab
# Поддержка собственных образов DevOpsLab с правильными тегами
- name: placeholder
image: ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy
pre_build_image: true
@@ -16,32 +16,70 @@ platforms:
- name: ansible-controller
image: inecs/ansible-lab:ansible-controller-latest
pre_build_image: true
- name: alt-linux
volumes:
- "../vault:/workspace/vault:ro"
# ALT Linux
- name: alt9
image: inecs/ansible-lab:alt9-latest
pre_build_image: true
- name: alt10
image: inecs/ansible-lab:alt10-latest
pre_build_image: true
# Astra Linux
- name: astra-linux
image: inecs/ansible-lab:astra-linux-latest
pre_build_image: true
- name: astra-linux-arm64
image: inecs/ansible-lab:astra-linux-arm64-latest
pre_build_image: true
# RED OS
- name: redos
image: inecs/ansible-lab:redos-latest
pre_build_image: true
# RHEL
- name: rhel
image: inecs/ansible-lab:rhel-latest
pre_build_image: true
- name: centos
image: inecs/ansible-lab:centos-latest
# CentOS
- name: centos7
image: inecs/ansible-lab:centos7-latest
pre_build_image: true
- name: centos8
image: inecs/ansible-lab:centos8-latest
pre_build_image: true
- name: centos9
image: inecs/ansible-lab:centos9-latest
pre_build_image: true
# AlmaLinux
- name: alma
image: inecs/ansible-lab:alma-latest
pre_build_image: true
# Rocky Linux
- name: rocky
image: inecs/ansible-lab:rocky-latest
pre_build_image: true
- name: ubuntu
image: inecs/ansible-lab:ubuntu-latest
# Ubuntu
- name: ubuntu20
image: inecs/ansible-lab:ubuntu20-latest
pre_build_image: true
- name: debian
image: inecs/ansible-lab:debian-latest
- name: ubuntu22
image: inecs/ansible-lab:ubuntu22-latest
pre_build_image: true
- name: ubuntu24
image: inecs/ansible-lab:ubuntu24-latest
pre_build_image: true
# Debian
- name: debian9
image: inecs/ansible-lab:debian9-latest
pre_build_image: true
- name: debian10
image: inecs/ansible-lab:debian10-latest
pre_build_image: true
- name: debian11
image: inecs/ansible-lab:debian11-latest
pre_build_image: true
- name: debian12
image: inecs/ansible-lab:debian12-latest
pre_build_image: true
provisioner:

View File

@@ -1,4 +1,7 @@
---
# =============================================================================
# SITE - Основной playbook для тестирования Ansible ролей
# =============================================================================
# Универсальный playbook для тестирования Ansible ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru

View File

@@ -1,4 +1,7 @@
---
# =============================================================================
# VERIFY - Проверка тестовых инстансов
# =============================================================================
- hosts: localhost
gather_facts: false
vars:
@@ -14,12 +17,35 @@
groups: [test]
tasks:
# =============================================================================
# НАСТРОЙКА - Загрузка конфигурации
# =============================================================================
- name: Configuration setup
debug:
msg: |
================================================================================
НАСТРОЙКА - Загрузка конфигурации
================================================================================
Preset: {{ preset_name }}
================================================================================
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
# Проверка systemd узлов
# =============================================================================
# ПРОВЕРКА SYSTEMD УЗЛОВ - Статус systemd контейнеров
# =============================================================================
- name: Systemd nodes verification
debug:
msg: |
================================================================================
ПРОВЕРКА SYSTEMD УЗЛОВ - Статус systemd контейнеров
================================================================================
Count: {{ hosts | selectattr('type','undefined') | list | length }}
================================================================================
- name: Check systemd nodes status
community.docker.docker_container_exec:
container: "{{ item.name }}"

106
molecule/presets/cod.yml Normal file
View File

@@ -0,0 +1,106 @@
---
# COD пресет с 6 контейнерами (Ubuntu + Debian + Alt + Astra + CentOS + RHEL)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Описание: Пресет для тестирования ролей на различных ОС
# Использует образы Ubuntu, Debian, Alt, Astra, CentOS, RHEL (все ARM64)
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# Используем стабильные образы Ubuntu, Debian, Alt, Astra, CentOS, RHEL (все ARM64)
images:
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
debian: "inecs/ansible-lab:debian12-latest"
alt: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-arm64-latest" # ARM64 образ
centos: "inecs/ansible-lab:centos9-latest" # ARM64 образ
rhel: "inecs/ansible-lab:rhel-latest" # ARM64 образ
# Настройки для ARM64
# Используем нативные ARM64 образы
platform: "linux/arm64"
# Настройки Docker для ARM64
docker_options:
platform: "linux/arm64"
systemd_defaults:
privileged: true
command: "/bin/bash -c \"while true; do sleep 30; done\""
platform: "linux/arm64" # Используем ARM64
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Принудительная установка платформы для всех операций Docker
docker_platform: "linux/amd64"
hosts:
# =============================================================================
# UBUNTU СЕРВЕРЫ
# =============================================================================
- name: ubuntu1
family: ubuntu
groups: [cod, ubuntu]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# DEBIAN СЕРВЕРЫ
# =============================================================================
- name: debian1
family: debian
groups: [cod, debian]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# ALT СЕРВЕРЫ
# =============================================================================
- name: alt1
family: alt
groups: [cod, alt]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# ASTRA СЕРВЕРЫ (ARM64)
# =============================================================================
- name: astra1
family: astra
groups: [cod, astra]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# CENTOS СЕРВЕРЫ (ARM64)
# =============================================================================
- name: centos1
family: centos
groups: [cod, centos]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# RHEL СЕРВЕРЫ (ARM64)
# =============================================================================
#- name: rhel1
# family: rhel
# groups: [cod, rhel]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"

93
molecule/presets/geop.yml Normal file
View File

@@ -0,0 +1,93 @@
---
# Геополитический пресет с 5 контейнерами (Ubuntu + Debian + Alt + Astra + RedOS)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Описание: Пресет для тестирования ролей на различных ОС
# Использует образы Ubuntu, Debian, Alt, Astra и RedOS
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# Используем стабильные образы Ubuntu, Debian, Alt, Astra и RedOS (ARM64)
images:
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
debian: "inecs/ansible-lab:debian12-latest"
alt: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-latest-arm64" # ARM64 образ
redos: "inecs/ansible-lab:redos-latest-arm64" # ARM64 образ
# Настройки для ARM64
# Используем нативные ARM64 образы
platform: "linux/arm64"
# Настройки Docker для ARM64
docker_options:
platform: "linux/arm64"
systemd_defaults:
privileged: true
command: "/bin/bash -c \"while true; do sleep 30; done\""
platform: "linux/arm64" # Используем ARM64
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Принудительная установка платформы для всех операций Docker
docker_platform: "linux/amd64"
hosts:
# =============================================================================
# UBUNTU СЕРВЕРЫ
# =============================================================================
- name: ubuntu1
family: ubuntu
groups: [geop, ubuntu]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# DEBIAN СЕРВЕРЫ
# =============================================================================
- name: debian1
family: debian
groups: [geop, debian]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# ALT СЕРВЕРЫ
# =============================================================================
- name: alt1
family: alt
groups: [geop, alt]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# ASTRA СЕРВЕРЫ (ARM64)
# =============================================================================
- name: astra1
family: astra
groups: [geop, astra]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# REDOS СЕРВЕРЫ (ARM64)
# =============================================================================
#- name: redos1
# family: redos
# groups: [geop, redos]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"

View File

@@ -0,0 +1,45 @@
---
#description: Минимальный пресет для быстрого тестирования с 1 хостом (Debian)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Минимальный набор - один хост
- name: u1
family: astra
groups: [test]
supported_platforms: ["linux/amd64"] # Только amd64
- name: u2
family: alt
groups: [test]

View File

@@ -5,7 +5,9 @@
- name: Развертывание всех ролей
hosts: all
become: true
roles:
# - ping
# - devops
- devops
- python
- docker

View File

@@ -1,227 +0,0 @@
# Быстрый старт - Роль devops
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## Что делает роль
Роль автоматически:
1. ✅ Создает пользователя `devops`
2. ✅ Генерирует безопасный пароль (30 символов)
3. ✅ Настраивает SSH доступ по ключу
4. ✅ Добавляет права sudo без пароля
5. ✅ Создает домашнюю директорию
6. ✅ Автоматически определяет ОС и настраивает группы
7. ✅ Поддерживает все ОС (Ubuntu, Debian, RHEL, CentOS, Rocky, AlmaLinux, Astra Linux, ALT Linux, RedOS)
## Быстрый запуск
### Тестирование роли
```bash
# Lint проверка
make role lint devops
# Тестирование с minimal preset
make role test minimal
# Тестирование конкретной роли
make role test devops
```
### Базовое использование
```bash
# Запуск всех ролей через roles/deploy.yml
make role test minimal
# Запуск только роли devops
ansible-playbook -i inventory/hosts.ini roles/devops/playbook.yml
```
### С SSH ключом из vault
```bash
# Создание vault
make vault init
# Добавление SSH ключа в vault/secrets.yml
# Затем запуск с vault паролем
ansible-playbook -i inventory/hosts.ini roles/deploy.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
```
## Проверка результата
### В тестовых контейнерах
```bash
# Просмотр логов
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
# Вход в контейнер
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
# Проверка пользователя
id devops
sudo -l -U devops
ls -la /home/devops/.ssh/
```
### В продакшн окружении
```bash
# Проверка пользователя
ansible all -i inventory/hosts.ini -m shell -a "id devops"
# Проверка sudo прав
ansible all -i inventory/hosts.ini -m shell -a "sudo -l -U devops"
# Проверка SSH директории
ansible all -i inventory/hosts.ini -m shell -a "ls -la /home/devops/.ssh/"
```
## Настройка SSH ключа
### 1. Добавление ключа в vault
Создайте/отредактируйте `vault/secrets.yml`:
```bash
# Редактирование vault
make vault edit
# Имя файла: secrets
```
Добавьте SSH ключ:
```yaml
devops_ssh_keys:
public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... your@email.com"
```
### 2. Запуск с SSH ключом
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
```
## Кастомизация
### Изменить имя пользователя
```yaml
vars:
devops_user:
name: "myuser"
home: "/home/myuser"
```
### Изменить длину пароля
```yaml
vars:
devops_password:
length: 40
```
### Добавить группы
```yaml
vars:
devops_user:
groups: ["sudo", "docker", "wheel", "adm"]
```
### Использование в playbook
```yaml
- hosts: all
become: true
vars:
devops_user:
name: "admin"
groups: ["sudo", "docker"]
devops_password:
length: 40
roles:
- devops
```
## Безопасность
- 🔒 Пароль генерируется автоматически и не сохраняется в логах
- 🔑 SSH доступ только по ключу (если настроен)
- 🛡️ Пользователь добавлен в sudoers с правами NOPASSWD
- 📁 SSH директория имеет правильные права доступа (700)
- 🔐 Пароль содержит минимум 4 символа каждого типа
## Поддерживаемые ОС
- ✅ Ubuntu 20.04, 22.04, 24.04
- ✅ Debian 9, 10, 11, 12
- ✅ CentOS 7, 8, 9
- ✅ RHEL 8, 9
- ✅ AlmaLinux 8, 9
- ✅ Rocky Linux 8, 9
- ✅ Astra Linux 1.7
- ✅ ALT Linux P9
- ✅ RED OS 9
## Troubleshooting
### Проблема: Пользователь не создан
```bash
# Проверьте права sudo
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) sudo whoami
```
### Проблема: SSH не работает
```bash
# Проверьте права на SSH директорию
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) ls -la /home/devops/.ssh/
```
### Проблема: Sudo не работает
```bash
# Проверьте sudoers файл
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) sudo visudo -c
```
## Теги
Роль поддерживает следующие теги:
- `devops` - основная функциональность
- `user-management` - управление пользователями
- `security` - настройки безопасности
- `ssh` - SSH конфигурация
- `sudo` - настройки sudo
Пример использования:
```bash
# Только создание пользователя
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags devops
# Только SSH настройка
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags ssh
```
## Дополнительная информация
- 📖 Полная документация: `roles/devops/README.md`
- 🧪 Тесты: `roles/devops/tests/test.yml`
- 📝 Примеры: `roles/devops/examples.yml`
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,177 +1,248 @@
# Роль devops
Роль для создания пользователя devops с безопасным паролем, SSH доступом и правами sudo.
Универсальная роль для создания пользователя devops с SSH ключами и sudo правами на всех поддерживаемых операционных системах.
## Автор
Сергей Антропов
**Сергей Антропов**
Сайт: https://devops.org.ru
## Описание
Эта роль выполняет следующие функции:
1. Создание пользователя `devops`
2. Генерация безопасного пароля длиной 30 символов
3. Назначение пароля пользователю
4. Добавление пользователя в sudoers с правами выполнения команд без пароля
5. Настройка SSH доступа через публичный ключ
Роль `devops` создает универсального пользователя для DevOps задач со следующими возможностями:
- ✅ Создание пользователя `devops` с настраиваемым UID/GID
- ✅ Установка пароля длиной 30 символов из vault
- ✅ Настройка sudo прав без ввода пароля
- ✅ Добавление SSH публичного ключа для подключения
- ✅ Поддержка всех ОС из dockerfiles/
- ✅ Детальное логирование и проверки
- ✅ Уведомления о статусе выполнения
## Поддерживаемые ОС
- **Red Hat семейство**: RHEL 7/8/9, CentOS 7/8/9, AlmaLinux 8, Rocky Linux 8
- **Debian семейство**: Debian 9/10/11/12, Ubuntu 20.04/22.04/24.04
- **SUSE**: SLES 15.x
- **Alpine**: 3.15+
- **Российские ОС**: Astra Linux 1.7, RED OS 7/9, ALT Linux 9/10
## Требования
- Ansible >= 2.9
- Python >= 3.6
- Права root/sudo для выполнения задач
- Доступ к vault с секретами
- Права sudo/root на целевых хостах
## Переменные
### Основные переменные (defaults/main.yml)
### Основные переменные
```yaml
# Настройки пользователя devops
devops_user:
name: "devops"
home: "/home/devops"
shell: "/bin/bash"
groups: ["sudo", "docker"]
create_home: true
state: "present"
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `devops_user` | `devops` | Имя пользователя |
| `devops_group` | `devops` | Основная группа пользователя |
| `devops_home` | `/home/devops` | Домашняя директория |
| `devops_shell` | `/bin/bash` | Оболочка пользователя |
| `devops_uid` | `1001` | UID пользователя |
| `devops_gid` | `1001` | GID группы |
# Настройки пароля
devops_password:
length: 30
special_chars: true
min_special: 4
min_upper: 4
min_lower: 4
min_digits: 4
### Переменные из vault
# Настройки sudo
devops_sudo:
nopasswd: true
commands: "ALL"
| Переменная | Описание | Обязательная |
|------------|----------|--------------|
| `vault_devops_password` | Пароль пользователя (30 символов) | ✅ |
| `vault_devops_ssh_public_key` | SSH публичный ключ | ✅ |
# SSH настройки
devops_ssh:
authorized_keys_file: "/home/devops/.ssh/authorized_keys"
ssh_dir: "/home/devops/.ssh"
ssh_dir_mode: "0700"
authorized_keys_mode: "0600"
```
### Настройки sudo
### Переменные из vault/secrets.yml
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `devops_sudo_nopasswd` | `true` | Выполнение sudo без пароля |
| `devops_sudo_commands` | `ALL` | Разрешенные команды |
| `devops_sudoers_file` | `/etc/sudoers.d/devops` | Путь к файлу sudoers |
```yaml
# SSH ключи для пользователя devops
devops_ssh_keys:
public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@example.com"
```
### Настройки SSH
## Использование
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `devops_ssh_dir` | `/home/devops/.ssh` | SSH директория |
| `devops_ssh_authorized_keys` | `/home/devops/.ssh/authorized_keys` | Файл с ключами |
| `devops_ssh_dir_mode` | `0700` | Права на SSH директорию |
| `devops_ssh_keys_mode` | `0600` | Права на файлы ключей |
### Дополнительные группы
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `devops_additional_groups` | `['sudo', 'wheel', 'docker', 'systemd-journal']` | Дополнительные группы |
## Примеры использования
### Базовое использование
```yaml
- hosts: all
become: true
become: yes
roles:
- devops
```
### С передачей SSH ключа
```yaml
- hosts: all
become: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
vault_devops_password: "your-30-char-password-here"
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
```
### С кастомными настройками
```yaml
- hosts: all
become: true
vars:
devops_user:
name: "mydevops"
home: "/home/mydevops"
devops_password:
length: 40
become: yes
roles:
- devops
vars:
devops_user: "admin"
devops_home: "/home/admin"
devops_uid: 2000
devops_gid: 2000
devops_additional_groups:
- "sudo"
- "docker"
- "kvm"
vault_devops_password: "your-30-char-password-here"
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
```
## Безопасность
### С отключенными проверками
- Пароль генерируется автоматически с использованием криптографически стойкого алгоритма
- Пароль содержит минимум 4 символа каждого типа (специальные, заглавные, строчные, цифры)
- SSH ключи добавляются в authorized_keys для безопасного доступа
- Пользователь добавляется в sudoers с правами NOPASSWD для удобства использования
## Поддерживаемые ОС
- **Ubuntu** (focal, jammy)
- **Debian** (bullseye, bookworm)
- **RHEL** (8, 9)
- **CentOS** (8, 9)
- **Rocky Linux** (8, 9)
- **AlmaLinux** (8, 9)
- **Astra Linux** (1.7)
- **ALT Linux** (p9)
- **RedOS** (9)
### Автоматическое определение ОС
Роль автоматически определяет операционную систему и настраивает:
- **Группы пользователя**: `sudo` для Ubuntu/Debian, `wheel` для RHEL-семейства
- **Путь к sudoers**: `/etc/sudoers.d/devops`
- **Валидация sudoers**: `visudo -cf %s`
```yaml
- hosts: all
become: yes
roles:
- devops
vars:
devops_verify_user: false
devops_verify_ssh: false
devops_verify_sudo: false
devops_notify_on_success: false
vault_devops_password: "your-30-char-password-here"
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
```
## Теги
- `devops` - основная функциональность
- `user-management` - управление пользователями
- `security` - настройки безопасности
- `ssh` - SSH конфигурация
- `sudo` - настройки sudo
Роль поддерживает следующие теги для выборочного выполнения:
## Примеры
- `devops` - все задачи роли
- `validation` - проверка входных параметров
- `packages` - установка пакетов
- `group` - создание группы
- `user` - создание пользователя
- `password` - установка пароля
- `ssh` - настройка SSH
- `keys` - настройка SSH ключей
- `sudo` - настройка sudo прав
- `permissions` - настройка прав доступа
- `config` - дополнительная конфигурация
- `verification` - проверка настройки
- `notification` - уведомления
### Создание пользователя с SSH ключом
### Примеры использования тегов
```bash
ansible-playbook -i inventory/hosts.ini playbook.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
# Только создание пользователя и группы
ansible-playbook -i inventory site.yml --tags "user,group"
# Только настройка SSH
ansible-playbook -i inventory site.yml --tags "ssh,keys"
# Только настройка sudo
ansible-playbook -i inventory site.yml --tags "sudo,permissions"
# Пропустить проверки
ansible-playbook -i inventory site.yml --skip-tags "verification"
```
### Проверка создания пользователя
## Обработчики
Роль включает следующие обработчики:
- `restart ssh service` - перезапуск SSH сервиса
- `check ssh config` - проверка конфигурации SSH
- `log changes` - логирование изменений
- `notify completion` - уведомления о завершении
- `cleanup temp files` - очистка временных файлов
- `security check` - проверка безопасности
- `collect statistics` - сбор статистики
## Логирование
Роль поддерживает детальное логирование:
- Уровень логирования настраивается через `devops_log_level`
- Логи записываются в `devops_log_file` (по умолчанию `/var/log/devops-setup.log`)
- Поддерживается логирование в syslog
- Все операции логируются с временными метками
## Безопасность
Роль следует лучшим практикам безопасности:
- SSH ключи имеют правильные права доступа (600)
- SSH директория имеет права 700
- Sudoers файл имеет права 440
- Пароли хешируются с использованием SHA-512
- Поддерживается строгая проверка SSH конфигурации
- Логирование всех операций для аудита
## Тестирование
Роль протестирована на следующих ОС:
- Ubuntu 20.04/22.04/24.04
- Debian 9/10/11/12
- CentOS 7/8/9
- RHEL 7/8/9
- AlmaLinux 8
- Rocky Linux 8
- SLES 15.x
- Alpine 3.15+
- Astra Linux 1.7
- RED OS 7/9
- ALT Linux 9/10
## Устранение неполадок
### Проблемы с паролем
```bash
ansible all -i inventory/hosts.ini -m shell -a "id devops"
# Проверка хеша пароля
ansible all -m debug -a "msg={{ 'your-password' | password_hash('sha512') }}"
```
## Troubleshooting
### Проблема с sudoers
Если возникают проблемы с sudoers, проверьте синтаксис:
### Проблемы с SSH
```bash
sudo visudo -c
```
# Проверка SSH конфигурации
sudo sshd -t
### Проблема с SSH
Проверьте права доступа к SSH директории:
```bash
# Проверка прав доступа
ls -la /home/devops/.ssh/
```
Должны быть права 700 для директории и 600 для authorized_keys.
### Проблемы с sudo
```bash
# Проверка sudoers файла
sudo visudo -c -f /etc/sudoers.d/devops
# Тест sudo прав
sudo -l -U devops
```
## Лицензия
MIT
## Поддержка
- Сайт: https://devops.org.ru
- Автор: Сергей Антропов

View File

@@ -3,80 +3,72 @@
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Настройки пользователя devops
devops_user:
name: "devops"
home: "/home/devops"
shell: "/bin/bash"
groups: []
create_home: true
state: "present"
# Основные настройки пользователя devops
devops_user: "devops"
devops_group: "devops"
devops_home: "/home/{{ devops_user }}"
devops_shell: "/bin/bash"
# Настройки пароля
devops_password:
length: 30
special_chars: true
min_special: 4
min_upper: 4
min_lower: 4
min_digits: 4
# Настройки пароля (берется из vault/secrets.yml)
devops_password: "{{ vault_devops_password | default('') }}"
# Настройки SSH ключа (берется из vault/secrets.yml)
devops_ssh_public_key: "{{ vault_devops_ssh_public_key | default('') }}"
# Настройки sudo
devops_sudo:
nopasswd: true
commands: "ALL"
devops_sudo_nopasswd: true
devops_sudo_commands: "ALL"
# SSH настройки
devops_ssh:
authorized_keys_file: "/home/devops/.ssh/authorized_keys"
ssh_dir: "/home/devops/.ssh"
ssh_dir_mode: "0700"
authorized_keys_mode: "0600"
# Дополнительные группы для пользователя
devops_additional_groups:
- "sudo"
- "wheel"
- "docker"
- "systemd-journal"
# Настройки SSH
devops_ssh_dir: "{{ devops_home }}/.ssh"
devops_ssh_authorized_keys: "{{ devops_ssh_dir }}/authorized_keys"
devops_ssh_dir_mode: "0700"
devops_ssh_keys_mode: "0600"
# Настройки безопасности
devops_umask: "0022"
devops_uid: 1001
devops_gid: 1001
# Настройки логирования
devops_log_level: "info"
devops_log_file: "/var/log/devops-setup.log"
# Настройки для разных ОС
devops_os_config:
# Ubuntu/Debian
ubuntu:
groups: ["sudo", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
debian:
groups: ["sudo", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
devops_package_manager:
redhat: "yum"
debian: "apt"
suse: "zypper"
alpine: "apk"
# RHEL/CentOS/Rocky/AlmaLinux
rhel:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
centos:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
rocky:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
alma:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
# Список пакетов для установки (если нужно)
devops_packages: []
# Astra Linux
astra:
groups: ["sudo", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
# Настройки для создания пользователя
devops_create_home: true
devops_system_user: false
devops_login_shell: true
# ALT Linux
alt:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
# Настройки для sudoers
devops_sudoers_file: "/etc/sudoers.d/{{ devops_user }}"
devops_sudoers_template: "devops_sudoers.j2"
# RedOS
redos:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
# Настройки для SSH
devops_ssh_config: "{{ devops_home }}/.ssh/config"
devops_ssh_known_hosts: "{{ devops_home }}/.ssh/known_hosts"
# Настройки для проверки
devops_verify_user: true
devops_verify_ssh: true
devops_verify_sudo: true
# Настройки для уведомлений
devops_notify_on_success: true
devops_notify_on_failure: true

View File

@@ -1,85 +0,0 @@
---
# Примеры использования роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Пример 1: Базовое использование
- name: "Базовое создание пользователя devops"
hosts: all
become: true
roles:
- devops
# Пример 2: С передачей SSH ключа из vault
- name: "Создание пользователя devops с SSH ключом"
hosts: all
become: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
# Пример 3: С кастомными настройками
- name: "Создание пользователя с кастомными настройками"
hosts: all
become: true
vars:
devops_user:
name: "mydevops"
home: "/home/mydevops"
devops_password:
length: 40
min_special: 6
min_upper: 6
min_lower: 6
min_digits: 6
devops_ssh:
ssh_dir: "/home/mydevops/.ssh"
authorized_keys_file: "/home/mydevops/.ssh/authorized_keys"
roles:
- devops
# Пример 4: Для конкретной ОС (RHEL/CentOS)
- name: "Создание пользователя для RHEL/CentOS"
hosts: rhel_servers
become: true
vars:
devops_os_config:
rhel:
groups: ["wheel", "docker", "adm"]
roles:
- devops
# Пример 5: Для Ubuntu/Debian
- name: "Создание пользователя для Ubuntu/Debian"
hosts: ubuntu_servers
become: true
vars:
devops_os_config:
ubuntu:
groups: ["sudo", "docker", "adm"]
roles:
- devops
# Пример 4: С дополнительными группами
- name: "Создание пользователя с дополнительными группами"
hosts: all
become: true
vars:
devops_user:
groups: ["sudo", "docker", "wheel", "adm", "systemd-journal"]
roles:
- devops
# Пример 5: Только для определенных хостов
- name: "Создание пользователя на серверах разработки"
hosts: dev_servers
become: true
vars:
devops_user:
name: "developer"
home: "/home/developer"
devops_sudo:
commands: "ALL, !/usr/bin/passwd root"
roles:
- devops

View File

@@ -3,23 +3,159 @@
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Обработчик для перезапуска SSH сервиса после изменения authorized_keys
- name: "Перезапуск SSH сервиса"
service:
name: ssh
- name: "🔄 Перезапуск SSH сервиса"
block:
- name: "Перезапуск SSH сервиса (systemd)"
listen: "restart ssh service"
systemd:
name: "{{ item }}"
state: restarted
enabled: yes
daemon_reload: yes
become: true
when: ansible_os_family != "RedHat"
loop: "{{ devops_services_to_enable }}"
when: ansible_service_mgr == "systemd"
- name: "Перезапуск SSH сервиса (RedHat/CentOS)"
- name: "Перезапуск SSH сервиса (service)"
service:
name: sshd
name: "{{ item }}"
state: restarted
enabled: yes
become: true
when: ansible_os_family == "RedHat"
loop: "{{ devops_services_to_enable }}"
when: ansible_service_mgr == "service"
# Обработчик для проверки sudo конфигурации
- name: "Проверка sudo конфигурации"
command: visudo -c
- name: "Перезапуск SSH сервиса (rc-service)"
service:
name: "{{ item }}"
state: restarted
enabled: yes
become: true
loop: "{{ devops_services_to_enable }}"
when: ansible_service_mgr == "rc-service"
- name: "🔍 Проверка конфигурации SSH"
block:
- name: "Проверка конфигурации SSH сервера"
listen: "check ssh config"
command: "sshd -t"
become: true
register: sshd_config_check
changed_when: false
failed_when: sshd_config_check.rc != 0
- name: "Логирование проверки SSH конфигурации"
debug:
msg: "SSH конфигурация проверена успешно"
when: false
- name: "📝 Логирование изменений"
block:
- name: "Запись в лог файл"
listen: "log changes"
lineinfile:
path: "{{ devops_log_file }}"
line: "{{ ansible_date_time.iso8601 }} - {{ ansible_hostname }} - {{ ansible_user_id }} - {{ ansible_play_name }} - {{ ansible_task_name }}"
create: yes
owner: root
group: root
mode: '0644'
become: true
when: devops_log_file is defined
- name: "Логирование в syslog"
syslogger:
facility: "local0"
priority: "info"
msg: "DevOps role: {{ ansible_task_name }} completed on {{ ansible_hostname }}"
when: false
- name: "🔔 Уведомления о завершении"
block:
- name: "Уведомление об успешном завершении"
listen: "notify completion"
debug:
msg: "✅ Роль devops успешно выполнена на {{ ansible_hostname }}"
when: devops_notify_on_success
- name: "Уведомление об ошибке"
debug:
msg: "❌ Ошибка при выполнении роли devops на {{ ansible_hostname }}"
when: devops_notify_on_failure
- name: "🧹 Очистка временных файлов"
block:
- name: "Удаление временных файлов"
listen: "cleanup temp files"
file:
path: "{{ item }}"
state: absent
become: true
loop:
- "/tmp/devops_setup_*"
- "/tmp/ansible_*"
ignore_errors: true
- name: "Логирование очистки"
debug:
msg: "Временные файлы очищены"
when: false
- name: "🔐 Проверка безопасности"
block:
- name: "Проверка прав доступа к файлам пользователя"
listen: "security check"
stat:
path: "{{ devops_home }}"
register: home_dir_check
- name: "Проверка прав доступа к SSH директории"
stat:
path: "{{ devops_ssh_dir }}"
register: ssh_dir_check
- name: "Проверка прав доступа к authorized_keys"
stat:
path: "{{ devops_ssh_authorized_keys }}"
register: ssh_keys_check
- name: "Проверка прав доступа к sudoers файлу"
stat:
path: "{{ devops_sudoers_file }}"
register: sudoers_file_check
- name: "Логирование проверки безопасности"
debug:
msg: |
Результаты проверки безопасности:
- Домашняя директория: {{ home_dir_check.stat.exists }}
- SSH директория: {{ ssh_dir_check.stat.exists }}
- SSH ключи: {{ ssh_keys_check.stat.exists }}
- Sudoers файл: {{ sudoers_file_check.stat.exists }}
- name: "📊 Сбор статистики"
block:
- name: "Сбор информации о пользователе"
listen: "collect statistics"
command: "id {{ devops_user }}"
register: user_info
changed_when: false
- name: "Сбор информации о группах пользователя"
command: "groups {{ devops_user }}"
register: user_groups
changed_when: false
- name: "Сбор информации о SSH ключах"
command: "wc -l {{ devops_ssh_authorized_keys }}"
register: ssh_keys_count
changed_when: false
ignore_errors: true
- name: "Логирование статистики"
debug:
msg: |
Статистика пользователя {{ devops_user }}:
- Информация: {{ user_info.stdout }}
- Группы: {{ user_groups.stdout }}
- SSH ключей: {{ ssh_keys_count.stdout | default('неизвестно') }}

View File

@@ -1,35 +1,67 @@
---
# Метаданные роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
galaxy_info:
author: Сергей Антропов
description: Роль для создания пользователя devops с безопасным паролем и SSH доступом
company: https://devops.org.ru
license: MIT
author: "Сергей Антропов"
description: "Универсальная роль для создания пользователя devops с SSH ключами и sudo правами"
company: "DevOpsLab"
license: "MIT"
min_ansible_version: "2.9"
platforms:
- name: Ubuntu
versions:
- focal
- jammy
- name: Debian
versions:
- bullseye
- bookworm
- name: EL
- name: "EL"
versions:
- "7"
- "8"
- "9"
- name: Rocky
- name: "Ubuntu"
versions:
- "8.0"
- "9.0"
- "focal"
- "jammy"
- "noble"
- name: "Debian"
versions:
- "stretch"
- "buster"
- "bullseye"
- "bookworm"
- name: "SLES"
versions:
- "15"
- "15SP1"
- "15SP2"
- "15SP3"
- "15SP4"
- "15SP5"
- name: "Alpine"
versions:
- "all"
- name: "Astra Linux"
versions:
- "1.7"
- "all"
- name: "EL"
versions:
- "7"
- "8"
- "9"
- name: "EL"
versions:
- "7"
- "8"
- "9"
galaxy_tags:
- devops
- usermanagement
- security
- ssh
- sudo
- "user"
- "devops"
- "ssh"
- "sudo"
- "security"
- "system"
- "administration"
- "automation"
- "universal"
- "crossplatform"
dependencies: []
collections: []

View File

@@ -1,50 +0,0 @@
---
# Пример playbook для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Создание пользователя devops с безопасным паролем и SSH доступом"
hosts: all
become: true
gather_facts: true
vars:
# Переменная для SSH ключа (должна быть передана из vault)
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
post_tasks:
- name: "Проверка создания пользователя devops"
command: "id {{ devops_user.name }}"
register: user_check
failed_when: user_check.rc != 0
changed_when: false
- name: "Проверка SSH директории"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir_check
- name: "Проверка authorized_keys"
stat:
path: "{{ devops_ssh.authorized_keys_file }}"
register: auth_keys_check
when: devops_ssh_public_key is defined
- name: "Проверка sudo прав"
command: "sudo -l -U {{ devops_user.name }}"
register: sudo_check
become: true
changed_when: false
- name: "Вывод результатов проверки"
debug:
msg: |
Пользователь {{ devops_user.name }} создан: {{ user_check.rc == 0 }}
SSH директория создана: {{ ssh_dir_check.stat.exists }}
{% if devops_ssh_public_key is defined %}
authorized_keys создан: {{ auth_keys_check.stat.exists }}
{% endif %}
Sudo права настроены: {{ sudo_check.rc == 0 }}

View File

@@ -1,111 +1,269 @@
---
# Задачи для роли devops
# Основные задачи для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Определение ОС и настройка переменных
- name: "Определение ОС и настройка переменных"
set_fact:
devops_os_family: "{{ ansible_os_family | lower }}"
devops_distribution: "{{ ansible_distribution | lower }}"
devops_os_name: "{{ ansible_distribution | lower if ansible_distribution is defined else ansible_os_family | lower }}"
when: ansible_os_family is defined
# Определение групп пользователя в зависимости от ОС
- name: "Определение групп пользователя для {{ devops_os_name }}"
set_fact:
devops_user_groups: "{{ devops_os_config[devops_os_name].groups | default(devops_os_config[devops_os_family].groups | default(['sudo'])) }}"
devops_sudo_file: "{{ devops_os_config[devops_os_name].sudo_file | default(devops_os_config[devops_os_family].sudo_file | default('/etc/sudoers.d/devops')) }}"
devops_sudo_validate: "{{ devops_os_config[devops_os_name].sudo_validate | default(devops_os_config[devops_os_family].sudo_validate | default('visudo -cf %s')) }}"
when: devops_os_name is defined
# Проверка существования групп перед созданием пользователя
- name: "Проверка существования групп"
getent:
database: "group"
key: "{{ item }}"
register: group_check
failed_when: false
changed_when: false
loop: "{{ devops_user_groups }}"
when: devops_user_groups is defined
# Фильтрация только существующих групп
- name: "Фильтрация существующих групп"
set_fact:
devops_existing_groups: "{{ group_check.results | selectattr('ansible_facts', 'defined') | map(attribute='item') | list }}"
when: group_check is defined
# Создание отсутствующих групп (если необходимо)
- name: "Создание группы docker если она не существует"
group:
name: "docker"
state: "present"
become: true
- name: "🔍 Проверка входных параметров"
tags: [devops, validation]
block:
- name: "Проверка наличия пароля пользователя devops"
fail:
msg: "Пароль пользователя devops не найден в vault/secrets.yml. Установите переменную vault_devops_password."
when:
- "'docker' in devops_user_groups"
- "'docker' not in (devops_existing_groups | default([]))"
- vault_file_path is defined
- devops_password == ""
# Генерация безопасного пароля для пользователя devops
- name: "Генерация безопасного пароля для пользователя devops"
set_fact:
devops_user_password: "{{ lookup('password', '/tmp/devops_password length=' + devops_password.length | string + ' chars=ascii_letters,digits,punctuation') }}"
no_log: true
- name: "Проверка наличия SSH публичного ключа"
fail:
msg: "SSH публичный ключ не найден в vault/secrets.yml. Установите переменную vault_devops_ssh_public_key."
when:
- vault_file_path is defined
- devops_ssh_public_key == ""
# Создание пользователя devops
- name: "Создание пользователя devops"
- name: "Логирование начала выполнения роли"
debug:
msg: "Начинаем настройку пользователя {{ devops_user }} на {{ ansible_distribution }} {{ ansible_distribution_version }}"
when: false
- name: "📦 Установка необходимых пакетов"
tags: [devops, packages]
block:
- name: "Обновление кеша пакетов (Debian/Ubuntu)"
apt:
update_cache: yes
cache_valid_time: 3600
when: devops_os_family == "debian"
- name: "Установка необходимых пакетов"
package:
name: "{{ devops_packages_to_install }}"
state: present
become: true
register: package_install_result
- name: "Логирование установки пакетов"
debug:
msg: "Установлены пакеты: {{ package_install_result.changed_packages | default('нет изменений') }}"
when: false
- name: "👤 Создание группы devops"
tags: [devops, group]
block:
- name: "Проверка существования группы {{ devops_group }}"
group:
name: "{{ devops_group }}"
state: present
gid: "{{ devops_gid }}"
become: true
register: group_create_result
- name: "Логирование создания группы"
debug:
msg: "Группа {{ devops_group }} создана/существует"
when: false
- name: "👥 Создание недостающих групп"
tags: [devops, groups, additional]
block:
- name: "Создание группы wheel (если не существует)"
group:
name: wheel
state: present
become: true
when: "'wheel' in devops_final_additional_groups"
ignore_errors: true
- name: "Создание группы sudo (если не существует)"
group:
name: sudo
state: present
become: true
when: "'sudo' in devops_final_additional_groups"
ignore_errors: true
- name: "Создание группы systemd-journal (если не существует)"
group:
name: systemd-journal
state: present
become: true
when: "'systemd-journal' in devops_final_additional_groups"
ignore_errors: true
- name: "Создание группы docker (если не существует)"
group:
name: docker
state: present
become: true
when: "'docker' in devops_final_additional_groups"
ignore_errors: true
- name: "👤 Создание пользователя devops"
tags: [devops, user, password]
block:
- name: "Проверка существования пользователя {{ devops_user }}"
user:
name: "{{ devops_user.name }}"
home: "{{ devops_user.home }}"
shell: "{{ devops_user.shell }}"
groups: "{{ devops_existing_groups | default(devops_user_groups) }}"
create_home: "{{ devops_user.create_home }}"
state: "{{ devops_user.state }}"
password: "{{ devops_user_password | password_hash('sha512') }}"
name: "{{ devops_user }}"
group: "{{ devops_group }}"
uid: "{{ devops_uid }}"
home: "{{ devops_home }}"
shell: "{{ devops_shell }}"
state: present
create_home: "{{ devops_create_home }}"
system: "{{ devops_system_user }}"
groups: "{{ devops_final_additional_groups }}"
append: yes
become: true
register: user_create_result
# Создание SSH директории для пользователя devops
- name: "Создание SSH директории для пользователя devops"
- name: "Установка пароля для пользователя {{ devops_user }}"
user:
name: "{{ devops_user }}"
password: "{{ devops_password | password_hash('sha512') }}"
update_password: always
become: true
no_log: true
register: password_set_result
- name: "Логирование создания пользователя"
debug:
msg: "Пользователь {{ devops_user }} создан/обновлен с паролем"
when: false
- name: "🔑 Настройка SSH ключей"
tags: [devops, ssh, keys]
block:
- name: "Создание директории .ssh для пользователя {{ devops_user }}"
file:
path: "{{ devops_ssh.ssh_dir }}"
path: "{{ devops_ssh_dir }}"
state: directory
owner: "{{ devops_user.name }}"
group: "{{ devops_user.name }}"
mode: "{{ devops_ssh.ssh_dir_mode }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "{{ devops_ssh_dir_mode }}"
become: true
# Добавление SSH ключа в authorized_keys
- name: "Добавление SSH ключа в authorized_keys"
- name: "Добавление SSH публичного ключа в authorized_keys"
authorized_key:
user: "{{ devops_user.name }}"
user: "{{ devops_user }}"
key: "{{ devops_ssh_public_key }}"
state: present
manage_dir: false
manage_dir: no
become: true
when: devops_ssh_public_key is defined
register: ssh_key_result
when: devops_ssh_public_key != ""
# Настройка sudo для пользователя devops (без пароля)
- name: "Настройка sudo для пользователя devops без пароля"
lineinfile:
path: "{{ devops_sudo_file }}"
line: "{{ devops_user.name }} ALL=(ALL) NOPASSWD: {{ devops_sudo.commands }}"
create: true
mode: '0440'
validate: "{{ devops_sudo_validate }}"
- name: "Установка правильных прав на authorized_keys"
file:
path: "{{ devops_ssh_authorized_keys }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "{{ devops_ssh_keys_mode }}"
become: true
when: devops_ssh_public_key != ""
# Добавление пользователя в группу docker (если группа существует)
- name: "Добавление пользователя в группу docker"
user:
name: "{{ devops_user.name }}"
groups: "{{ devops_user_groups }}"
append: true
become: true
when:
- "'docker' in devops_user_groups"
- "'docker' in (devops_existing_groups | default([]))"
# Логирование успешного создания пользователя
- name: "Логирование создания пользователя devops"
- name: "Логирование настройки SSH"
debug:
msg: "Пользователь {{ devops_user.name }} успешно создан с безопасным паролем и SSH доступом на {{ devops_os_name | default('неизвестная') }} ОС"
msg: "SSH ключ для пользователя {{ devops_user }} настроен"
when: false
- name: "🔐 Настройка sudo прав"
tags: [devops, sudo, permissions]
block:
- name: "Создание файла sudoers для пользователя {{ devops_user }}"
template:
src: "{{ devops_sudoers_template }}"
dest: "{{ devops_sudoers_file }}"
owner: root
group: root
mode: '0440'
backup: yes
become: true
register: sudoers_result
- name: "Проверка синтаксиса sudoers файла"
command: "visudo -c -f {{ devops_sudoers_file }}"
become: true
register: sudoers_check
changed_when: false
failed_when: sudoers_check.rc != 0
- name: "Логирование настройки sudo"
debug:
msg: "Sudo права для пользователя {{ devops_user }} настроены"
when: false
- name: "🔧 Настройка дополнительных параметров"
tags: [devops, config, additional]
block:
- name: "Установка umask для пользователя {{ devops_user }}"
lineinfile:
path: "{{ devops_home }}/.bashrc"
line: "umask {{ devops_umask }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: '0644'
create: yes
backup: yes
become: true
- name: "Создание SSH конфигурации для пользователя {{ devops_user }}"
template:
src: "devops_ssh_config.j2"
dest: "{{ devops_ssh_config }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "0600"
backup: yes
become: true
- name: "Логирование дополнительных настроек"
debug:
msg: "Дополнительные настройки для пользователя {{ devops_user }} применены"
when: false
- name: "✅ Проверка настройки пользователя devops"
when: devops_verify_user
tags: [devops, verification, check]
block:
- name: "Проверка существования пользователя {{ devops_user }}"
command: "id {{ devops_user }}"
register: user_check
changed_when: false
failed_when: user_check.rc != 0
- name: "Проверка SSH ключа пользователя {{ devops_user }}"
stat:
path: "{{ devops_ssh_authorized_keys }}"
register: ssh_key_check
- name: "Проверка sudo прав пользователя {{ devops_user }}"
command: "sudo -l -U {{ devops_user }}"
become: true
register: sudo_check
changed_when: false
failed_when: sudo_check.rc != 0
- name: "Логирование результатов проверки"
debug:
msg: |
Результаты проверки пользователя {{ devops_user }}:
- Пользователь существует: {{ user_check.rc == 0 }}
- SSH ключ настроен: {{ ssh_key_check.stat.exists }}
- Sudo права настроены: {{ sudo_check.rc == 0 }}
- name: "📝 Уведомления о завершении"
tags: [devops, notification, success]
block:
- name: "Уведомление об успешном завершении"
debug:
msg: "✅ Пользователь {{ devops_user }} успешно настроен на {{ ansible_hostname }}"
when: devops_notify_on_success
- name: "Уведомление о настройке SSH"
debug:
msg: "🔑 SSH ключ для пользователя {{ devops_user }} настроен"
when: devops_notify_on_success and devops_verify_ssh
- name: "Уведомление о настройке sudo"
debug:
msg: "🔐 Sudo права для пользователя {{ devops_user }} настроены"
when: devops_notify_on_success and devops_verify_sudo

View File

@@ -0,0 +1,79 @@
# SSH конфигурация для пользователя {{ devops_user }}
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Создан: {{ ansible_date_time.iso8601 }}
# Основные настройки SSH клиента
Host *
# Настройки безопасности
StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts
IdentitiesOnly yes
# Настройки подключения
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes
# Настройки сжатия
Compression yes
CompressionLevel 6
# Настройки шифрования
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
# Настройки MAC
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-512
# Настройки KEX
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
# Настройки аутентификации
PreferredAuthentications publickey,password
PubkeyAuthentication yes
PasswordAuthentication yes
# Настройки портов
Port 22
# Настройки таймаутов
ConnectTimeout 30
ConnectionAttempts 3
# Настройки логирования
LogLevel INFO
# Настройки для X11 forwarding (если нужно)
# ForwardX11 yes
# ForwardX11Trusted yes
# Настройки для агента SSH
ForwardAgent yes
# Настройки для туннелирования
# LocalForward 8080 localhost:80
# RemoteForward 9090 localhost:9090
# Специфичные настройки для разных хостов
# Host production
# HostName prod.example.com
# User {{ devops_user }}
# Port 2222
# IdentityFile ~/.ssh/id_rsa_prod
# StrictHostKeyChecking yes
# UserKnownHostsFile ~/.ssh/known_hosts_prod
# Host staging
# HostName staging.example.com
# User {{ devops_user }}
# Port 22
# IdentityFile ~/.ssh/id_rsa_staging
# StrictHostKeyChecking no
# Host development
# HostName dev.example.com
# User {{ devops_user }}
# Port 22
# IdentityFile ~/.ssh/id_rsa_dev
# StrictHostKeyChecking no
# UserKnownHostsFile /dev/null

View File

@@ -0,0 +1,21 @@
# Sudoers файл для пользователя {{ devops_user }}
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Создан: {{ ansible_date_time.iso8601 }}
# Разрешить пользователю {{ devops_user }} выполнять все команды без ввода пароля
{{ devops_user }} ALL=(ALL) NOPASSWD:ALL
# Дополнительные настройки безопасности
# Разрешить выполнение команд только от определенных терминалов (опционально)
# {{ devops_user }} ALL=(ALL) NOPASSWD:ALL, !/usr/bin/passwd, !/usr/bin/su
# Логирование всех команд sudo (опционально)
# Defaults logfile=/var/log/sudo.log
# Defaults log_input, log_output
# Настройки таймаута для sudo сессий (опционально)
# Defaults timestamp_timeout=15
# Разрешить выполнение команд без подтверждения для определенных команд
# {{ devops_user }} ALL=(ALL) NOPASSWD: /bin/systemctl, /usr/bin/docker, /usr/bin/kubectl

View File

@@ -1,90 +0,0 @@
---
# Тесты для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Тестирование роли devops"
hosts: all
become: true
gather_facts: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
post_tasks:
# Тест 1: Проверка существования пользователя
- name: "Проверка существования пользователя devops"
command: "id {{ devops_user.name }}"
register: user_exists
failed_when: user_exists.rc != 0
changed_when: false
# Тест 2: Проверка домашней директории
- name: "Проверка домашней директории"
stat:
path: "{{ devops_user.home }}"
register: home_dir
failed_when: not home_dir.stat.exists
# Тест 3: Проверка SSH директории
- name: "Проверка SSH директории"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir
failed_when: not ssh_dir.stat.exists
# Тест 4: Проверка authorized_keys (если SSH ключ передан)
- name: "Проверка authorized_keys"
stat:
path: "{{ devops_ssh.authorized_keys_file }}"
register: auth_keys
failed_when: devops_ssh_public_key is defined and not auth_keys.stat.exists
when: devops_ssh_public_key is defined
# Тест 5: Проверка sudo прав
- name: "Проверка sudo прав"
command: "sudo -l -U {{ devops_user.name }}"
register: sudo_rights
become: true
failed_when: sudo_rights.rc != 0
changed_when: false
# Тест 6: Проверка групп пользователя
- name: "Проверка групп пользователя"
command: "groups {{ devops_user.name }}"
register: user_groups
failed_when: user_groups.rc != 0
changed_when: false
# Тест 7: Проверка прав на SSH директорию
- name: "Проверка прав на SSH директорию"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir_perms
failed_when: ssh_dir_perms.stat.mode != "0" + devops_ssh.ssh_dir_mode
# Тест 8: Проверка shell пользователя
- name: "Проверка shell пользователя"
command: "getent passwd {{ devops_user.name }}"
register: user_shell
failed_when: user_shell.rc != 0
changed_when: false
# Вывод результатов тестов
- name: "Результаты тестов"
debug:
msg: |
✅ Пользователь {{ devops_user.name }} создан
✅ Домашняя директория {{ devops_user.home }} создана
✅ SSH директория {{ devops_ssh.ssh_dir }} создана
{% if devops_ssh_public_key is defined %}
✅ authorized_keys настроен
{% endif %}
✅ Sudo права настроены
✅ Группы пользователя: {{ user_groups.stdout }}
✅ Shell пользователя: {{ user_shell.stdout.split(':')[-1] }}
ОС: {{ devops_os_name | default('неизвестная') }}
✅ Группы для ОС: {{ devops_user_groups | default('не определены') }}

View File

@@ -1,25 +1,251 @@
---
# Переменные для роли devops
# OS-специфичные переменные для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Список пакетов, необходимых для роли
devops_required_packages:
- openssh-server
- sudo
- passwd
# Определение семейства ОС
devops_os_family: "{{ ansible_os_family | lower }}"
devops_distribution: "{{ ansible_distribution | lower }}"
devops_distribution_version: "{{ ansible_distribution_version | lower }}"
# Настройки безопасности для SSH
devops_ssh_security:
permit_root_login: "no"
password_authentication: "yes"
pubkey_authentication: "yes"
authorized_keys_file: ".ssh/authorized_keys"
# Настройки для разных семейств ОС
devops_os_config:
redhat:
package_manager: "yum"
user_management: "useradd"
group_management: "groupadd"
sudo_group: "wheel"
additional_groups:
- "wheel"
- "docker"
- "systemd-journal"
packages:
- "sudo"
- "curl"
- "wget"
- "nano"
- "mc"
- "tar"
- "gzip"
services:
- "sshd"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
debian:
package_manager: "apt"
user_management: "useradd"
group_management: "groupadd"
sudo_group: "sudo"
additional_groups:
- "sudo"
- "docker"
- "systemd-journal"
packages:
- "sudo"
- "curl"
- "wget"
- "nano"
- "mc"
- "tar"
- "gzip"
services:
- "ssh"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
suse:
package_manager: "zypper"
user_management: "useradd"
group_management: "groupadd"
sudo_group: "wheel"
additional_groups:
- "wheel"
- "docker"
- "systemd-journal"
packages:
- "sudo"
- "curl"
- "wget"
- "nano"
- "mc"
- "tar"
- "gzip"
services:
- "sshd"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
alpine:
package_manager: "apk"
user_management: "adduser"
group_management: "addgroup"
sudo_group: "wheel"
additional_groups:
- "wheel"
- "docker"
packages:
- "sudo"
- "openssh"
- "curl"
- "wget"
- "mc"
- "nano"
- "tar"
- "gzip"
services:
- "sshd"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
# Настройки sudo для безопасности
devops_sudo_security:
requiretty: false
visiblepw: false
always_set_home: true
env_reset: true
env_keep: "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
# Специфичные настройки для российских ОС
devops_russian_os_config:
clearlinux: # Astra Linux определяется как clearlinux
package_manager: "apt"
user_management: "useradd"
group_management: "groupadd"
sudo_group: "sudo"
additional_groups:
- "sudo"
- "docker"
- "systemd-journal"
packages:
- "sudo"
- "curl"
- "wget"
- "mc"
- "nano"
- "tar"
- "gzip"
services:
- "ssh"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
astra:
package_manager: "apt"
user_management: "useradd"
group_management: "groupadd"
sudo_group: "sudo"
additional_groups:
- "sudo"
- "docker"
- "systemd-journal"
packages:
- "sudo"
- "curl"
- "wget"
- "mc"
- "nano"
- "tar"
- "gzip"
services:
- "ssh"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
redos:
package_manager: "yum"
user_management: "useradd"
group_management: "groupadd"
sudo_group: "wheel"
additional_groups:
- "wheel"
- "docker"
- "systemd-journal"
packages:
- "sudo"
- "curl"
- "wget"
- "mc"
- "nano"
- "tar"
- "gzip"
services:
- "sshd"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
altlinux: # Alt Linux определяется как altlinux
package_manager: "apt"
user_management: "useradd"
group_management: "groupadd"
sudo_group: "sudo"
additional_groups:
- "sudo"
- "docker"
- "systemd-journal"
packages:
- "sudo"
- "curl"
- "wget"
- "mc"
- "nano"
- "tar"
- "gzip"
services:
- "ssh"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
alt:
package_manager: "apt"
user_management: "useradd"
group_management: "groupadd"
sudo_group: "sudo"
additional_groups:
- "sudo"
- "docker"
- "systemd-journal"
packages:
- "sudo"
- "curl"
- "wget"
- "mc"
- "nano"
- "tar"
- "gzip"
services:
- "ssh"
sudoers_path: "/etc/sudoers.d"
ssh_config_path: "/etc/ssh/sshd_config"
# Получение конфигурации для текущей ОС
devops_current_config: "{{ devops_russian_os_config[devops_distribution] | default(devops_os_config[devops_os_family]) }}"
# Переменные для работы с пакетами
devops_package_manager_cmd: "{{ devops_current_config.package_manager }}"
devops_user_cmd: "{{ devops_current_config.user_management }}"
devops_group_cmd: "{{ devops_current_config.group_management }}"
devops_sudo_group: "{{ devops_current_config.sudo_group }}"
devops_packages_to_install: "{{ devops_current_config.packages }}"
devops_services_to_enable: "{{ devops_current_config.services }}"
devops_sudoers_path: "{{ devops_current_config.sudoers_path }}"
devops_ssh_config_path: "{{ devops_current_config.ssh_config_path }}"
# Дополнительные группы для пользователя
devops_final_additional_groups: "{{ devops_current_config.additional_groups }}"
# Настройки для проверки системы
devops_system_checks:
- name: "check_user_exists"
command: "id {{ devops_user }}"
register: "devops_user_check"
- name: "check_ssh_key_exists"
stat:
path: "{{ devops_ssh_authorized_keys }}"
register: "devops_ssh_key_check"
- name: "check_sudoers_exists"
stat:
path: "{{ devops_sudoers_file }}"
register: "devops_sudoers_check"
# Настройки для логирования
devops_log_config:
level: "{{ devops_log_level }}"
file: "{{ devops_log_file }}"
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
max_size: "10MB"
backup_count: 5
# Настройки для уведомлений
devops_notification_config:
success_message: "Пользователь {{ devops_user }} успешно настроен"
failure_message: "Ошибка при настройке пользователя {{ devops_user }}"
ssh_message: "SSH ключ для пользователя {{ devops_user }} настроен"
sudo_message: "Sudo права для пользователя {{ devops_user }} настроены"

View File

@@ -127,7 +127,7 @@
dest: /tmp/get-docker.sh
mode: '0755'
when:
- docker_install_method == "get.docker.com" or docker_use_official_repo == false
- docker_install_method == "get.docker.com" or not docker_use_official_repo
- not docker_binary.stat.exists
- name: Установка Docker через скрипт get.docker.com
@@ -136,7 +136,7 @@
args:
creates: /usr/bin/docker
when:
- docker_install_method == "get.docker.com" or docker_use_official_repo == false
- docker_install_method == "get.docker.com" or not docker_use_official_repo
- not docker_binary.stat.exists
- name: Проверка установки Docker

View File

@@ -1,150 +0,0 @@
# Быстрый старт - Роль Ping
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## Что делает роль?
Роль выполняет ping проверки подключения к сети. Отправляет пакеты на указанный хост и выводит результаты.
## Основные задачи роли:
1. **Выполнение ping** - отправляет пакеты на указанный хост
2. **Вывод результата** - показывает результаты ping
3. **Статистика** - выводит статус выполнения
4. **Дополнительная информация** - выводит полный вывод команды
## Быстрый запуск
### Тестирование роли
```bash
# Lint проверка
make role lint ping
# Тестирование с minimal preset (1 хост)
make role test minimal
# Тестирование с default preset (2 хоста)
make role test default
# Тестирование конкретной роли
make role test ping
```
### Использование в roles/deploy.yml
Роль уже добавлена в `roles/deploy.yml` и запускается вместе с остальными ролями:
```bash
# Запуск всех ролей
make role test minimal
# Запуск только с тегом ping
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags ping
```
### Отдельное использование
```bash
# Прямой запуск playbook роли
ansible-playbook -i inventory/hosts.ini roles/ping/playbook.yml
```
## Переменные
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `ping_host` | `yandex.ru` | Целевой хост для ping |
| `ping_count` | `5` | Количество пакетов |
| `ping_interval` | `1` | Интервал между пакетами (сек) |
| `ping_timeout` | `10` | Таймаут (сек) |
| `ping_packet_size` | `64` | Размер пакета (байт) |
### Использование с кастомными параметрами
```yaml
- name: Тест ping
hosts: all
roles:
- role: ping
vars:
ping_host: google.com
ping_count: 10
ping_timeout: 5
```
## Теги
- `ping` - выполнение всех задач
- `test` - тестирование
- `debug` - отладочная информация
- `stats` - статистика
### Примеры использования тегов
```bash
# Только ping задачи
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags ping
# Ping + debug
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags "ping,debug"
# Только статистика
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags stats
```
## Пример вывода
```
=========================================
Результат ping yandex.ru
=========================================
PING yandex.ru (87.250.250.242) 64(92) bytes of data.
72 bytes from yandex.ru (87.250.250.242): icmp_seq=1 ttl=57 time=5.24 ms
72 bytes from yandex.ru (87.250.250.242): icmp_seq=2 ttl=57 time=5.12 ms
72 bytes from yandex.ru (87.250.250.242): icmp_seq=3 ttl=57 time=5.08 ms
72 bytes from yandex.ru (87.250.250.242): icmp_seq=4 ttl=57 time=5.18 ms
72 bytes from yandex.ru (87.250.250.242): icmp_seq=5 ttl=57 time=5.21 ms
--- yandex.ru ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 5.080/5.166/5.240/0.057 ms
=========================================
Статус: УСПЕШНО
=========================================
```
## Проверка результатов
```bash
# Проверка через логи Molecule
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
# Вход в контейнер для проверки
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
# Внутри контейнера
ping -c 5 yandex.ru
```
## Поддерживаемые ОС
- ✅ Ubuntu 20.04, 22.04, 24.04
- ✅ Debian 9, 10, 11, 12
- ✅ CentOS 7, 8, 9
- ✅ RHEL 8, 9
- ✅ AlmaLinux 8, 9
- ✅ Rocky Linux 8, 9
## Дополнительная информация
- 📖 Полная документация: `roles/ping/README.md`
- 🧪 Тесты: `roles/ping/tests/test.yml`
- 📝 Примеры: `roles/ping/examples.yml`
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,96 +0,0 @@
# Роль Ping
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Роль для выполнения ping проверок подключения к сети. Роль отправляет ping пакеты на указанный хост и выводит результаты выполнения.
## Требования
- Ansible >= 2.9
- Наличие утилиты `ping` на целевых хостах
- Привилегии на выполнение ping (обычно не требуются)
## Переменные
| Переменная | Тип | По умолчанию | Описание |
|------------|-----|--------------|----------|
| `ping_host` | string | `yandex.ru` | Целевой хост для ping |
| `ping_count` | integer | `5` | Количество пакетов для отправки |
| `ping_interval` | integer | `1` | Интервал между пакетами (в секундах) |
| `ping_timeout` | integer | `10` | Таймаут (в секундах) |
| `ping_packet_size` | integer | `64` | Размер пакета (в байтах) |
## Примеры использования
### Базовое использование
```yaml
- name: Выполнить ping проверку
hosts: all
roles:
- ping
```
### С кастомными параметрами
```yaml
- name: Выполнить ping проверку с кастомными параметрами
hosts: all
roles:
- role: ping
vars:
ping_host: google.com
ping_count: 10
```
### В playbook
```yaml
---
- name: Тестирование сетевого подключения
hosts: servers
become: false
roles:
- role: ping
vars:
ping_host: 8.8.8.8
ping_count: 3
tags:
- network
- test
```
## Tags
Роль поддерживает следующие теги:
- `ping` - выполнение всех задач роли
- `test` - тестирование подключения
- `debug` - вывод отладочной информации
- `stats` - вывод статистики
Пример использования тегов:
```bash
ansible-playbook site.yml --tags "ping,debug"
```
## Поддерживаемые ОС
- 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

View File

@@ -1,19 +0,0 @@
---
# Переменные по умолчанию для роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Целевой хост для ping
ping_host: yandex.ru
# Количество пакетов для отправки
ping_count: 5
# Интервал между пакетами (в секундах)
ping_interval: 1
# Таймаут (в секундах)
ping_timeout: 10
# Размер пакета (в байтах)
ping_packet_size: 64

View File

@@ -1,7 +0,0 @@
---
# Handlers для роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# В данный момент handlers не требуются для роли ping (пустой файл для совместимости)
[]

View File

@@ -1,37 +0,0 @@
---
# Метаданные роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
galaxy_info:
role_name: ping
namespace: antropov
author: Сергей Антропов
description: Роль для выполнения ping проверок подключения к сети
company: DevOps.org.ru
license: MIT
min_ansible_version: "2.9"
platforms:
- name: EL
versions:
- "7"
- "8"
- "9"
- "all"
- name: Ubuntu
versions:
- jammy
- focal
- noble
- name: Debian
versions:
- bullseye
- bookworm
- trixie
galaxy_tags:
- networking
- ping
- connectivity
- testing
dependencies: []

View File

@@ -1,16 +0,0 @@
---
# Пример playbook для роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Тестирование ping подключения
hosts: all
become: false
roles:
- role: ping
vars:
ping_host: yandex.ru
ping_count: 5
tags:
- ping
- test

View File

@@ -1,44 +0,0 @@
---
# Основные задачи для роли ping
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Выполнение ping с пакетами
command: ping -c {{ ping_count }} {{ ping_host }}
register: ping_result
changed_when: false
failed_when: false
tags:
- ping
- test
- name: Вывод результата ping
debug:
msg: "{{ ping_result.stdout_lines }}"
tags:
- ping
- test
- debug
- name: Статистика ping
debug:
msg: |
=========================================
Результат ping {{ ping_host }}
=========================================
Статус: {{ 'УСПЕШНО' if ping_result.rc == 0 else 'ОШИБКА' }}
Код возврата: {{ ping_result.rc }}
=========================================
tags:
- ping
- test
- stats
- name: Дополнительная информация о ping
debug:
var: ping_result.stdout
when: ping_result.stdout is defined
tags:
- ping
- test
- debug

246
roles/python/README.md Normal file
View File

@@ -0,0 +1,246 @@
# Роль Python 3.12
Универсальная Ansible роль для установки Python 3.12 на различных дистрибутивах Linux.
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Эта роль обеспечивает универсальную установку Python 3.12 на различных дистрибутивах Linux, включая:
- **Ubuntu** (20.04, 22.04, 24.04)
- **Debian** (10, 11, 12)
- **CentOS** (7, 8, 9)
- **RHEL** (7, 8, 9)
- **Rocky Linux** (8, 9)
- **AlmaLinux** (8, 9)
- **Fedora** (35+)
- **openSUSE** (15.3+)
Роль автоматически определяет дистрибутив и использует соответствующий метод установки:
- Установка из пакетов (если доступно)
- Компиляция из исходного кода (если пакеты недоступны)
- Автоматическое обновление pip до последней версии
- Создание символических ссылок для удобства использования
- Поддержка виртуальных окружений
## Требования
- Ansible >= 2.9
- Python 2.7 или 3.5+ на управляющей машине
- Привилегии sudo на целевых хостах
## Переменные
### Основные переменные
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `python_version` | `"3.12"` | Версия Python для установки |
| `python_packages` | `["pip", "setuptools", "wheel", "virtualenv"]` | Дополнительные пакеты Python |
| `python_install_prefix` | `"/usr/local"` | Префикс для установки Python |
| `python_create_symlinks` | `true` | Создание символических ссылок |
| `python_update_pip` | `true` | Автоматическое обновление pip до последней версии |
| `python_pip_packages` | `[]` | Дополнительные pip пакеты |
| `python_create_venv` | `false` | Создание виртуального окружения |
| `python_venv_path` | `"/opt/python-venv"` | Путь для виртуального окружения |
| `python_setup_alternatives` | `true` | Настройка альтернатив (RHEL) |
| `python_remove_old_versions` | `false` | Удаление старых версий Python |
| `python_log_level` | `"INFO"` | Уровень логирования |
### Переменные для разных ОС
Роль автоматически определяет переменные на основе `ansible_os_family` и `ansible_distribution`:
- `python_current_packages` - пакеты Python для текущей ОС
- `python_current_build_deps` - системные зависимости для компиляции
- `python_current_package_manager` - менеджер пакетов
- `python_current_executable` - путь к исполняемому файлу Python
- `python_current_pip` - путь к pip
## Примеры использования
### Базовое использование
```yaml
- hosts: all
roles:
- python
```
### С дополнительными пакетами
```yaml
- hosts: all
vars:
python_pip_packages:
- requests
- flask
- django
python_create_venv: true
python_venv_path: "/opt/myapp-venv"
roles:
- python
```
### С компиляцией из исходного кода
```yaml
- hosts: all
vars:
python_install_prefix: "/opt/python3.11"
python_create_symlinks: true
roles:
- python
```
### Для конкретной версии Python
```yaml
- hosts: all
vars:
python_version: "3.12.0"
roles:
- python
```
## Поддерживаемые дистрибутивы
### Debian/Ubuntu
Роль использует репозиторий `deadsnakes` для установки Python 3.12:
```yaml
- hosts: ubuntu_servers
roles:
- python
```
### RHEL/CentOS/Rocky/AlmaLinux
Роль использует EPEL репозиторий для установки Python 3.12:
```yaml
- hosts: rhel_servers
roles:
- python
```
### Fedora
```yaml
- hosts: fedora_servers
roles:
- python
```
### openSUSE
```yaml
- hosts: suse_servers
roles:
- python
```
## Альтернативные репозитории
Для старых дистрибутивов, которые не поддерживают Python 3.12 из стандартных репозиториев, роль автоматически использует альтернативные источники:
### RHEL/CentOS 7
- **IUS Repository**: Предоставляет современные версии Python
- **SCL (Software Collections)**: Для очень старых систем
- **EPEL**: Дополнительные пакеты
### Debian/Ubuntu старых версий
- **deadsnakes PPA**: Предоставляет Python 3.12 для старых версий
- **Альтернативные пакеты**: Python 3.11 если 3.12 недоступен
### Автоматическое переключение
Роль автоматически пытается установить Python 3.12, а если это невозможно, переключается на доступную версию (3.11) или использует альтернативные репозитории.
## Структура роли
```
roles/python/
├── defaults/
│ └── main.yml # Переменные по умолчанию
├── handlers/
│ └── main.yml # Обработчики событий
├── meta/
│ └── main.yml # Метаданные роли
├── tasks/
│ └── main.yml # Основные задачи
├── vars/
│ └── main.yml # Переменные для разных ОС
└── README.md # Документация
```
## Логирование
Роль поддерживает подробное логирование. Установите `python_log_level: "DEBUG"` для получения детальной информации о процессе установки.
## Обработка ошибок
Роль включает проверки на каждом этапе:
1. Проверка наличия Python перед установкой
2. Проверка успешности установки
3. Проверка работоспособности pip
4. Очистка временных файлов
## Производительность
- Использует параллельную компиляцию (количество ядер CPU)
- Оптимизированная конфигурация Python с LTO
- Кэширование пакетов
- Очистка временных файлов
## Безопасность
- Проверка целостности загружаемых файлов
- Использование официальных репозиториев
- Минимальные привилегии для установки
## Устранение неполадок
### Python не найден после установки
```bash
# Проверьте символические ссылки
ls -la /usr/bin/python3*
# Обновите библиотеки
sudo ldconfig
```
### Ошибки компиляции
```bash
# Установите системные зависимости
sudo apt install build-essential # Ubuntu/Debian
sudo dnf groupinstall "Development Tools" # RHEL/CentOS
```
### Проблемы с pip
```bash
# Обновите pip
python3 -m pip install --upgrade pip
# Проверьте версию
pip3 --version
```
## Лицензия
MIT
## Автор
**Сергей Антропов**
Сайт: https://devops.org.ru
## Поддержка
Для получения поддержки или сообщения об ошибках, пожалуйста, создайте issue в репозитории проекта.

View File

@@ -0,0 +1,60 @@
---
# Переменные по умолчанию для роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Версия Python для установки
python_version: "3.12"
# Установка дополнительных пакетов Python
python_packages:
- pip
- setuptools
- wheel
- virtualenv
# Установка системных зависимостей для компиляции Python
python_build_dependencies:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- tk-devel
- gdbm-devel
- db4-devel
- libpcap-devel
- xz-devel
- expat-devel
- bzip2-devel
- ncurses-devel
- libuuid-devel
- libnsl2-devel
# Путь для установки Python
python_install_prefix: "/usr/local"
# Создание символических ссылок
python_create_symlinks: true
# Обновление pip после установки
python_update_pip: true
# Установка дополнительных pip пакетов
python_pip_packages: []
# Создание виртуального окружения
python_create_venv: false
python_venv_path: "/opt/python-venv"
# Настройка альтернатив (для систем с alternatives)
python_setup_alternatives: true
# Удаление старых версий Python (осторожно!)
python_remove_old_versions: false
# Логирование
python_log_level: "INFO"

View File

@@ -0,0 +1,66 @@
---
# Пример использования роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Установка Python 3.12 на все хосты"
hosts: all
become: yes
gather_facts: yes
vars:
# Основные настройки
python_version: "3.12"
python_log_level: "INFO"
# Дополнительные пакеты
python_pip_packages:
- requests
- flask
- django
- pytest
# Создание виртуального окружения
python_create_venv: true
python_venv_path: "/opt/python-venv"
# Настройки символических ссылок
python_create_symlinks: true
python_setup_alternatives: true
# Обновление pip до последней версии
python_update_pip: true
roles:
- python
post_tasks:
- name: "Проверка установки Python"
command: "python3 --version"
register: python_version_result
changed_when: false
- name: "Проверка установки pip"
command: "pip3 --version"
register: pip_version_result
changed_when: false
- name: "Проверка виртуального окружения"
stat:
path: "{{ python_venv_path }}"
register: venv_check
- name: "📋 КРАТКИЙ ОТЧЕТ О УСТАНОВКЕ"
debug:
msg: |
🎉 УСТАНОВКА ЗАВЕРШЕНА УСПЕШНО!
📊 Результаты:
• Python: {{ python_version_result.stdout }}
• Pip: {{ pip_version_result.stdout }}
• Виртуальное окружение: {{ 'создано' if venv_check.stat.exists else 'не создано' }}
• Путь к Python: {{ python_current_executable | default('не определен') }}
• Путь к pip: {{ python_current_pip | default('не определен') }}
🚀 Python {{ python_version }} готов к использованию!

View File

@@ -0,0 +1,44 @@
---
# Обработчики для роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Перезапуск systemd для обновления библиотек"
systemd:
daemon_reload: yes
when: ansible_service_mgr == "systemd"
- name: "Обновление кэша библиотек"
command: "ldconfig"
changed_when: false
when: ansible_os_family == "RedHat"
- name: "Обновление кэша пакетов"
apt:
update_cache: yes
when: ansible_os_family == "Debian"
- name: "Очистка кэша пакетов"
command: "{{ item }}"
loop:
- "dnf clean all"
- "yum clean all"
changed_when: false
when: ansible_os_family == "RedHat"
ignore_errors: true
- name: "Уведомление о завершении установки Python"
debug:
msg: |
✅ PYTHON {{ python_version | upper }} УСТАНОВЛЕН И НАСТРОЕН!
🎯 Основные команды:
• python --version # Проверить версию Python
• python3 --version # Проверить версию Python (с версией)
• pip --version # Проверить версию pip
• pip3 --version # Проверить версию pip (с версией)
• python -m venv env # Создать виртуальное окружение
• pip install pkg # Установить пакет
🚀 Готово к работе!

View File

@@ -0,0 +1,54 @@
---
# Метаданные роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
galaxy_info:
author: "Сергей Антропов"
description: "Универсальная роль для установки Python 3.12 на различных дистрибутивах Linux"
company: "DevOps Lab"
license: "MIT"
min_ansible_version: "2.9"
platforms:
- name: "Ubuntu"
versions:
- "focal"
- "jammy"
- "noble"
- name: "Debian"
versions:
- "buster"
- "bullseye"
- "bookworm"
- name: "EL"
versions:
- "7"
- "8"
- "9"
- name: "Rocky"
versions:
- "8.8"
- "9.0"
- name: "Fedora"
versions:
- "35"
- "36"
- "37"
- "38"
- "39"
- "40"
- name: "opensuse"
versions:
- "15.3"
- "15.4"
- "15.5"
galaxy_tags:
- "python"
- "programming"
- "development"
- "runtime"
- "language"
- "universal"
- "crossplatform"
dependencies: []

544
roles/python/tasks/main.yml Normal file
View File

@@ -0,0 +1,544 @@
---
# Основные задачи для установки Python 3.12
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Отладочная информация о системе"
debug:
msg:
- "ansible_distribution: '{{ ansible_distribution }}'"
- "ansible_os_family: '{{ ansible_os_family }}'"
- "ansible_distribution_version: '{{ ansible_distribution_version }}'"
when: (python_log_level | default("INFO")) in ["DEBUG", "INFO"]
- name: "Определение переменных для текущей ОС"
set_fact:
python_distribution: "{{ ansible_distribution | lower }}"
python_os_family: "{{ ansible_os_family | lower }}"
python_current_package_manager: "{{ python_package_managers[ansible_distribution | lower] | default('unknown') }}"
python_current_packages: "{{ python_packages_by_os[ansible_distribution | lower] | default([]) }}"
python_current_build_deps: "{{ python_build_deps_by_os[ansible_distribution | lower] | default([]) }}"
python_current_executable: "{{ python_executable_paths[ansible_distribution | lower] | default('/usr/bin/python3.12') }}"
python_current_pip: "{{ python_pip_paths[ansible_distribution | lower] | default('/usr/bin/pip3.12') }}"
- name: "Проверка определенных переменных"
debug:
msg:
- "python_distribution: '{{ python_distribution }}'"
- "python_os_family: '{{ python_os_family }}'"
- "python_current_package_manager: '{{ python_current_package_manager }}'"
- "python_current_packages: {{ python_current_packages }}"
- "python_current_build_deps: {{ python_current_build_deps }}"
- "python_current_executable: '{{ python_current_executable }}'"
- "python_current_pip: '{{ python_current_pip }}'"
when: (python_log_level | default("INFO")) in ["DEBUG", "INFO"]
# =============================================================================
# ЭТАП 1: ДОБАВЛЕНИЕ РЕПОЗИТОРИЕВ
# =============================================================================
- name: "Добавление репозиториев для Ubuntu/Debian"
apt_repository:
repo: "{{ item.url }}"
state: "{{ item.state }}"
update_cache: yes
loop: "{{ python_repositories[python_distribution] | default([]) }}"
when:
- python_distribution in ['ubuntu', 'debian']
- python_repositories[python_distribution] is defined
ignore_errors: true
- name: "Добавление репозиториев для RHEL-семейства"
package:
name: "{{ item.name }}"
state: "{{ item.state }}"
loop: "{{ python_repositories[python_distribution] | default([]) }}"
when:
- python_distribution in ['redhat', 'centos', 'rhel', 'rocky', 'alma', 'fedora']
- python_repositories[python_distribution] is defined
- item.name != 'scl'
ignore_errors: true
- name: "Добавление SCL репозиториев для старых RHEL/CentOS"
yum_repository:
name: "{{ item.name }}"
description: "{{ item.name }} repository"
baseurl: "{{ item.url }}"
gpgcheck: no
enabled: yes
loop: "{{ python_repositories[python_distribution] | default([]) }}"
when:
- python_distribution in ['redhat', 'centos', 'rhel']
- python_repositories[python_distribution] is defined
- item.name == 'scl'
ignore_errors: true
# =============================================================================
# ЭТАП 2: ОБНОВЛЕНИЕ ПАКЕТОВ
# =============================================================================
- name: "Обновление списка пакетов"
package:
name: "*"
state: present
when:
- python_current_package_manager in ['apt', 'dnf', 'zypper']
- python_current_package_manager != 'unknown'
- name: "Обновление списка пакетов после добавления репозиториев"
package:
name: "*"
state: present
when:
- python_repositories[python_distribution] is defined
- python_current_package_manager in ['apt', 'dnf']
# =============================================================================
# ЭТАП 3: УСТАНОВКА СИСТЕМНЫХ ЗАВИСИМОСТЕЙ
# =============================================================================
- name: "Установка системных зависимостей для компиляции"
package:
name: "{{ python_current_build_deps }}"
state: present
when:
- python_current_build_deps | length > 0
- python_current_package_manager != 'unknown'
ignore_errors: true
# =============================================================================
# ЭТАП 4: ПРОВЕРКА И УСТАНОВКА PYTHON СТАНДАРТНЫМ СПОСОБОМ
# =============================================================================
- name: "Проверка наличия Python {{ python_version }}"
command: "{{ python_current_executable }} --version"
register: python_version_check
failed_when: false
changed_when: false
when: python_current_executable is defined and python_current_executable != ""
- name: "Установка Python из пакетов (основной способ)"
package:
name: "{{ python_current_packages }}"
state: present
when:
- python_current_packages | length > 0
- python_current_package_manager != 'unknown'
- python_version_check.rc != 0
register: python_package_install
ignore_errors: true
# =============================================================================
# ЭТАП 5: FALLBACK НА АЛЬТЕРНАТИВНЫЕ СПОСОБЫ
# =============================================================================
- name: "Попытка установки альтернативных пакетов Python"
package:
name: "{{ python_current_packages | select('match', '.*python3\\.1[12].*') | list }}"
state: present
when:
- python_package_install is defined
- python_package_install.failed | default(false)
- python_current_package_manager != 'unknown'
- python_version_check.rc != 0
register: python_alt_install
ignore_errors: true
- name: "Попытка установки SCL пакетов Python"
package:
name: "{{ python_current_packages | select('match', '.*rh-python.*') | list }}"
state: present
when:
- python_alt_install is defined
- python_alt_install.failed | default(false)
- python_current_package_manager != 'unknown'
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
register: python_scl_install
ignore_errors: true
# =============================================================================
# ЭТАП 6: КОМПИЛЯЦИЯ ИЗ ИСХОДНИКОВ (ПОСЛЕДНИЙ СПОСОБ)
# =============================================================================
- name: "Скачивание исходного кода Python {{ python_version }}"
get_url:
url: "https://www.python.org/ftp/python/{{ python_version }}/Python-{{ python_version }}.tar.xz"
dest: "/tmp/Python-{{ python_version }}.tar.xz"
mode: '0644'
register: download_result
failed_when: false
changed_when: false
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- python_package_install is defined
- python_package_install.failed | default(false)
- python_alt_install is defined
- python_alt_install.failed | default(false)
ignore_errors: true
- name: "Распаковка исходного кода Python"
unarchive:
src: "/tmp/Python-{{ python_version }}.tar.xz"
dest: "/tmp/"
remote_src: yes
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
- name: "Конфигурация Python для компиляции"
command: >
./configure
--prefix={{ python_install_prefix | default('/usr/local') }}
--enable-optimizations
--enable-shared
--with-lto
--enable-ipv6
--with-system-ffi
--with-computed-gotos
--enable-loadable-sqlite-extensions
args:
chdir: "/tmp/Python-{{ python_version }}"
changed_when: false
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
- name: "Компиляция Python"
make:
chdir: "/tmp/Python-{{ python_version }}"
jobs: "{{ ansible_processor_cores | default(1) }}"
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
- name: "Установка скомпилированного Python"
make:
chdir: "/tmp/Python-{{ python_version }}"
target: install
become: true
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
- name: "Обновление библиотек для скомпилированного Python"
command: "ldconfig"
become: true
changed_when: false
when:
- python_current_packages | length == 0
- python_version_check.rc != 0
- download_result is defined
- download_result.status_code == 200
# =============================================================================
# ЭТАП 7: СОЗДАНИЕ СИМВОЛИЧЕСКИХ ССЫЛОК
# =============================================================================
- name: "Создание символических ссылок для Python"
file:
src: "{{ python_current_executable }}"
dest: "/usr/bin/python3"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- name: "Создание символических ссылок для SCL Python"
file:
src: "/opt/rh/rh-python312/root/usr/bin/python3"
dest: "/usr/bin/python3"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
- python_scl_install is defined
- python_scl_install.changed | default(false)
- name: "Создание символических ссылок для pip"
file:
src: "{{ python_current_pip }}"
dest: "/usr/bin/pip3"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_current_pip is defined
- python_current_pip != ""
- name: "Создание символических ссылок для SCL pip"
file:
src: "/opt/rh/rh-python312/root/usr/bin/pip3"
dest: "/usr/bin/pip3"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
- python_scl_install is defined
- python_scl_install.changed | default(false)
- name: "Создание символических ссылок для Python (без версии)"
file:
src: "{{ python_current_executable }}"
dest: "/usr/bin/python"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- name: "Создание символических ссылок для SCL Python (без версии)"
file:
src: "/opt/rh/rh-python312/root/usr/bin/python"
dest: "/usr/bin/python"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
- python_scl_install is defined
- python_scl_install.changed | default(false)
- name: "Создание символических ссылок для pip (без версии)"
file:
src: "{{ python_current_pip }}"
dest: "/usr/bin/pip"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_current_pip is defined
- python_current_pip != ""
- name: "Создание символических ссылок для SCL pip (без версии)"
file:
src: "/opt/rh/rh-python312/root/usr/bin/pip"
dest: "/usr/bin/pip"
state: link
force: yes
when:
- (python_create_symlinks | default(true)) | bool
- python_version_check.rc != 0
- python_distribution in ['redhat', 'centos', 'rhel']
- python_scl_install is defined
- python_scl_install.changed | default(false)
# =============================================================================
# ЭТАП 8: НАСТРОЙКА АЛЬТЕРНАТИВ И PIP
# =============================================================================
- name: "Настройка альтернатив для Python"
alternatives:
name: python3
path: "{{ python_current_executable }}"
when:
- python_current_executable is defined
- python_current_executable != ""
- ansible_os_family == "RedHat"
- name: "Установка pip через get-pip.py если не найден"
get_url:
url: "https://bootstrap.pypa.io/get-pip.py"
dest: "/tmp/get-pip.py"
mode: '0755'
when:
- python_version_check.rc == 0
- python_current_pip is not defined or python_current_pip == ""
- name: "Запуск get-pip.py для установки pip"
command: "{{ python_current_executable }} /tmp/get-pip.py"
changed_when: false
when:
- python_version_check.rc == 0
- python_current_pip is not defined or python_current_pip == ""
# =============================================================================
# ЭТАП 9: ОБНОВЛЕНИЕ PIP
# =============================================================================
- name: "Получение последней версии pip"
uri:
url: "https://pypi.org/pypi/pip/json"
method: GET
register: pip_version_info
when: python_version_check.rc == 0
ignore_errors: true
- name: "Извлечение версии pip"
set_fact:
pip_latest_version: "{{ pip_version_info.json.info.version }}"
when:
- pip_version_info is defined
- pip_version_info.status == 200
- name: "Проверка текущей версии pip"
command: "{{ python_current_pip }} --version"
register: pip_current_version
changed_when: false
when:
- python_version_check.rc == 0
- python_current_pip is defined
- python_current_pip != ""
ignore_errors: true
- name: "Обновление pip до последней версии"
command: "{{ python_current_pip }} install --upgrade pip"
changed_when: false
when:
- python_version_check.rc == 0
- pip_current_version.rc == 0
- pip_latest_version is defined
- pip_current_version.stdout is defined
- pip_latest_version not in pip_current_version.stdout
ignore_errors: true
# =============================================================================
# ЭТАП 10: СОЗДАНИЕ ВИРТУАЛЬНОГО ОКРУЖЕНИЯ
# =============================================================================
- name: "Создание виртуального окружения"
command: "{{ python_current_executable }} -m venv {{ python_venv_path | default('/opt/python-venv') }}"
changed_when: false
when:
- (python_create_venv | default(false)) | bool
- python_version_check.rc == 0
ignore_errors: true
# =============================================================================
# ЭТАП 11: ФИНАЛЬНЫЙ ОТЧЕТ
# =============================================================================
- name: "Сбор информации о системе"
setup:
gather_subset:
- "!all"
- "distribution"
- "os_family"
- "architecture"
- "kernel"
- "python"
register: system_facts
- name: "Проверка установленного Python"
command: "{{ python_current_executable }} --version"
register: final_python_version
changed_when: false
when: python_version_check.rc == 0
ignore_errors: true
- name: "Проверка установленного pip"
command: "{{ python_current_pip }} --version"
register: final_pip_version
changed_when: false
when:
- python_version_check.rc == 0
- python_current_pip is defined
- python_current_pip != ""
ignore_errors: true
- name: "Проверка символических ссылок"
stat:
path: "{{ item }}"
register: symlink_check
loop:
- "/usr/bin/python"
- "/usr/bin/python3"
- "/usr/bin/pip"
- "/usr/bin/pip3"
- name: "Проверка виртуального окружения"
stat:
path: "{{ python_venv_path | default('/opt/python-venv') }}"
register: venv_check
when: python_create_venv | bool
- name: "Сбор информации об установленных пакетах Python"
package_facts:
manager: "{{ python_current_package_manager }}"
when: python_current_package_manager != 'unknown'
- name: "Финальный отчет об установке"
debug:
msg: |
================================================================================
🐍 ОТЧЕТ ОБ УСТАНОВКЕ PYTHON {{ python_version | upper }}
================================================================================
📊 ИНФОРМАЦИЯ О СИСТЕМЕ:
• Дистрибутив: {{ system_facts.ansible_facts.distribution }} {{ system_facts.ansible_facts.distribution_version }}
• Семейство ОС: {{ system_facts.ansible_facts.os_family }}
• Архитектура: {{ system_facts.ansible_facts.architecture }}
• Ядро: {{ system_facts.ansible_facts.kernel }}
🐍 PYTHON:
• Версия: {{ final_python_version.stdout | default('НЕ УСТАНОВЛЕН') }}
• Исполняемый файл: {{ python_current_executable }}
• Путь к pip: {{ python_current_pip | default('НЕ НАЙДЕН') }}
📦 PIP:
• Версия: {{ final_pip_version.stdout | default('НЕ УСТАНОВЛЕН') }}
🔗 СИМВОЛИЧЕСКИЕ ССЫЛКИ:
• /usr/bin/python: {{ '✅ СОЗДАНА' if symlink_check.results[0].stat.exists else '❌ НЕ СОЗДАНА' }}
• /usr/bin/python3: {{ '✅ СОЗДАНА' if symlink_check.results[1].stat.exists else '❌ НЕ СОЗДАНА' }}
• /usr/bin/pip: {{ '✅ СОЗДАНА' if symlink_check.results[2].stat.exists else '❌ НЕ СОЗДАНА' }}
• /usr/bin/pip3: {{ '✅ СОЗДАНА' if symlink_check.results[3].stat.exists else '❌ НЕ СОЗДАНА' }}
🌐 ВИРТУАЛЬНОЕ ОКРУЖЕНИЕ:
• Путь: {{ python_venv_path | default('/opt/python-venv') }}
• Статус: {{ '✅ СОЗДАНО' if (venv_check is defined and venv_check.stat.exists) else '❌ НЕ СОЗДАНО' }}
📋 УСТАНОВЛЕННЫЕ ПАКЕТЫ PYTHON:
{% if ansible_facts.packages is defined %}
{% for package in ansible_facts.packages %}
{% if 'python' in package %}
• {{ package }}: {{ ansible_facts.packages[package] | map(attribute='version') | list | join(', ') }}
{% endif %}
{% endfor %}
{% else %}
• Информация недоступна
{% endif %}
🎯 КОМАНДЫ ДЛЯ ПРОВЕРКИ:
• python --version
• python3 --version
• pip --version
• pip3 --version
• python -m venv test_env
================================================================================
when: python_log_level in ["INFO", "DEBUG"]
- name: "Уведомление о завершении установки Python"
debug:
msg: |
✅ PYTHON {{ python_version | upper }} УСТАНОВЛЕН И НАСТРОЕН!
🎯 Основные команды:
• python --version # Проверить версию Python
• python3 --version # Проверить версию Python (с версией)
• pip --version # Проверить версию pip
• pip3 --version # Проверить версию pip (с версией)
• python -m venv env # Создать виртуальное окружение
• pip install pkg # Установить пакет
🚀 Готово к работе!

474
roles/python/vars/main.yml Normal file
View File

@@ -0,0 +1,474 @@
---
# Переменные для роли python
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Определение семейства ОС и версии
python_os_family: "{{ ansible_os_family | lower }}"
python_distribution: "{{ ansible_distribution | lower }}"
python_distribution_version: "{{ ansible_distribution_version }}"
# Переменные для разных дистрибутивов
python_package_managers:
debian: "apt"
ubuntu: "apt"
redhat: "dnf"
centos: "dnf"
rhel: "dnf"
rocky: "dnf"
alma: "dnf"
fedora: "dnf"
suse: "zypper"
opensuse: "zypper"
alt: "apt-rpm"
"alt linux": "apt-rpm"
astra: "apt"
"astra linux": "apt"
# Пакеты для установки Python 3.12 в разных дистрибутивах
python_packages_by_os:
debian:
- python3.12
- python3.12-dev
- python3.12-venv
- python3.12-distutils
- python3.12-lib2to3
- python3.12-gdbm
- python3.12-tk
# Альтернативные пакеты для старых Debian
- python3.11
- python3.11-dev
- python3.11-venv
ubuntu:
- python3.12
- python3.12-dev
- python3.12-venv
- python3.12-distutils
- python3.12-lib2to3
- python3.12-gdbm
- python3.12-tk
# Альтернативные пакеты для старых Ubuntu
- python3.11
- python3.11-dev
- python3.11-venv
# Пакеты без версии для совместимости
- python3-distutils
- python3-lib2to3
redhat:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
centos:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
# Альтернативные пакеты для старых CentOS
- python312
- python312-pip
- python312-devel
# SCL пакеты для очень старых CentOS
- rh-python312
- rh-python312-python-pip
- rh-python312-python-devel
rhel:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
# Альтернативные пакеты для старых RHEL
- python312
- python312-pip
- python312-devel
# SCL пакеты для очень старых RHEL
- rh-python312
- rh-python312-python-pip
- rh-python312-python-devel
rocky:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
alma:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
fedora:
- python3.12
- python3.12-pip
- python3.12-devel
- python3.12-tkinter
suse:
- python312
- python312-devel
- python312-pip
opensuse:
- python312
- python312-devel
- python312-pip
alt:
- python3.12
- python3.12-devel
- python3.12-pip
astra:
- python3.12
- python3.12-dev
- python3.12-venv
- python3.12-distutils
- python3.12-lib2to3
- python3.12-gdbm
- python3.12-tk
"alt linux":
- python3.12
- python3.12-devel
- python3.12-pip
"astra linux":
- python3.12
- python3.12-dev
- python3.12-venv
- python3.12-distutils
- python3.12-lib2to3
- python3.12-gdbm
- python3.12-tk
# Репозитории для разных дистрибутивов
python_repositories:
debian:
- name: "deadsnakes"
url: "ppa:deadsnakes/ppa"
state: "present"
- name: "deadsnakes-debian"
url: "deb http://ppa.launchpad.net/deadsnakes/ppa/ubuntu focal main"
state: "present"
ubuntu:
- name: "deadsnakes"
url: "ppa:deadsnakes/ppa"
state: "present"
redhat:
- name: "epel"
state: "present"
- name: "ius"
url: "https://repo.ius.io/redhat/7/x86_64/"
state: "present"
centos:
- name: "epel"
state: "present"
- name: "ius"
url: "https://repo.ius.io/centos/7/x86_64/"
state: "present"
- name: "scl"
url: "https://www.softwarecollections.org/en/scls/rhscl/rh-python312/"
state: "present"
rhel:
- name: "epel"
state: "present"
- name: "ius"
url: "https://repo.ius.io/redhat/7/x86_64/"
state: "present"
- name: "scl"
url: "https://www.softwarecollections.org/en/scls/rhscl/rh-python312/"
state: "present"
rocky:
- name: "epel"
state: "present"
alma:
- name: "epel"
state: "present"
fedora:
- name: "epel"
state: "present"
# Команды для обновления пакетов
python_update_commands:
debian: "apt update"
ubuntu: "apt update"
redhat: "dnf update -y"
centos: "dnf update -y"
rhel: "dnf update -y"
rocky: "dnf update -y"
alma: "dnf update -y"
fedora: "dnf update -y"
suse: "zypper refresh"
opensuse: "zypper refresh"
alt: "apt-get update"
"alt linux": "apt-get update"
astra: "apt update"
"astra linux": "apt update"
# Команды для установки пакетов
python_install_commands:
debian: "apt install -y"
ubuntu: "apt install -y"
redhat: "dnf install -y"
centos: "dnf install -y"
rhel: "dnf install -y"
rocky: "dnf install -y"
alma: "dnf install -y"
fedora: "dnf install -y"
suse: "zypper install -y"
opensuse: "zypper install -y"
alt: "apt-get install -y"
"alt linux": "apt-get install -y"
astra: "apt install -y"
"astra linux": "apt install -y"
# Пути к исполняемым файлам Python
python_executable_paths:
debian: "/usr/bin/python3.12"
ubuntu: "/usr/bin/python3.12"
redhat: "/usr/bin/python3.12"
centos: "/usr/bin/python3.12"
rhel: "/usr/bin/python3.12"
rocky: "/usr/bin/python3.12"
alma: "/usr/bin/python3.12"
fedora: "/usr/bin/python3.12"
suse: "/usr/bin/python3.12"
opensuse: "/usr/bin/python3.12"
alt: "/usr/bin/python3.12"
"alt linux": "/usr/bin/python3.12"
astra: "/usr/bin/python3.12"
"astra linux": "/usr/bin/python3.12"
# Пути к pip
python_pip_paths:
debian: "/usr/bin/pip3.12"
ubuntu: "/usr/bin/pip3.12"
redhat: "/usr/bin/pip3.12"
centos: "/usr/bin/pip3.12"
rhel: "/usr/bin/pip3.12"
rocky: "/usr/bin/pip3.12"
alma: "/usr/bin/pip3.12"
fedora: "/usr/bin/pip3.12"
suse: "/usr/bin/pip3.12"
opensuse: "/usr/bin/pip3.12"
alt: "/usr/bin/pip3.12"
"alt linux": "/usr/bin/pip3.12"
astra: "/usr/bin/pip3.12"
"astra linux": "/usr/bin/pip3.12"
# Системные зависимости для компиляции
python_build_deps_by_os:
debian:
- build-essential
- zlib1g-dev
- libssl-dev
- libffi-dev
- libsqlite3-dev
- libreadline-dev
- libbz2-dev
- libncurses5-dev
- libncursesw5-dev
- xz-utils
- tk-dev
- libgdbm-dev
- libdb-dev
- libpcap-dev
- liblzma-dev
ubuntu:
- build-essential
- zlib1g-dev
- libssl-dev
- libffi-dev
- libsqlite3-dev
- libreadline-dev
- libbz2-dev
- libncurses5-dev
- libncursesw5-dev
- xz-utils
- tk-dev
- libgdbm-dev
- libdb-dev
- libpcap-dev
- liblzma-dev
redhat:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- db4-devel
- libpcap-devel
- expat-devel
- libnsl2-devel
centos:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
# Альтернативные пакеты для CentOS
- gdbm
- db4
rhel:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
rocky:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
alma:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
fedora:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
suse:
- gcc
- gcc-c++
- make
- zlib-devel
- libopenssl-devel
- libffi-devel
- sqlite3-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- libpcap-devel
- expat-devel
- libnsl2-devel
opensuse:
- gcc
- gcc-c++
- make
- zlib-devel
- libopenssl-devel
- libffi-devel
- sqlite3-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
alt:
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
astra:
- build-essential
- zlib1g-dev
- libssl-dev
- libffi-dev
- libsqlite3-dev
- libreadline-dev
- libbz2-dev
- libncurses5-dev
- libncursesw5-dev
- xz-utils
- tk-dev
- libgdbm-dev
- libdb-dev
- libpcap-dev
- liblzma-dev
"alt linux":
- gcc
- gcc-c++
- make
- zlib-devel
- openssl-devel
- libffi-devel
- sqlite-devel
- readline-devel
- bzip2-devel
- ncurses-devel
- xz-devel
- tk-devel
- gdbm-devel
- expat-devel
"astra linux":
- build-essential
- zlib1g-dev
- libssl-dev
- libffi-dev
- libsqlite3-dev
- libreadline-dev
- libbz2-dev
- libncurses5-dev
- libncursesw5-dev
- xz-utils
- tk-dev
- libgdbm-dev
- libdb-dev
- libpcap-dev
- liblzma-devel

View File

@@ -1,80 +1,11 @@
$ANSIBLE_VAULT;1.1;AES256
35343565303431363831646439663864653034633332396533656362393138666235353365613631
6633313964346463653166333131316161643064626539300a366366383264653236643366343861
36643265643338346263663332663961613132613662303033386563356235666334613763303232
3332636435353130380a643031343335306330643964363230333363653761376333306232663263
37613937376662386563366237666630623935653663316235363037613962616663373534633066
36356639656662653339613534373630326164303536633466613238306530326661343065376632
63646330376662643836636539333837313366656237626264336130636139376665346162303834
39366235333833303839646530663963346234316661306663356261316537663333326363326333
34386536343137333736356139636461653737353062613730326665383761356337663264356539
64623962363631356131373735643639333065663861336262346366313163303739306663616635
63386534333936356636623532653339366464346531326562623062353839333563346562383832
38656166626366653930343436633338363530313138323862353563323033306333353130383732
63323931336338663663383532313635373166616631333832666330393933646165336164353634
30666137626131636162333335373961343763383434386166346363626162663538653239633563
64316539626632346133346339616164646336306331393466306333623638366137613866663263
37623663316462376330643866303464366236613965663561383561643162393032663266383661
63643466396433366530613830636666393862383134313165313162663262623536306164313633
65383031646562356535626363326135656366323462383364306138626163363236333036316534
36353364626130633965353036636430393035316434393063373062363362663430633462313631
65373330646531333334623738653537623963663237663137306430656438316665623534313362
36303934306331393365363866393265646263653830666234333234623266353634393239633337
32663938613831656138376266333835613561643534663463373238323532313237336132613239
31383665373964623362623561313161363831316361626432636665343938633437336561363161
30366136383766356261396533356134326532353938326439303334396333363036363563653030
33353538316363353637313835636535653136346234316636626533663331653163643466633164
35633630316162396665626632363036373331343230306665313037336666663066653763653835
34643532386138363665663238393336356431353464613031336334623761613732646565363730
34353866616339616164663934626632663130393563646265343461303533653139653137303661
30663539616162333739313366363861336562346132373861393734323366663863333063396232
34373435306161383462306136333734303339353231386432313637343236356439626537663530
33633331376439643732306365366530636134366431396566376330663162336334353031353834
32636435656131616133643636363965316634626231356630323237613261663665393061616432
35333031306562626234363061316562373964386236636464633939343437396234313036383561
31646463313037323133616561633562323765303361346430313134316337626139663665326436
31616334356663346234663833396635373162346136663062363138373034356638636537353737
62336563333338343731626665323336386632303162383166346338373864613463326466386361
37356135376430363038656439376366646238383736636461613034666163623838393236346464
34356563366234306465366438326265366133663934323663313934313037313663633833343533
38326163323438376336313065313338303239303766326636326433366566643935626530643537
61313738313361353835373430386430343738356461633335396165323337623832663330383834
61666363663939353238623861653962636638303138626435373366336130653565333532616664
61643734393733646364623937356264306262366266396536656338343366306364663339656236
63316635623037616266613739326335353066373463643132393331626232303134346233303833
61303738383961636235616634356435313165613734336438333730353463313366653332626263
61353731323133393735333664366134633434346130646164336665386264376265316266386665
65613431303733376637643536646561636163633065393966333161313930356636353936663239
36326561653132373335616237303764333661303961373139646663653431346338356331373765
37333865333563333338666338633665316238396438333630306663383164383234636237393562
32356130653538383632633462303665333733333365343237626262636563346361363764313663
34306337636665633431353438373661306336396533613936313866623337343538613036353233
66623936343762383033323830333266643463376138643133643434353135656261393733313433
38303264303332643361376162303330343666636162396163366365353465623132663831323530
33346565353262376131623431343538616533326564383637396538343336626336646633353934
61376462656263663965383137376131643536336539613532373536376231626364643866646535
38646430326138643339396464366438393263313665636562356631326133313734343562363065
61663766616633333262623633396363336536373666316536363931333939383838663131613439
66616663383334363330646638393139313330363533306639623437663763623333343038373838
63303932663436636361663338346665386531333533633730323735333734376662383835343163
38623435333662333634376361303734653130663833376264376336663363623966363939623336
66656532663431333132663734386538663066323230356166356238333564336230633030353233
61333933333763666564313233333432366231383666333832393035656234326161323332653135
34323032613535336666633830373866383832393166636565646132633763616230326530346462
63653638383263323532653261353365313433346534323865616336383864363530643237613061
32613737353431626366643066663864663866323363396230333335346362373262393332333939
34393539363836656539623766346336383834323831346261343635346466383164376135353136
33366333323765616330333735383163663736646466653265326335306366663832643162363035
39326661313732303830333236653134346534656433366366663539626364663362626135666438
32356635386262336635396162666334616139353134323366633165626363336338393165663933
62643431616632653838376239326531643733303636323236613561626534343535383130623766
66343734396561386661306235393865336236323261356461356264326535316437653131326435
38663866383332393033356165663032656433383763656431323836353961633437623662303135
61373836626564373331303362313062313235373731646234393532343430363235326630373831
35313635643936663438316132623265306531383838633266336563613662386233663937616230
33333933353831396534356461653537616536633365323364326666323833346432636536643737
31663065303933316438653864313734366464616137333838643839313437623532333766373763
35346237383433643032613630396364386464316133343764666431636330333463333037306431
35353232633463363732346462663230376631363832363239396262643531393831306633663966
64333136343662343564653935306438663233623332626337613931353861396562663334346537
353330613139383830303838353838356233
---
# Vault файл с секретными переменными для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Пароль для пользователя devops
vault_devops_password: "123123"
# SSH публичный ключ для пользователя devops
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@devops.org.ru"