Обновление проекта
This commit is contained in:
118
CHANGELOG.md
118
CHANGELOG.md
@@ -1,118 +0,0 @@
|
|||||||
# 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
|
|
||||||
274
Makefile
274
Makefile
@@ -50,6 +50,7 @@ BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.re
|
|||||||
role:
|
role:
|
||||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||||
lint) \
|
lint) \
|
||||||
|
$(MAKE) decrypt; \
|
||||||
ROLE_NAME="$(word 3, $(MAKECMDGOALS))"; \
|
ROLE_NAME="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
if [ -z "$$ROLE_NAME" ]; then \
|
if [ -z "$$ROLE_NAME" ]; then \
|
||||||
echo "🔍 Проверка синтаксиса всех ролей ..."; \
|
echo "🔍 Проверка синтаксиса всех ролей ..."; \
|
||||||
@@ -65,6 +66,7 @@ role:
|
|||||||
exit 1; \
|
exit 1; \
|
||||||
fi; \
|
fi; \
|
||||||
fi; \
|
fi; \
|
||||||
|
$(MAKE) encrypt-all; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo "✅ Lint завершен";; \
|
echo "✅ Lint завершен";; \
|
||||||
test) \
|
test) \
|
||||||
@@ -82,6 +84,7 @@ role:
|
|||||||
exit 1; \
|
exit 1; \
|
||||||
fi; \
|
fi; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
|
$(MAKE) decrypt; \
|
||||||
echo "🔧 Запуск ansible-controller контейнера..."; \
|
echo "🔧 Запуск ansible-controller контейнера..."; \
|
||||||
docker run --rm --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace \
|
docker run --rm --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace \
|
||||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
@@ -103,15 +106,16 @@ role:
|
|||||||
echo '=== ПРОВЕРКА ПОДКЛЮЧЕНИЯ К КОНТЕЙНЕРАМ ==='; \
|
echo '=== ПРОВЕРКА ПОДКЛЮЧЕНИЯ К КОНТЕЙНЕРАМ ==='; \
|
||||||
ansible all -i /tmp/molecule_workspace/inventory/hosts.ini -m ping && \
|
ansible all -i /tmp/molecule_workspace/inventory/hosts.ini -m ping && \
|
||||||
echo ''; \
|
echo ''; \
|
||||||
echo '=== ЗАПУСК RUN.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ==='; \
|
echo '=== ЗАПУСК CONVERGE.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ==='; \
|
||||||
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini run.yml -v -e vault_devops_password="123123" -e vault_devops_ssh_public_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDBjzRt/b5Xe/tgQS2rvOBXOSBq1hychcnbz6G4m9Ps6hQXCxLA0hcrzPIRGazeWEslqsBynSm4fVJC6zAnExEd7KsNxS5gsMxmcHsghuU6/IA62tP8w8tXKEWaCGMQyfcUO/MIrdEjAg8txl3FIxdlcYwBTLW9nJggOmUn9w1YOA6ECNBDUbTwZC62yomJhQoAK0W+uVkKSLTqRIvd0oZJEF+0dtzBrhhe7cjR6fuoLpkB1/Q9bQImVfAxEiiExhFWFMxcyf4SGxpmsbKI4rJ3eBvsMmhrX76p1bYX4fKGiBaqNyXqThYWYybXfDfaITQR87SIrVt4U4NzS79ZFfQ142VPs+YISiy/+/VKZ1NjHo1fRZJSqBtsWJCsvtuM6C2+dRZ0JqwwMlHKLNhmerYMLJMQxkxdB5jRxafC+3T0aFNIsFIa7MdC8i3WQBk5z5huY5pslkPWnmKTfCi3gLjWNhfW9xEgKAww6hGrZR/zlQXZQrmQ2LGspzXFngd9tmk= linux@key" && \
|
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini converge.yml && \
|
||||||
echo ''; \
|
echo ''; \
|
||||||
echo '=== ЗАПУСК ROLES/DEPLOY.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ==='; \
|
echo '=== ЗАПУСК ROLES/DEPLOY.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ==='; \
|
||||||
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini ../../roles/deploy.yml -v -e vault_devops_password="123123" -e vault_devops_ssh_public_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDBjzRt/b5Xe/tgQS2rvOBXOSBq1hychcnbz6G4m9Ps6hQXCxLA0hcrzPIRGazeWEslqsBynSm4fVJC6zAnExEd7KsNxS5gsMxmcHsghuU6/IA62tP8w8tXKEWaCGMQyfcUO/MIrdEjAg8txl3FIxdlcYwBTLW9nJggOmUn9w1YOA6ECNBDUbTwZC62yomJhQoAK0W+uVkKSLTqRIvd0oZJEF+0dtzBrhhe7cjR6fuoLpkB1/Q9bQImVfAxEiiExhFWFMxcyf4SGxpmsbKI4rJ3eBvsMmhrX76p1bYX4fKGiBaqNyXqThYWYybXfDfaITQR87SIrVt4U4NzS79ZFfQ142VPs+YISiy/+/VKZ1NjHo1fRZJSqBtsWJCsvtuM6C2+dRZ0JqwwMlHKLNhmerYMLJMQxkxdB5jRxafC+3T0aFNIsFIa7MdC8i3WQBk5z5huY5pslkPWnmKTfCi3gLjWNhfW9xEgKAww6hGrZR/zlQXZQrmQ2LGspzXFngd9tmk= linux@key" && \
|
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini ../../roles/deploy.yml && \
|
||||||
echo ''; \
|
echo ''; \
|
||||||
echo '=== ОЧИСТКА РЕСУРСОВ ==='; \
|
echo '=== ОЧИСТКА РЕСУРСОВ ==='; \
|
||||||
ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && \
|
ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && \
|
||||||
echo '✅ Тестирование завершено'";; \
|
echo '✅ Тестирование завершено'"; \
|
||||||
|
$(MAKE) encrypt-all;; \
|
||||||
deploy) \
|
deploy) \
|
||||||
echo "🚀 Развертывание ролей на реальные серверы..."; \
|
echo "🚀 Развертывание ролей на реальные серверы..."; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
@@ -120,6 +124,7 @@ role:
|
|||||||
echo "💡 Создайте файл inventory/hosts.ini с вашими серверами"; \
|
echo "💡 Создайте файл inventory/hosts.ini с вашими серверами"; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
fi; \
|
fi; \
|
||||||
|
$(MAKE) decrypt; \
|
||||||
echo "📋 Используется inventory: inventory/hosts.ini"; \
|
echo "📋 Используется inventory: inventory/hosts.ini"; \
|
||||||
echo "📄 Содержимое inventory:"; \
|
echo "📄 Содержимое inventory:"; \
|
||||||
docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) cat inventory/hosts.ini || cat inventory/hosts.ini; \
|
docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) cat inventory/hosts.ini || cat inventory/hosts.ini; \
|
||||||
@@ -140,7 +145,8 @@ role:
|
|||||||
bash -c "ansible-playbook -i inventory/hosts.ini roles/deploy.yml"; \
|
bash -c "ansible-playbook -i inventory/hosts.ini roles/deploy.yml"; \
|
||||||
else \
|
else \
|
||||||
echo "❌ Развертывание отменено"; \
|
echo "❌ Развертывание отменено"; \
|
||||||
fi;; \
|
fi; \
|
||||||
|
$(MAKE) encrypt-all;; \
|
||||||
list) \
|
list) \
|
||||||
./scripts/role-manager.sh list;; \
|
./scripts/role-manager.sh list;; \
|
||||||
create) \
|
create) \
|
||||||
@@ -275,66 +281,59 @@ vault:
|
|||||||
else \
|
else \
|
||||||
echo "✅ Файл vault/.vault уже существует"; \
|
echo "✅ Файл vault/.vault уже существует"; \
|
||||||
fi;; \
|
fi;; \
|
||||||
create) \
|
|
||||||
if [ ! -f "vault/.vault" ]; then \
|
|
||||||
echo "⚠️ Файл vault/.vault не найден!"; \
|
|
||||||
echo "💡 Сначала создайте файл: make vault init"; \
|
|
||||||
exit 1; \
|
|
||||||
fi; \
|
|
||||||
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) \
|
edit) \
|
||||||
echo "🔐 Редактирование секретов..."; \
|
echo "🔐 Редактирование vars/main.yml выбранной роли..."; \
|
||||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
echo "📋 Доступные роли:"; \
|
||||||
echo ""; \
|
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
read -p "Введите имя роли: " ROLE; \
|
||||||
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
FILE="roles/$$ROLE/vars/main.yml"; \
|
||||||
-e EDITOR=$(EDITOR) \
|
if [ ! -f "$$FILE" ]; then echo "❌ Файл $$FILE не найден"; exit 1; fi; \
|
||||||
$(DOCKER_IMAGE) \
|
$(MAKE) decrypt-role ROLE=$$ROLE; \
|
||||||
ansible-vault edit --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
||||||
|
-e EDITOR=$(EDITOR) \
|
||||||
|
$(DOCKER_IMAGE) \
|
||||||
|
bash -c 'exec ${EDITOR:-nano} "$1"' _ "$$FILE"; \
|
||||||
|
$(MAKE) encrypt-role ROLE=$$ROLE;; \
|
||||||
show) \
|
show) \
|
||||||
echo "🔐 Просмотр секретов..."; \
|
echo "🔐 Просмотр vars/main.yml выбранной роли..."; \
|
||||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
echo "📋 Доступные роли:"; \
|
||||||
echo ""; \
|
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
read -p "Введите имя роли: " ROLE; \
|
||||||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
FILE="roles/$$ROLE/vars/main.yml"; \
|
||||||
$(DOCKER_IMAGE) \
|
if [ ! -f "$$FILE" ]; then echo "❌ Файл $$FILE не найден"; exit 1; fi; \
|
||||||
ansible-vault view --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||||||
delete) \
|
$(DOCKER_IMAGE) bash -c 'f="$1"; \
|
||||||
echo "🔐 Удаление секретов..."; \
|
if grep -q "ANSIBLE_VAULT" "$${f}" 2>/dev/null; then \
|
||||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
ansible-vault view --vault-password-file vault/.vault "$${f}"; \
|
||||||
echo ""; \
|
else \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
cat "$${f}"; \
|
||||||
rm -f vault/$$FILE.yml;; \
|
fi' _ "$$FILE";; \
|
||||||
encrypt) \
|
encrypt) \
|
||||||
echo "🔐 Шифрование файла..."; \
|
echo "🔐 Шифрование vars/main.yml выбранной роли..."; \
|
||||||
ls -la vault/*.yml 2>/dev/null || echo "Нет файлов для шифрования"; \
|
echo "📋 Доступные роли:"; \
|
||||||
echo ""; \
|
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
read -p "Введите имя роли: " ROLE; \
|
||||||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
$(MAKE) encrypt-role ROLE="$$ROLE";; \
|
||||||
$(DOCKER_IMAGE) \
|
|
||||||
ansible-vault encrypt --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
|
||||||
decrypt) \
|
decrypt) \
|
||||||
echo "🔐 Расшифровка файла..."; \
|
echo "🔓 Расшифровка vars/main.yml выбранной роли..."; \
|
||||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
echo "📋 Доступные роли:"; \
|
||||||
echo ""; \
|
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
read -p "Введите имя роли: " ROLE; \
|
||||||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
$(MAKE) decrypt-role ROLE="$$ROLE";; \
|
||||||
$(DOCKER_IMAGE) \
|
|
||||||
ansible-vault decrypt --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
|
||||||
rekey) \
|
rekey) \
|
||||||
echo "🔐 Смена пароля..."; \
|
echo "🔑 Смена пароля для vars/main.yml..."; \
|
||||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
echo "Выберите действие:"; \
|
||||||
echo ""; \
|
echo " 1) Сменить пароль для всех ролей"; \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
echo " 2) Сменить пароль для одной роли"; \
|
||||||
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
read -p "Введите номер (1-2): " CHOICE; \
|
||||||
-e EDITOR=$(EDITOR) \
|
case "$$CHOICE" in \
|
||||||
$(DOCKER_IMAGE) \
|
1) $(MAKE) rekey-all;; \
|
||||||
ansible-vault rekey --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
2) echo "📋 Доступные роли:"; \
|
||||||
|
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||||
|
read -p "Введите имя роли: " ROLE; \
|
||||||
|
$(MAKE) rekey-role ROLE="$$ROLE";; \
|
||||||
|
*) echo "❌ Неверный выбор"; exit 1;; \
|
||||||
|
esac;; \
|
||||||
check) \
|
check) \
|
||||||
echo "🔍 Проверка vault файлов..."; \
|
echo "🔍 Проверка vault файлов..."; \
|
||||||
if [ ! -d "vault" ]; then \
|
if [ ! -d "vault" ]; then \
|
||||||
@@ -378,18 +377,12 @@ vault:
|
|||||||
echo " 🔑 make vault init - инициализировать vault (создать vault/.vault)"; \
|
echo " 🔑 make vault init - инициализировать vault (создать vault/.vault)"; \
|
||||||
echo " 💡 Первая команда для настройки vault"; \
|
echo " 💡 Первая команда для настройки vault"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " 🔐 make vault create - создать новый файл секретов"; \
|
|
||||||
echo " 💡 Интерактивное создание зашифрованного файла с nano"; \
|
|
||||||
echo ""; \
|
|
||||||
echo " ✏️ make vault edit - редактировать существующие секреты"; \
|
echo " ✏️ make vault edit - редактировать существующие секреты"; \
|
||||||
echo " 💡 Открывает nano для изменения секретов"; \
|
echo " 💡 Открывает nano для изменения секретов"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " 👁️ make vault show - показать содержимое секретов"; \
|
echo " 👁️ make vault show - показать содержимое секретов"; \
|
||||||
echo " 💡 Расшифровывает и показывает содержимое"; \
|
echo " 💡 Расшифровывает и показывает содержимое"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " 🗑️ make vault delete - удалить файл секретов"; \
|
|
||||||
echo " 💡 Безвозвратное удаление файла"; \
|
|
||||||
echo ""; \
|
|
||||||
echo " 🔒 make vault encrypt - зашифровать существующий файл"; \
|
echo " 🔒 make vault encrypt - зашифровать существующий файл"; \
|
||||||
echo " 💡 Шифрует незашифрованный файл"; \
|
echo " 💡 Шифрует незашифрованный файл"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
@@ -397,7 +390,7 @@ vault:
|
|||||||
echo " 💡 Создает незашифрованную копию"; \
|
echo " 💡 Создает незашифрованную копию"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " 🔑 make vault rekey - сменить пароль шифрования"; \
|
echo " 🔑 make vault rekey - сменить пароль шифрования"; \
|
||||||
echo " 💡 Изменяет пароль для существующего файла с nano"; \
|
echo " 💡 Изменяет пароль для всех или одной роли"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " ✅ make vault check - проверить vault файлы"; \
|
echo " ✅ make vault check - проверить vault файлы"; \
|
||||||
echo " 💡 Проверяет структуру и статус файлов"; \
|
echo " 💡 Проверяет структуру и статус файлов"; \
|
||||||
@@ -413,6 +406,7 @@ git:
|
|||||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||||
push) \
|
push) \
|
||||||
echo "📤 Отправка изменений в репозиторий..."; \
|
echo "📤 Отправка изменений в репозиторий..."; \
|
||||||
|
$(MAKE) encrypt-all; \
|
||||||
if [ -d "vault" ]; then \
|
if [ -d "vault" ]; then \
|
||||||
VAULT_FILES=$$(find vault -maxdepth 1 -type f -name "*.yml" 2>/dev/null); \
|
VAULT_FILES=$$(find vault -maxdepth 1 -type f -name "*.yml" 2>/dev/null); \
|
||||||
if [ -n "$$VAULT_FILES" ]; then \
|
if [ -n "$$VAULT_FILES" ]; then \
|
||||||
@@ -425,6 +419,7 @@ git:
|
|||||||
done; \
|
done; \
|
||||||
fi; \
|
fi; \
|
||||||
fi; \
|
fi; \
|
||||||
|
$(MAKE) decrypt-all; \
|
||||||
git add .; \
|
git add .; \
|
||||||
git commit -m "Обновление проекта"; \
|
git commit -m "Обновление проекта"; \
|
||||||
git push origin main;; \
|
git push origin main;; \
|
||||||
@@ -1593,13 +1588,11 @@ help:
|
|||||||
@echo ""
|
@echo ""
|
||||||
@echo "🔐 VAULT (управление секретами):"
|
@echo "🔐 VAULT (управление секретами):"
|
||||||
@echo " make vault init - инициализировать vault (создать vault/.vault)"
|
@echo " make vault init - инициализировать vault (создать vault/.vault)"
|
||||||
@echo " make vault create - создать новый файл секретов"
|
|
||||||
@echo " make vault edit - редактировать существующие секреты"
|
@echo " make vault edit - редактировать существующие секреты"
|
||||||
@echo " make vault show - показать содержимое секретов"
|
@echo " make vault show - показать содержимое секретов"
|
||||||
@echo " make vault delete - удалить файл секретов"
|
|
||||||
@echo " make vault encrypt - зашифровать файл"
|
@echo " make vault encrypt - зашифровать файл"
|
||||||
@echo " make vault decrypt - расшифровать файл"
|
@echo " make vault decrypt - расшифровать файл"
|
||||||
@echo " make vault rekey - сменить пароль шифрования"
|
@echo " make vault rekey - сменить пароль шифрования (все/одна роль)"
|
||||||
@echo " make vault check - проверить vault файлы"
|
@echo " make vault check - проверить vault файлы"
|
||||||
@echo " make vault scan - поиск потенциальных секретов"
|
@echo " make vault scan - поиск потенциальных секретов"
|
||||||
@echo ""
|
@echo ""
|
||||||
@@ -1665,6 +1658,139 @@ setup-cicd:
|
|||||||
@chmod +x scripts/setup-cicd.sh
|
@chmod +x scripts/setup-cicd.sh
|
||||||
@./scripts/setup-cicd.sh
|
@./scripts/setup-cicd.sh
|
||||||
|
|
||||||
|
# Вспомогательные функции: шифрование/расшифровка roles/*/vars/main.yml
|
||||||
|
.PHONY: encrypt decrypt rekey-all
|
||||||
|
encrypt-all:
|
||||||
|
@echo "🔐 Шифрование всех roles/*/vars/main.yml (только незашифрованных) ..."
|
||||||
|
@docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
|
||||||
|
VAULT=vault/.vault; \
|
||||||
|
for f in roles/*/vars/main.yml; do [ -f "$$f" ] || continue; \
|
||||||
|
if ! grep -q "ANSIBLE_VAULT" "$$f" 2>/dev/null; then \
|
||||||
|
ansible-vault encrypt --encrypt-vault-id default --vault-password-file "$$VAULT" "$$f" || true; \
|
||||||
|
printf "✅ Зашифровано: %s\n" "$$f"; \
|
||||||
|
else \
|
||||||
|
printf "ℹ️ Уже зашифровано: %s\n" "$$f"; \
|
||||||
|
fi; \
|
||||||
|
done'
|
||||||
|
|
||||||
|
decrypt-all:
|
||||||
|
@echo "🔓 Расшифровка всех roles/*/vars/main.yml (только зашифрованных) ..."
|
||||||
|
@docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
|
||||||
|
VAULT=vault/.vault; \
|
||||||
|
for f in roles/*/vars/main.yml; do [ -f "$$f" ] || continue; \
|
||||||
|
if grep -q "ANSIBLE_VAULT" "$$f" 2>/dev/null; then \
|
||||||
|
ansible-vault decrypt --vault-password-file "$$VAULT" "$$f" || true; \
|
||||||
|
printf "✅ Расшифровано: %s\n" "$$f"; \
|
||||||
|
else \
|
||||||
|
printf "ℹ️ Уже расшифровано: %s\n" "$$f"; \
|
||||||
|
fi; \
|
||||||
|
done'
|
||||||
|
|
||||||
|
rekey-all:
|
||||||
|
@echo "🔑 Смена пароля для всех roles/*/vars/main.yml (только зашифрованных) ..."
|
||||||
|
@docker run --rm -it -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
|
||||||
|
VAULT=vault/.vault; \
|
||||||
|
for f in roles/*/vars/main.yml; do [ -f "$$f" ] || continue; \
|
||||||
|
if grep -q "ANSIBLE_VAULT" "$$f" 2>/dev/null; then \
|
||||||
|
printf "🔑 Смена пароля для: %s\n" "$$f"; \
|
||||||
|
ansible-vault rekey --vault-password-file "$$VAULT" "$$f" || true; \
|
||||||
|
printf "✅ Пароль изменен: %s\n" "$$f"; \
|
||||||
|
else \
|
||||||
|
printf "ℹ️ Пропущено (не зашифровано): %s\n" "$$f"; \
|
||||||
|
fi; \
|
||||||
|
done'
|
||||||
|
|
||||||
|
# Вспомогательные функции: шифрование/расшифровка ТОЛЬКО одной роли
|
||||||
|
.PHONY: encrypt-role decrypt-role rekey-role
|
||||||
|
encrypt-role:
|
||||||
|
@ROLE_NAME="$(ROLE)"; \
|
||||||
|
echo "📋 Доступные роли:"; \
|
||||||
|
ls -1 roles | grep -v "\.yml$$" | sed 's/^/ - /'; \
|
||||||
|
if [ -z "$$ROLE_NAME" ]; then \
|
||||||
|
read -p "Введите имя роли: " ROLE_NAME; \
|
||||||
|
fi; \
|
||||||
|
if [ ! -d "roles/$$ROLE_NAME" ]; then \
|
||||||
|
echo "❌ Роль '$$ROLE_NAME' не найдена"; \
|
||||||
|
echo "📋 Доступные роли:"; \
|
||||||
|
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||||
|
echo "↩️ Возврат в интерактивный выбор роли для шифрования..."; \
|
||||||
|
$(MAKE) vault encrypt; \
|
||||||
|
exit 0; \
|
||||||
|
fi; \
|
||||||
|
FILE="roles/$$ROLE_NAME/vars/main.yml"; \
|
||||||
|
if [ ! -f "$$FILE" ]; then \
|
||||||
|
echo "❌ Файл $$FILE не найден"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
if grep -q "ANSIBLE_VAULT" "$$FILE" 2>/dev/null; then \
|
||||||
|
echo "ℹ️ Уже зашифровано: $$FILE"; \
|
||||||
|
exit 0; \
|
||||||
|
fi; \
|
||||||
|
docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
|
||||||
|
VAULT=vault/.vault; \
|
||||||
|
ansible-vault encrypt --encrypt-vault-id default --vault-password-file "$$VAULT" "$$1" || true' _ "$$FILE"; \
|
||||||
|
echo "✅ Зашифровано: $$FILE"
|
||||||
|
|
||||||
|
decrypt-role:
|
||||||
|
@ROLE_NAME="$(ROLE)"; \
|
||||||
|
echo "📋 Доступные роли:"; \
|
||||||
|
ls -1 roles | grep -v "\.yml$$" | sed 's/^/ - /'; \
|
||||||
|
if [ -z "$$ROLE_NAME" ]; then \
|
||||||
|
read -p "Введите имя роли: " ROLE_NAME; \
|
||||||
|
fi; \
|
||||||
|
if [ ! -d "roles/$$ROLE_NAME" ]; then \
|
||||||
|
echo "❌ Роль '$$ROLE_NAME' не найдена"; \
|
||||||
|
echo "📋 Доступные роли:"; \
|
||||||
|
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||||
|
echo "↩️ Возврат в интерактивный выбор роли для расшифровки..."; \
|
||||||
|
$(MAKE) vault decrypt; \
|
||||||
|
exit 0; \
|
||||||
|
fi; \
|
||||||
|
FILE="roles/$$ROLE_NAME/vars/main.yml"; \
|
||||||
|
if [ ! -f "$$FILE" ]; then \
|
||||||
|
echo "❌ Файл $$FILE не найден"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
if ! grep -q "ANSIBLE_VAULT" "$$FILE" 2>/dev/null; then \
|
||||||
|
echo "ℹ️ Уже расшифровано: $$FILE"; \
|
||||||
|
exit 0; \
|
||||||
|
fi; \
|
||||||
|
docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
|
||||||
|
VAULT=vault/.vault; \
|
||||||
|
ansible-vault decrypt --vault-password-file "$$VAULT" "$$1" || true' _ "$$FILE"; \
|
||||||
|
echo "✅ Расшифровано: $$FILE"
|
||||||
|
|
||||||
|
rekey-role:
|
||||||
|
@ROLE_NAME="$(ROLE)"; \
|
||||||
|
echo "🔑 Смена пароля для vars/main.yml выбранной роли..."; \
|
||||||
|
echo "📋 Доступные роли:"; \
|
||||||
|
ls -1 roles | grep -v "\.yml$$" | sed 's/^/ - /'; \
|
||||||
|
if [ -z "$$ROLE_NAME" ]; then \
|
||||||
|
read -p "Введите имя роли: " ROLE_NAME; \
|
||||||
|
fi; \
|
||||||
|
if [ ! -d "roles/$$ROLE_NAME" ]; then \
|
||||||
|
echo "❌ Роль '$$ROLE_NAME' не найдена"; \
|
||||||
|
echo "📋 Доступные роли:"; \
|
||||||
|
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||||
|
echo "↩️ Возврат в интерактивный выбор роли для смены пароля..."; \
|
||||||
|
$(MAKE) vault rekey; \
|
||||||
|
exit 0; \
|
||||||
|
fi; \
|
||||||
|
FILE="roles/$$ROLE_NAME/vars/main.yml"; \
|
||||||
|
if [ ! -f "$$FILE" ]; then \
|
||||||
|
echo "❌ Файл $$FILE не найден"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
if ! grep -q "ANSIBLE_VAULT" "$$FILE" 2>/dev/null; then \
|
||||||
|
echo "ℹ️ Файл $$FILE не зашифрован, сначала зашифруйте его"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
||||||
|
-e EDITOR=$(EDITOR) \
|
||||||
|
$(DOCKER_IMAGE) \
|
||||||
|
ansible-vault rekey --vault-password-file vault/.vault "$$FILE"; \
|
||||||
|
echo "✅ Пароль изменен для: $$FILE"
|
||||||
|
|
||||||
# Очистка контейнеров Molecule
|
# Очистка контейнеров Molecule
|
||||||
.PHONY: clean-containers
|
.PHONY: clean-containers
|
||||||
clean-containers:
|
clean-containers:
|
||||||
@@ -1680,6 +1806,14 @@ clean-containers:
|
|||||||
@echo "✅ Очистка завершена"
|
@echo "✅ Очистка завершена"
|
||||||
|
|
||||||
# Пустые цели для совместимости
|
# Пустые цели для совместимости
|
||||||
|
.PHONY: encrypt decrypt
|
||||||
|
encrypt:
|
||||||
|
@echo "ℹ️ Команда переименована. Используйте: make encrypt-all или make vault encrypt"
|
||||||
|
@true
|
||||||
|
decrypt:
|
||||||
|
@echo "ℹ️ Команда переименована. Используйте: make decrypt-all или make vault decrypt"
|
||||||
|
@true
|
||||||
|
|
||||||
view create edit show delete lint deploy new advanced list info test build push pull clean prepare update run stop purge clean-builder setup-builder diagnose reset-builder build-image:
|
view create edit show delete lint deploy new advanced list info test build push pull clean prepare update run stop purge clean-builder setup-builder diagnose reset-builder build-image:
|
||||||
@true
|
@true
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ DevOpsLab/
|
|||||||
│ │ ├── create.yml # Создание контейнеров
|
│ │ ├── create.yml # Создание контейнеров
|
||||||
│ │ ├── converge.yml # Запуск тестов
|
│ │ ├── converge.yml # Запуск тестов
|
||||||
│ │ ├── destroy.yml # Удаление контейнеров
|
│ │ ├── destroy.yml # Удаление контейнеров
|
||||||
│ │ ├── run.yml # Основной playbook для обновления контейнеров
|
│ │ ├── converge.yml # Основной playbook (включает логику бывшего run.yml)
|
||||||
│ │ ├── verify.yml # Проверка конфигурации
|
│ │ ├── verify.yml # Проверка конфигурации
|
||||||
│ │ └── molecule.yml # Конфигурация Molecule
|
│ │ └── molecule.yml # Конфигурация Molecule
|
||||||
│ └── presets/ # Preset конфигурации
|
│ └── presets/ # Preset конфигурации
|
||||||
@@ -596,7 +596,7 @@ make custom-images # справка по собственным
|
|||||||
|
|
||||||
### Развертывание и конфигурация
|
### Развертывание и конфигурация
|
||||||
|
|
||||||
- **[docs/run-yml-guide.md](docs/run-yml-guide.md)** - Руководство по файлу run.yml
|
- Конфигурация run.yml перенесена в `molecule/default/converge.yml`
|
||||||
- **[docs/deploy-yml-customization.md](docs/deploy-yml-customization.md)** - Полное руководство по кастомизации deploy.yml
|
- **[docs/deploy-yml-customization.md](docs/deploy-yml-customization.md)** - Полное руководство по кастомизации deploy.yml
|
||||||
|
|
||||||
### Безопасность и качество
|
### Безопасность и качество
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ docker run --rm \
|
|||||||
-v $(pwd):/workspace \
|
-v $(pwd):/workspace \
|
||||||
-w /workspace \
|
-w /workspace \
|
||||||
inecs/ansible-lab:ansible-controller-latest \
|
inecs/ansible-lab:ansible-controller-latest \
|
||||||
ansible-playbook run.yml
|
ansible-playbook converge.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. k8s
|
### 2. k8s
|
||||||
|
|||||||
@@ -8,16 +8,6 @@
|
|||||||
# Получаем preset из переменной окружения или используем default
|
# Получаем preset из переменной окружения или используем default
|
||||||
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||||
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
|
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
|
||||||
|
|
||||||
# перечисли файлы/глобы, которые нужно временно расшифровать
|
|
||||||
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
|
|
||||||
# - /workspace/roles/*/defaults/*.yml
|
|
||||||
# - /workspace/files/**/*secret*.yml
|
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -38,262 +28,197 @@
|
|||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# VAULT - Работа с зашифрованными файлами
|
# НАСТРОЙКА ЗАВЕРШЕНА - Переходим к подготовке контейнеров
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
- name: Vault operations
|
- name: Configuration loaded and proceed to container preparation
|
||||||
debug:
|
debug:
|
||||||
msg: |
|
msg: |
|
||||||
================================================================================
|
================================================================================
|
||||||
VAULT - Работа с зашифрованными файлами
|
НАСТРОЙКА ЗАВЕРШЕНА
|
||||||
================================================================================
|
================================================================================
|
||||||
Files: {{ vault_targets | length }} targets
|
Конфигурация загружена. Далее выполняется подготовка контейнеров (ранее была в run.yml)
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
- name: Check vault files encryption status
|
|
||||||
community.docker.docker_container_exec:
|
|
||||||
container: ansible-controller
|
|
||||||
command: |
|
|
||||||
bash -c '
|
|
||||||
VAULT_TARGETS_JSON="{{ vault_targets | to_json }}"
|
|
||||||
VAULT_PASSWORD_FILE="/workspace/vault/.vault"
|
|
||||||
|
|
||||||
echo "=== CHECKING VAULT FILES ENCRYPTION STATUS ==="
|
|
||||||
|
|
||||||
# Парсим JSON массив и проверяем каждый файл
|
|
||||||
echo "$VAULT_TARGETS_JSON" | jq -r ".[]" | while read -r target; do
|
|
||||||
echo "Checking target: $target"
|
|
||||||
|
|
||||||
# Если это glob паттерн, находим файлы
|
|
||||||
if [[ "$target" == *"*"* ]]; then
|
|
||||||
for file in $target; do
|
|
||||||
if [ -f "$file" ]; then
|
|
||||||
echo "Found file: $file"
|
|
||||||
if grep -q "ANSIBLE_VAULT" "$file"; then
|
|
||||||
echo "ENCRYPTED: $file"
|
|
||||||
else
|
|
||||||
echo "PLAINTEXT: $file"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
# Обычный файл
|
|
||||||
if [ -f "$target" ]; then
|
|
||||||
echo "Found file: $target"
|
|
||||||
if grep -q "ANSIBLE_VAULT" "$target"; then
|
|
||||||
echo "ENCRYPTED: $target"
|
|
||||||
else
|
|
||||||
echo "PLAINTEXT: $target"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "NOT_FOUND: $target"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
'
|
|
||||||
register: vault_status_check
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Encrypt plaintext vault files
|
# =============================================================================
|
||||||
community.docker.docker_container_exec:
|
# ПОДГОТОВКА КОНТЕЙНЕРОВ (бывший run.yml)
|
||||||
container: ansible-controller
|
# =============================================================================
|
||||||
command: |
|
- name: Подготовка окружения для тестирования
|
||||||
bash -c '
|
hosts: all
|
||||||
VAULT_TARGETS_JSON="{{ vault_targets | to_json }}"
|
become: true
|
||||||
VAULT_PASSWORD_FILE="/workspace/vault/.vault"
|
tasks:
|
||||||
|
# Сброс цветовых кодов ANSI для корректного отображения
|
||||||
echo "=== ENCRYPTING PLAINTEXT VAULT FILES ==="
|
- name: Reset ANSI color codes
|
||||||
|
|
||||||
if [ ! -f "$VAULT_PASSWORD_FILE" ]; then
|
|
||||||
echo "Vault password file not found: $VAULT_PASSWORD_FILE"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Парсим JSON массив и шифруем каждый plaintext файл
|
|
||||||
echo "$VAULT_TARGETS_JSON" | jq -r ".[]" | while read -r target; do
|
|
||||||
echo "Processing target: $target"
|
|
||||||
|
|
||||||
# Если это glob паттерн, находим файлы
|
|
||||||
if [[ "$target" == *"*"* ]]; then
|
|
||||||
for file in $target; do
|
|
||||||
if [ -f "$file" ] && ! grep -q "ANSIBLE_VAULT" "$file"; then
|
|
||||||
echo "Encrypting plaintext file: $file"
|
|
||||||
ansible-vault encrypt --encrypt-vault-id default --vault-password-file "$VAULT_PASSWORD_FILE" "$file"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
# Обычный файл
|
|
||||||
if [ -f "$target" ] && ! grep -q "ANSIBLE_VAULT" "$target"; then
|
|
||||||
echo "Encrypting plaintext file: $target"
|
|
||||||
ansible-vault encrypt --encrypt-vault-id default --vault-password-file "$VAULT_PASSWORD_FILE" "$target"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
'
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Decrypt vault files for processing
|
|
||||||
community.docker.docker_container_exec:
|
|
||||||
container: ansible-controller
|
|
||||||
command: |
|
|
||||||
bash -c '
|
|
||||||
VAULT_TARGETS_JSON="{{ vault_targets | to_json }}"
|
|
||||||
VAULT_PASSWORD_FILE="/workspace/vault/.vault"
|
|
||||||
|
|
||||||
echo "=== DECRYPTING VAULT FILES FOR PROCESSING ==="
|
|
||||||
|
|
||||||
if [ ! -f "$VAULT_PASSWORD_FILE" ]; then
|
|
||||||
echo "Vault password file not found: $VAULT_PASSWORD_FILE"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Парсим JSON массив и расшифровываем каждый зашифрованный файл
|
|
||||||
echo "$VAULT_TARGETS_JSON" | jq -r ".[]" | while read -r target; do
|
|
||||||
echo "Processing target: $target"
|
|
||||||
|
|
||||||
# Если это glob паттерн, находим файлы
|
|
||||||
if [[ "$target" == *"*"* ]]; then
|
|
||||||
for file in $target; do
|
|
||||||
if [ -f "$file" ] && grep -q "ANSIBLE_VAULT" "$file"; then
|
|
||||||
echo "Decrypting encrypted file: $file"
|
|
||||||
ansible-vault decrypt --vault-password-file "$VAULT_PASSWORD_FILE" "$file"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
# Обычный файл
|
|
||||||
if [ -f "$target" ] && grep -q "ANSIBLE_VAULT" "$target"; then
|
|
||||||
echo "Decrypting encrypted file: $target"
|
|
||||||
ansible-vault decrypt --vault-password-file "$VAULT_PASSWORD_FILE" "$target"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
'
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# VAULT LOADING - Загрузка vault переменных из vault_targets
|
|
||||||
# =============================================================================
|
|
||||||
- name: Load vault variables from vault_targets
|
|
||||||
community.docker.docker_container_exec:
|
|
||||||
container: ansible-controller
|
|
||||||
command: |
|
|
||||||
bash -c '
|
|
||||||
VAULT_PASSWORD_FILE="/workspace/vault/.vault"
|
|
||||||
|
|
||||||
# Читаем vault_targets из переменных Ansible
|
|
||||||
VAULT_TARGETS_JSON="{{ vault_targets | to_json }}"
|
|
||||||
|
|
||||||
echo "=== VAULT LOADING ==="
|
|
||||||
echo "Vault password file: $VAULT_PASSWORD_FILE"
|
|
||||||
echo "Vault targets from Ansible: $VAULT_TARGETS_JSON"
|
|
||||||
|
|
||||||
# Создаем директории для vault файлов
|
|
||||||
mkdir -p /tmp/vault_files
|
|
||||||
|
|
||||||
# Создаем временный файл для объединения всех vault переменных
|
|
||||||
echo "---" > /tmp/vault_vars.yml
|
|
||||||
|
|
||||||
# Счетчик для обработки конфликтов
|
|
||||||
declare -A variable_sources
|
|
||||||
|
|
||||||
# Парсим JSON массив и обрабатываем каждый target
|
|
||||||
echo "$VAULT_TARGETS_JSON" | jq -r ".[]" | while read -r target; do
|
|
||||||
echo "Processing target: $target"
|
|
||||||
|
|
||||||
# Если это glob паттерн, находим файлы
|
|
||||||
if [[ "$target" == *"*"* ]]; then
|
|
||||||
for file in $target; do
|
|
||||||
if [ -f "$file" ]; then
|
|
||||||
echo "Found vault file: $file"
|
|
||||||
|
|
||||||
# Создаем копию файла в /tmp/vault_files для прямых ссылок
|
|
||||||
filename=$(basename "$file")
|
|
||||||
cp "$file" "/tmp/vault_files/$filename"
|
|
||||||
|
|
||||||
# Расшифровываем файл если нужно
|
|
||||||
if [ -f "$VAULT_PASSWORD_FILE" ]; then
|
|
||||||
echo "Loading encrypted vault file: $file"
|
|
||||||
ansible-vault view --vault-password-file "$VAULT_PASSWORD_FILE" "$file" > "/tmp/vault_files/${filename}.decrypted"
|
|
||||||
|
|
||||||
# Добавляем в объединенный файл с проверкой конфликтов
|
|
||||||
echo "---" >> /tmp/vault_vars.yml
|
|
||||||
echo "# From: $file" >> /tmp/vault_vars.yml
|
|
||||||
ansible-vault view --vault-password-file "$VAULT_PASSWORD_FILE" "$file" >> /tmp/vault_vars.yml
|
|
||||||
else
|
|
||||||
echo "Loading plain vault file: $file"
|
|
||||||
cp "$file" "/tmp/vault_files/${filename}.decrypted"
|
|
||||||
|
|
||||||
# Добавляем в объединенный файл с проверкой конфликтов
|
|
||||||
echo "---" >> /tmp/vault_vars.yml
|
|
||||||
echo "# From: $file" >> /tmp/vault_vars.yml
|
|
||||||
cat "$file" >> /tmp/vault_vars.yml
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
# Обычный файл
|
|
||||||
if [ -f "$target" ]; then
|
|
||||||
echo "Found vault file: $target"
|
|
||||||
|
|
||||||
# Создаем копию файла в /tmp/vault_files для прямых ссылок
|
|
||||||
filename=$(basename "$target")
|
|
||||||
cp "$target" "/tmp/vault_files/$filename"
|
|
||||||
|
|
||||||
# Расшифровываем файл если нужно
|
|
||||||
if [ -f "$VAULT_PASSWORD_FILE" ]; then
|
|
||||||
echo "Loading encrypted vault file: $target"
|
|
||||||
ansible-vault view --vault-password-file "$VAULT_PASSWORD_FILE" "$target" > "/tmp/vault_files/${filename}.decrypted"
|
|
||||||
|
|
||||||
# Добавляем в объединенный файл с проверкой конфликтов
|
|
||||||
echo "---" >> /tmp/vault_vars.yml
|
|
||||||
echo "# From: $target" >> /tmp/vault_vars.yml
|
|
||||||
ansible-vault view --vault-password-file "$VAULT_PASSWORD_FILE" "$target" >> /tmp/vault_vars.yml
|
|
||||||
else
|
|
||||||
echo "Loading plain vault file: $target"
|
|
||||||
cp "$target" "/tmp/vault_files/${filename}.decrypted"
|
|
||||||
|
|
||||||
# Добавляем в объединенный файл с проверкой конфликтов
|
|
||||||
echo "---" >> /tmp/vault_vars.yml
|
|
||||||
echo "# From: $target" >> /tmp/vault_vars.yml
|
|
||||||
cat "$target" >> /tmp/vault_vars.yml
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Символические ссылки не нужны для работы, убираем их создание
|
|
||||||
|
|
||||||
echo "=== VAULT VARIABLES LOADED ==="
|
|
||||||
echo "Combined vault variables:"
|
|
||||||
cat /tmp/vault_vars.yml
|
|
||||||
echo ""
|
|
||||||
echo "Individual vault files available at:"
|
|
||||||
ls -la /tmp/vault_files/
|
|
||||||
'
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# LOAD VAULT VARIABLES - Загрузка vault переменных в Ansible
|
|
||||||
# =============================================================================
|
|
||||||
- name: Load vault variables into Ansible
|
|
||||||
include_vars:
|
|
||||||
file: /tmp/vault_vars.yml
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Set vault files path
|
|
||||||
set_fact:
|
|
||||||
vault_files_path: /tmp/vault_files
|
|
||||||
when: vault_files_path is not defined
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# CONVERGE ЗАВЕРШЕН - Playbook'и выполняются через Makefile
|
|
||||||
# =============================================================================
|
|
||||||
- name: Converge completed
|
|
||||||
debug:
|
debug:
|
||||||
msg: |
|
msg: "\033[0m"
|
||||||
================================================================================
|
changed_when: false
|
||||||
CONVERGE ЗАВЕРШЕН
|
tags:
|
||||||
================================================================================
|
- setup
|
||||||
Vault переменные загружены и готовы к использованию
|
- color-reset
|
||||||
Playbook'и run.yml и roles/deploy.yml будут выполнены через Makefile
|
|
||||||
================================================================================
|
# Создание tmp директории для Ansible
|
||||||
|
- name: Create Ansible tmp directory
|
||||||
|
file:
|
||||||
|
path: /tmp/.ansible-tmp
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- tmp
|
||||||
|
|
||||||
|
# Обновление кеша пакетов для Debian/Ubuntu
|
||||||
|
- name: Update package cache (Debian/Ubuntu)
|
||||||
|
apt:
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: ansible_os_family == 'Debian'
|
||||||
|
changed_when: false
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- update
|
||||||
|
|
||||||
|
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
|
||||||
|
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
|
||||||
|
yum:
|
||||||
|
update_cache: true
|
||||||
|
when: ansible_os_family == 'RedHat'
|
||||||
|
changed_when: false
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- update
|
||||||
|
|
||||||
|
# Обновление кеша пакетов для Alt Linux
|
||||||
|
- name: Update package cache (Alt Linux)
|
||||||
|
command: apt-get update
|
||||||
|
when: ansible_os_family == 'Altlinux'
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- update
|
||||||
|
|
||||||
|
# Обновление кеша пакетов для Astra Linux
|
||||||
|
- name: Update package cache (Astra Linux)
|
||||||
|
command: apt-get update
|
||||||
|
when: ansible_os_family == 'Astra Linux'
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- update
|
||||||
|
|
||||||
|
# Установка common tools для всех ОС
|
||||||
|
- name: Install common tools (Debian/Ubuntu)
|
||||||
|
apt:
|
||||||
|
name:
|
||||||
|
- curl
|
||||||
|
- jq
|
||||||
|
- ca-certificates
|
||||||
|
- iproute2
|
||||||
|
- iputils-ping
|
||||||
|
- procps
|
||||||
|
- net-tools
|
||||||
|
- vim
|
||||||
|
- wget
|
||||||
|
- unzip
|
||||||
|
- git
|
||||||
|
- sudo
|
||||||
|
state: present
|
||||||
|
update_cache: false
|
||||||
|
when: ansible_os_family == 'Debian'
|
||||||
|
no_log: true
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- tools
|
||||||
|
|
||||||
|
- name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
|
||||||
|
yum:
|
||||||
|
name:
|
||||||
|
- curl
|
||||||
|
- jq
|
||||||
|
- ca-certificates
|
||||||
|
- iproute
|
||||||
|
- iputils
|
||||||
|
- procps-ng
|
||||||
|
- net-tools
|
||||||
|
- vim
|
||||||
|
- wget
|
||||||
|
- unzip
|
||||||
|
- git
|
||||||
|
- sudo
|
||||||
|
state: present
|
||||||
|
when: ansible_os_family == 'RedHat'
|
||||||
|
no_log: true
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- tools
|
||||||
|
|
||||||
|
- name: Install common tools (Alt Linux)
|
||||||
|
command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git sudo
|
||||||
|
when: ansible_os_family == 'Altlinux'
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
no_log: true
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- tools
|
||||||
|
|
||||||
|
- name: Install common tools (Astra Linux)
|
||||||
|
command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git sudo
|
||||||
|
when: ansible_os_family == 'Astra Linux'
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
no_log: true
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- tools
|
||||||
|
|
||||||
|
# Установка Python для Ansible (если не установлен)
|
||||||
|
- name: Install Python (Debian/Ubuntu)
|
||||||
|
apt:
|
||||||
|
name:
|
||||||
|
- python3
|
||||||
|
- python3-pip
|
||||||
|
- python3-venv
|
||||||
|
state: present
|
||||||
|
when: ansible_os_family == 'Debian'
|
||||||
|
no_log: true
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- python
|
||||||
|
|
||||||
|
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
|
||||||
|
yum:
|
||||||
|
name:
|
||||||
|
- python3
|
||||||
|
- python3-pip
|
||||||
|
state: present
|
||||||
|
when: ansible_os_family == 'RedHat'
|
||||||
|
no_log: true
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- python
|
||||||
|
|
||||||
|
- name: Install Python (Alt Linux)
|
||||||
|
command: apt-get install -y python3 python3-pip
|
||||||
|
when: ansible_os_family == 'Altlinux'
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
no_log: true
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- python
|
||||||
|
|
||||||
|
- name: Install Python (Astra Linux)
|
||||||
|
command: apt-get install -y python3 python3-pip
|
||||||
|
when: ansible_os_family == 'Astra Linux'
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
no_log: true
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- python
|
||||||
@@ -188,8 +188,8 @@
|
|||||||
delay: 5
|
delay: 5
|
||||||
until: container_info.container.State.Running | default(false)
|
until: container_info.container.State.Running | default(false)
|
||||||
|
|
||||||
# Примечание: Установка пакетов и создание директорий перенесены в run.yml
|
# Примечание: Установка пакетов и создание директорий перенесены в converge.yml
|
||||||
# для выполнения на всех поднятых контейнерах
|
# (в секцию для hosts: all) для выполнения на всех поднятых контейнерах
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# DIND NODES - Создание контейнеров Docker-in-Docker
|
# DIND NODES - Создание контейнеров Docker-in-Docker
|
||||||
|
|||||||
@@ -18,10 +18,6 @@
|
|||||||
groups: [test]
|
groups: [test]
|
||||||
kind_clusters: []
|
kind_clusters: []
|
||||||
|
|
||||||
# перечисли файлы/глобы, которые нужно временно расшифровать
|
|
||||||
vault_targets:
|
|
||||||
- /workspace/vault/secrets.yml
|
|
||||||
- /workspace/vault/secret.yml
|
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -41,62 +37,6 @@
|
|||||||
when: preset_file is file
|
when: preset_file is file
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# VAULT CLEANUP - Перешифровка файлов перед удалением контейнеров
|
|
||||||
# =============================================================================
|
|
||||||
- name: Vault cleanup operations
|
|
||||||
debug:
|
|
||||||
msg: |
|
|
||||||
================================================================================
|
|
||||||
VAULT CLEANUP - Перешифровка файлов перед удалением контейнеров
|
|
||||||
================================================================================
|
|
||||||
Re-encrypting vault files
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
- name: Re-encrypt all vault files
|
|
||||||
community.docker.docker_container_exec:
|
|
||||||
container: ansible-controller
|
|
||||||
command: |
|
|
||||||
bash -c '
|
|
||||||
VAULT_TARGETS_JSON="{{ vault_targets | to_json }}"
|
|
||||||
VAULT_PASSWORD_FILE="/workspace/vault/.vault"
|
|
||||||
|
|
||||||
echo "=== RE-ENCRYPTING ALL VAULT FILES ==="
|
|
||||||
|
|
||||||
if [ ! -f "$VAULT_PASSWORD_FILE" ]; then
|
|
||||||
echo "Vault password file not found: $VAULT_PASSWORD_FILE"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Парсим JSON массив и перешифровываем каждый файл
|
|
||||||
echo "$VAULT_TARGETS_JSON" | jq -r ".[]" | while read -r target; do
|
|
||||||
echo "Processing target: $target"
|
|
||||||
|
|
||||||
# Если это glob паттерн, находим файлы
|
|
||||||
if [[ "$target" == *"*"* ]]; then
|
|
||||||
for file in $target; do
|
|
||||||
if [ -f "$file" ] && ! grep -q "ANSIBLE_VAULT" "$file"; then
|
|
||||||
echo "Re-encrypting file: $file"
|
|
||||||
ansible-vault encrypt --encrypt-vault-id default --vault-password-file "$VAULT_PASSWORD_FILE" "$file"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
# Обычный файл
|
|
||||||
if [ -f "$target" ] && ! grep -q "ANSIBLE_VAULT" "$target"; then
|
|
||||||
echo "Re-encrypting file: $target"
|
|
||||||
ansible-vault encrypt --encrypt-vault-id default --vault-password-file "$VAULT_PASSWORD_FILE" "$target"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "All vault files re-encrypted successfully"
|
|
||||||
|
|
||||||
# Очистка символических ссылок в vault/
|
|
||||||
echo "Cleaning up vault symlinks..."
|
|
||||||
rm -f /workspace/vault/*.decrypted
|
|
||||||
echo "Vault symlinks cleaned up"
|
|
||||||
'
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# УДАЛЕНИЕ КОНТЕЙНЕРОВ - Остановка и удаление контейнеров
|
# УДАЛЕНИЕ КОНТЕЙНЕРОВ - Остановка и удаление контейнеров
|
||||||
@@ -176,17 +116,6 @@
|
|||||||
vars:
|
vars:
|
||||||
# Используем переменную hosts из загруженного пресета
|
# Используем переменную hosts из загруженного пресета
|
||||||
hosts: "{{ hosts }}"
|
hosts: "{{ hosts }}"
|
||||||
# =============================================================================
|
|
||||||
# ДОПОЛНИТЕЛЬНАЯ ОЧИСТКА - Удаление симлинков vault
|
|
||||||
# =============================================================================
|
|
||||||
- name: Clean up vault symlinks
|
|
||||||
file:
|
|
||||||
path: "{{ item }}"
|
|
||||||
state: absent
|
|
||||||
loop:
|
|
||||||
- /workspace/vault/secrets.yml.decrypted
|
|
||||||
- /workspace/vault/secret.yml.decrypted
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Display cleanup summary
|
- name: Display cleanup summary
|
||||||
debug:
|
debug:
|
||||||
|
|||||||
@@ -1,248 +0,0 @@
|
|||||||
---
|
|
||||||
# =============================================================================
|
|
||||||
# SITE - Основной playbook для тестирования Ansible ролей
|
|
||||||
# =============================================================================
|
|
||||||
# Универсальный playbook для тестирования Ansible ролей
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
#
|
|
||||||
# Этот файл отвечает за:
|
|
||||||
# 1. Обновление пакетов в контейнерах при запуске тестов
|
|
||||||
# 2. Установку common tools для корректной работы тестов
|
|
||||||
# 3. Подготовку окружения для тестирования ролей
|
|
||||||
# 4. Запуск всех ролей из директории roles/
|
|
||||||
|
|
||||||
- name: Подготовка окружения для тестирования
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
tasks:
|
|
||||||
# Сброс цветовых кодов ANSI для корректного отображения
|
|
||||||
- name: Reset ANSI color codes
|
|
||||||
debug:
|
|
||||||
msg: "\033[0m"
|
|
||||||
changed_when: false
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- color-reset
|
|
||||||
|
|
||||||
# Отладочная информация о vault переменных (передаются из converge.yml)
|
|
||||||
- name: Проверка vault переменных
|
|
||||||
debug:
|
|
||||||
msg: |
|
|
||||||
Vault переменные на {{ ansible_hostname }}:
|
|
||||||
- vault_devops_password: {{ vault_devops_password | default('НЕ ОПРЕДЕЛЕНА') | length }} символов
|
|
||||||
- vault_devops_ssh_public_key: {{ vault_devops_ssh_public_key | default('НЕ ОПРЕДЕЛЕНА') | length }} символов
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- vault
|
|
||||||
- debug
|
|
||||||
# Создание tmp директории для Ansible
|
|
||||||
- name: Create Ansible tmp directory
|
|
||||||
file:
|
|
||||||
path: /tmp/.ansible-tmp
|
|
||||||
state: directory
|
|
||||||
mode: '0755'
|
|
||||||
owner: root
|
|
||||||
group: root
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- tmp
|
|
||||||
|
|
||||||
# Создание vault директории
|
|
||||||
- name: Create vault directory
|
|
||||||
file:
|
|
||||||
path: /workspace/vault
|
|
||||||
state: directory
|
|
||||||
mode: '0755'
|
|
||||||
owner: root
|
|
||||||
group: root
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- vault
|
|
||||||
# Обновление кеша пакетов для Debian/Ubuntu
|
|
||||||
- name: Update package cache (Debian/Ubuntu)
|
|
||||||
apt:
|
|
||||||
update_cache: true
|
|
||||||
cache_valid_time: 3600
|
|
||||||
when: ansible_os_family == 'Debian'
|
|
||||||
changed_when: false
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- update
|
|
||||||
|
|
||||||
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
|
|
||||||
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
|
|
||||||
yum:
|
|
||||||
update_cache: true
|
|
||||||
when: ansible_os_family == 'RedHat'
|
|
||||||
changed_when: false
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- update
|
|
||||||
|
|
||||||
# Обновление кеша пакетов для Alt Linux
|
|
||||||
- name: Update package cache (Alt Linux)
|
|
||||||
command: apt-get update
|
|
||||||
when: ansible_os_family == 'Altlinux'
|
|
||||||
changed_when: false
|
|
||||||
failed_when: false
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- update
|
|
||||||
|
|
||||||
# Обновление кеша пакетов для Astra Linux
|
|
||||||
- name: Update package cache (Astra Linux)
|
|
||||||
command: apt-get update
|
|
||||||
when: ansible_os_family == 'Astra Linux'
|
|
||||||
changed_when: false
|
|
||||||
failed_when: false
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- update
|
|
||||||
|
|
||||||
# Установка common tools для всех ОС
|
|
||||||
- name: Install common tools (Debian/Ubuntu)
|
|
||||||
apt:
|
|
||||||
name:
|
|
||||||
- curl
|
|
||||||
- jq
|
|
||||||
- ca-certificates
|
|
||||||
- iproute2
|
|
||||||
- iputils-ping
|
|
||||||
- procps
|
|
||||||
- net-tools
|
|
||||||
- vim
|
|
||||||
- wget
|
|
||||||
- unzip
|
|
||||||
- git
|
|
||||||
- sudo
|
|
||||||
state: present
|
|
||||||
update_cache: false
|
|
||||||
when: ansible_os_family == 'Debian'
|
|
||||||
no_log: true
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- tools
|
|
||||||
|
|
||||||
- name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
|
|
||||||
yum:
|
|
||||||
name:
|
|
||||||
- curl
|
|
||||||
- jq
|
|
||||||
- ca-certificates
|
|
||||||
- iproute
|
|
||||||
- iputils
|
|
||||||
- procps-ng
|
|
||||||
- net-tools
|
|
||||||
- vim
|
|
||||||
- wget
|
|
||||||
- unzip
|
|
||||||
- git
|
|
||||||
- sudo
|
|
||||||
state: present
|
|
||||||
when: ansible_os_family == 'RedHat'
|
|
||||||
no_log: true
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- tools
|
|
||||||
|
|
||||||
- name: Install common tools (Alt Linux)
|
|
||||||
command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git sudo
|
|
||||||
when: ansible_os_family == 'Altlinux'
|
|
||||||
changed_when: false
|
|
||||||
failed_when: false
|
|
||||||
no_log: true
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- tools
|
|
||||||
|
|
||||||
- name: Install common tools (Astra Linux)
|
|
||||||
command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git sudo
|
|
||||||
when: ansible_os_family == 'Astra Linux'
|
|
||||||
changed_when: false
|
|
||||||
failed_when: false
|
|
||||||
no_log: true
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- tools
|
|
||||||
|
|
||||||
# Установка Python для Ansible (если не установлен)
|
|
||||||
- name: Install Python (Debian/Ubuntu)
|
|
||||||
apt:
|
|
||||||
name:
|
|
||||||
- python3
|
|
||||||
- python3-pip
|
|
||||||
- python3-venv
|
|
||||||
state: present
|
|
||||||
when: ansible_os_family == 'Debian'
|
|
||||||
no_log: true
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- python
|
|
||||||
|
|
||||||
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
|
|
||||||
yum:
|
|
||||||
name:
|
|
||||||
- python3
|
|
||||||
- python3-pip
|
|
||||||
state: present
|
|
||||||
when: ansible_os_family == 'RedHat'
|
|
||||||
no_log: true
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- python
|
|
||||||
|
|
||||||
- name: Install Python (Alt Linux)
|
|
||||||
command: apt-get install -y python3 python3-pip
|
|
||||||
when: ansible_os_family == 'Altlinux'
|
|
||||||
changed_when: false
|
|
||||||
failed_when: false
|
|
||||||
no_log: true
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- python
|
|
||||||
|
|
||||||
- name: Install Python (Astra Linux)
|
|
||||||
command: apt-get install -y python3 python3-pip
|
|
||||||
when: ansible_os_family == 'Astra Linux'
|
|
||||||
changed_when: false
|
|
||||||
failed_when: false
|
|
||||||
no_log: true
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- python
|
|
||||||
|
|
||||||
# Создание пользователя для тестирования (ЗАКОММЕНТИРОВАНО)
|
|
||||||
# - name: Create test user
|
|
||||||
# user:
|
|
||||||
# name: testuser
|
|
||||||
# shell: /bin/bash
|
|
||||||
# create_home: yes
|
|
||||||
# state: present
|
|
||||||
# tags:
|
|
||||||
# - setup
|
|
||||||
# - user
|
|
||||||
|
|
||||||
# Настройка sudo для тестового пользователя (ЗАКОММЕНТИРОВАНО)
|
|
||||||
# - name: Configure sudo for test user
|
|
||||||
# lineinfile:
|
|
||||||
# path: /etc/sudoers
|
|
||||||
# line: "testuser ALL=(ALL) NOPASSWD:ALL"
|
|
||||||
# state: present
|
|
||||||
# validate: 'visudo -cf %s'
|
|
||||||
# tags:
|
|
||||||
# - setup
|
|
||||||
# - sudo
|
|
||||||
|
|
||||||
# Создание директории для тестов (ЗАКОММЕНТИРОВАНО)
|
|
||||||
# - name: Create test directory
|
|
||||||
# file:
|
|
||||||
# path: /tmp/ansible-test
|
|
||||||
# state: directory
|
|
||||||
# mode: '0755'
|
|
||||||
# owner: testuser
|
|
||||||
# group: testuser
|
|
||||||
# tags:
|
|
||||||
# - setup
|
|
||||||
# - directory
|
|
||||||
|
|
||||||
@@ -3,33 +3,18 @@
|
|||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
- name: Развертывание всех ролей
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
tasks:
|
|
||||||
# Сброс цветовых кодов ANSI для корректного отображения
|
|
||||||
- name: Reset ANSI color codes
|
|
||||||
debug:
|
|
||||||
msg: "\033[0m"
|
|
||||||
changed_when: false
|
|
||||||
tags:
|
|
||||||
- color-reset
|
|
||||||
|
|
||||||
- name: Установка роли devops
|
- name: Установка роли devops
|
||||||
hosts: all
|
hosts: all
|
||||||
become: true
|
become: true
|
||||||
roles:
|
roles:
|
||||||
- devops
|
- devops
|
||||||
|
- name: Установка роли docker
|
||||||
#- name: Установка роли python
|
hosts: all
|
||||||
# hosts: all
|
become: true
|
||||||
# become: true
|
roles:
|
||||||
# roles:
|
- docker
|
||||||
# - python
|
- name: Установка роли python
|
||||||
|
hosts: all
|
||||||
#- name: Установка роли docker
|
become: true
|
||||||
# hosts: all
|
roles:
|
||||||
# become: true
|
- python
|
||||||
# roles:
|
|
||||||
# - docker
|
|
||||||
|
|
||||||
|
|||||||
@@ -149,16 +149,16 @@
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Только создание пользователя и группы
|
# Только создание пользователя и группы
|
||||||
ansible-playbook -i inventory run.yml --tags "user,group"
|
ansible-playbook -i inventory converge.yml --tags "user,group"
|
||||||
|
|
||||||
# Только настройка SSH
|
# Только настройка SSH
|
||||||
ansible-playbook -i inventory run.yml --tags "ssh,keys"
|
ansible-playbook -i inventory converge.yml --tags "ssh,keys"
|
||||||
|
|
||||||
# Только настройка sudo
|
# Только настройка sudo
|
||||||
ansible-playbook -i inventory run.yml --tags "sudo,permissions"
|
ansible-playbook -i inventory converge.yml --tags "sudo,permissions"
|
||||||
|
|
||||||
# Пропустить проверки
|
# Пропустить проверки
|
||||||
ansible-playbook -i inventory run.yml --skip-tags "verification"
|
ansible-playbook -i inventory converge.yml --skip-tags "verification"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Обработчики
|
## Обработчики
|
||||||
|
|||||||
@@ -15,16 +15,13 @@
|
|||||||
- name: "Проверка наличия пароля пользователя devops"
|
- name: "Проверка наличия пароля пользователя devops"
|
||||||
fail:
|
fail:
|
||||||
msg: |
|
msg: |
|
||||||
❌ ОШИБКА: Пароль пользователя devops не найден в vault/secrets.yml!
|
❌ ОШИБКА: Пароль пользователя devops не определён.
|
||||||
|
|
||||||
Для корректной работы роли необходимо установить переменную vault_devops_password в файле vault/secrets.yml.
|
Ожидаемая переменная: vault_devops_password
|
||||||
|
Где задавать: roles/devops/vars/main.yml (или переопределить на уровне инвентаря/группы/хоста)
|
||||||
Пример содержимого vault/secrets.yml:
|
|
||||||
|
Пример в roles/devops/vars/main.yml:
|
||||||
vault_devops_password: "ваш_пароль_здесь"
|
vault_devops_password: "ваш_пароль_здесь"
|
||||||
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@devops.org.ru"
|
|
||||||
|
|
||||||
Для шифрования файла используйте:
|
|
||||||
ansible-vault encrypt vault/secrets.yml
|
|
||||||
when:
|
when:
|
||||||
- vault_devops_password is not defined
|
- vault_devops_password is not defined
|
||||||
- vault_devops_password == ""
|
- vault_devops_password == ""
|
||||||
@@ -33,16 +30,14 @@
|
|||||||
- name: "Проверка наличия SSH публичного ключа"
|
- name: "Проверка наличия SSH публичного ключа"
|
||||||
fail:
|
fail:
|
||||||
msg: |
|
msg: |
|
||||||
❌ ОШИБКА: SSH публичный ключ не найден в vault/secrets.yml!
|
❌ ОШИБКА: SSH публичный ключ не определён.
|
||||||
|
|
||||||
Для корректной работы роли необходимо установить переменную vault_devops_ssh_public_key в файле vault/secrets.yml.
|
Ожидаемая переменная: vault_devops_ssh_public_key
|
||||||
|
Где задавать: roles/devops/vars/main.yml (или переопределить на уровне инвентаря/группы/хоста)
|
||||||
Пример содержимого vault/secrets.yml:
|
|
||||||
vault_devops_password: "ваш_пароль_здесь"
|
Пример в roles/devops/vars/main.yml:
|
||||||
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@devops.org.ru"
|
vault_devops_ssh_public_key: |
|
||||||
|
ssh-rsa AAAAB3... user@host
|
||||||
Для шифрования файла используйте:
|
|
||||||
ansible-vault encrypt vault/secrets.yml
|
|
||||||
when:
|
when:
|
||||||
- vault_devops_ssh_public_key is not defined
|
- vault_devops_ssh_public_key is not defined
|
||||||
- vault_devops_ssh_public_key == ""
|
- vault_devops_ssh_public_key == ""
|
||||||
@@ -51,7 +46,7 @@
|
|||||||
- name: "✅ Проверка успешна - все необходимые секреты найдены"
|
- name: "✅ Проверка успешна - все необходимые секреты найдены"
|
||||||
debug:
|
debug:
|
||||||
msg: |
|
msg: |
|
||||||
✅ Все необходимые секреты найдены в vault/secrets.yml:
|
✅ Все необходимые секреты найдены в переменных роли (vars/main.yml или инвентарь):
|
||||||
- Пароль пользователя: {{ 'установлен' if vault_devops_password is defined and vault_devops_password != '' else 'НЕ УСТАНОВЛЕН' }}
|
- Пароль пользователя: {{ 'установлен' if vault_devops_password is defined and vault_devops_password != '' else 'НЕ УСТАНОВЛЕН' }}
|
||||||
- SSH публичный ключ: {{ 'установлен' if vault_devops_ssh_public_key is defined and vault_devops_ssh_public_key != '' else 'НЕ УСТАНОВЛЕН' }}
|
- SSH публичный ключ: {{ 'установлен' if vault_devops_ssh_public_key is defined and vault_devops_ssh_public_key != '' else 'НЕ УСТАНОВЛЕН' }}
|
||||||
when:
|
when:
|
||||||
|
|||||||
@@ -250,3 +250,13 @@ devops_notification_config:
|
|||||||
failure_message: "Ошибка при настройке пользователя {{ devops_user }}"
|
failure_message: "Ошибка при настройке пользователя {{ devops_user }}"
|
||||||
ssh_message: "SSH ключ для пользователя {{ devops_user }} настроен"
|
ssh_message: "SSH ключ для пользователя {{ devops_user }} настроен"
|
||||||
sudo_message: "Sudo права для пользователя {{ devops_user }} настроены"
|
sudo_message: "Sudo права для пользователя {{ devops_user }} настроены"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# СЕКРЕТНЫЕ ПЕРЕМЕННЫЕ
|
||||||
|
# =============================================================================
|
||||||
|
# Пароль для пользователя devops
|
||||||
|
vault_devops_password: "123123"
|
||||||
|
|
||||||
|
# SSH публичный ключ для пользователя devops
|
||||||
|
vault_devops_ssh_public_key: |
|
||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDBjzRt/b5Xe/tgQS2rvOBXOSBq1hychcnbz6G4m9Ps6hQXCxLA0hcrzPIRGazeWEslqsBynSm4fVJC6zAnExEd7KsNxS5gsMxmcHsghuU6/IA62tP8w8tXKEWaCGMQyfcUO/MIrdEjAg8txl3FIxdlcYwBTLW9nJggOmUn9w1YOA6ECNBDUbTwZC62yomJhQoAK0W+uVkKSLTqRIvd0oZJEF+0dtzBrhhe7cjR6fuoLpkB1/Q9bQImVfAxEiiExhFWFMxcyf4SGxpmsbKI4rJ3eBvsMmhrX76p1bYX4fKGiBaqNyXqThYWYybXfDfaITQR87SIrVt4U4NzS79ZFfQ142VPs+YISiy/+/VKZ1NjHo1fRZJSqBtsWJCsvtuM6C2+dRZ0JqwwMlHKLNhmerYMLJMQxkxdB5jRxafC+3T0aFNIsFIa7MdC8i3WQBk5z5huY5pslkPWnmKTfCi3gLjWNhfW9xEgKAww6hGrZR/zlQXZQrmQ2LGspzXFngd9tmk= linux@key
|
||||||
|
|||||||
0
roles/docker/vars/main.yml
Normal file
0
roles/docker/vars/main.yml
Normal file
@@ -12,195 +12,6 @@ ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tas
|
|||||||
|
|
||||||
echo "📋 Найденные роли: $ROLES"
|
echo "📋 Найденные роли: $ROLES"
|
||||||
|
|
||||||
# Обновляем molecule/default/run.yml (только если файл не существует)
|
|
||||||
if [ ! -f "molecule/default/run.yml" ]; then
|
|
||||||
echo "📝 Создание molecule/default/run.yml..."
|
|
||||||
cat > molecule/default/run.yml << 'EOF'
|
|
||||||
---
|
|
||||||
# Универсальный playbook для тестирования Ansible ролей
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
#
|
|
||||||
# Этот файл отвечает за:
|
|
||||||
# 1. Обновление пакетов в контейнерах при запуске тестов
|
|
||||||
# 2. Установку common tools для корректной работы тестов
|
|
||||||
# 3. Подготовку окружения для тестирования ролей
|
|
||||||
# 4. Импорт roles/deploy.yml для запуска ролей
|
|
||||||
|
|
||||||
- name: Подготовка окружения для тестирования
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
tasks:
|
|
||||||
# Обновление кеша пакетов для Debian/Ubuntu
|
|
||||||
- name: Update package cache (Debian/Ubuntu)
|
|
||||||
apt:
|
|
||||||
update_cache: true
|
|
||||||
cache_valid_time: 3600
|
|
||||||
when: ansible_os_family == 'Debian'
|
|
||||||
changed_when: false
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- update
|
|
||||||
|
|
||||||
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
|
|
||||||
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
|
|
||||||
yum:
|
|
||||||
update_cache: true
|
|
||||||
when: ansible_os_family == 'RedHat'
|
|
||||||
changed_when: false
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- update
|
|
||||||
|
|
||||||
# Обновление кеша пакетов для Alt Linux
|
|
||||||
- name: Update package cache (Alt Linux)
|
|
||||||
apt:
|
|
||||||
update_cache: true
|
|
||||||
when: ansible_distribution == 'Alt'
|
|
||||||
changed_when: false
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- update
|
|
||||||
|
|
||||||
# Установка common tools для всех ОС
|
|
||||||
- name: Install common tools (Debian/Ubuntu)
|
|
||||||
apt:
|
|
||||||
name:
|
|
||||||
- curl
|
|
||||||
- jq
|
|
||||||
- ca-certificates
|
|
||||||
- iproute2
|
|
||||||
- iputils-ping
|
|
||||||
- procps
|
|
||||||
- net-tools
|
|
||||||
- sudo
|
|
||||||
- vim
|
|
||||||
- wget
|
|
||||||
- unzip
|
|
||||||
- git
|
|
||||||
state: present
|
|
||||||
update_cache: false
|
|
||||||
when: ansible_os_family == 'Debian'
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- tools
|
|
||||||
|
|
||||||
- name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
|
|
||||||
yum:
|
|
||||||
name:
|
|
||||||
- curl
|
|
||||||
- jq
|
|
||||||
- ca-certificates
|
|
||||||
- iproute
|
|
||||||
- iputils
|
|
||||||
- procps-ng
|
|
||||||
- net-tools
|
|
||||||
- sudo
|
|
||||||
- vim
|
|
||||||
- wget
|
|
||||||
- unzip
|
|
||||||
- git
|
|
||||||
state: present
|
|
||||||
when: ansible_os_family == 'RedHat'
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- tools
|
|
||||||
|
|
||||||
- name: Install common tools (Alt Linux)
|
|
||||||
apt:
|
|
||||||
name:
|
|
||||||
- curl
|
|
||||||
- jq
|
|
||||||
- ca-certificates
|
|
||||||
- iproute2
|
|
||||||
- iputils
|
|
||||||
- procps
|
|
||||||
- net-tools
|
|
||||||
- sudo
|
|
||||||
- vim
|
|
||||||
- wget
|
|
||||||
- unzip
|
|
||||||
- git
|
|
||||||
state: present
|
|
||||||
when: ansible_distribution == 'Alt'
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- tools
|
|
||||||
|
|
||||||
# Установка Python для Ansible (если не установлен)
|
|
||||||
- name: Install Python (Debian/Ubuntu)
|
|
||||||
apt:
|
|
||||||
name:
|
|
||||||
- python3
|
|
||||||
- python3-pip
|
|
||||||
- python3-venv
|
|
||||||
state: present
|
|
||||||
when: ansible_os_family == 'Debian'
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- python
|
|
||||||
|
|
||||||
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
|
|
||||||
yum:
|
|
||||||
name:
|
|
||||||
- python3
|
|
||||||
- python3-pip
|
|
||||||
state: present
|
|
||||||
when: ansible_os_family == 'RedHat'
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- python
|
|
||||||
|
|
||||||
- name: Install Python (Alt Linux)
|
|
||||||
apt:
|
|
||||||
name:
|
|
||||||
- python3
|
|
||||||
- python3-pip
|
|
||||||
state: present
|
|
||||||
when: ansible_distribution == 'Alt'
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- python
|
|
||||||
|
|
||||||
# Создание пользователя для тестирования
|
|
||||||
- name: Create test user
|
|
||||||
user:
|
|
||||||
name: testuser
|
|
||||||
shell: /bin/bash
|
|
||||||
create_home: yes
|
|
||||||
state: present
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- user
|
|
||||||
|
|
||||||
# Настройка sudo для тестового пользователя
|
|
||||||
- name: Configure sudo for test user
|
|
||||||
lineinfile:
|
|
||||||
path: /etc/sudoers
|
|
||||||
line: "testuser ALL=(ALL) NOPASSWD:ALL"
|
|
||||||
state: present
|
|
||||||
validate: 'visudo -cf %s'
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- sudo
|
|
||||||
|
|
||||||
# Создание директории для тестов
|
|
||||||
- name: Create test directory
|
|
||||||
file:
|
|
||||||
path: /tmp/ansible-test
|
|
||||||
state: directory
|
|
||||||
mode: '0755'
|
|
||||||
owner: testuser
|
|
||||||
group: testuser
|
|
||||||
tags:
|
|
||||||
- setup
|
|
||||||
- directory
|
|
||||||
|
|
||||||
- import_playbook: ../../roles/deploy.yml
|
|
||||||
EOF
|
|
||||||
else
|
|
||||||
echo "📝 Файл molecule/default/run.yml уже существует, пропускаем создание"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Обновляем roles/deploy.yml
|
# Обновляем roles/deploy.yml
|
||||||
echo "📝 Обновление roles/deploy.yml..."
|
echo "📝 Обновление roles/deploy.yml..."
|
||||||
@@ -210,13 +21,17 @@ cat > roles/deploy.yml << EOF
|
|||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
- name: Развертывание всех ролей
|
|
||||||
hosts: all
|
|
||||||
roles:
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Добавляем каждую роль как отдельный playbook блок
|
||||||
for role in $ROLES; do
|
for role in $ROLES; do
|
||||||
echo " - $role" >> roles/deploy.yml
|
cat >> roles/deploy.yml << EOF
|
||||||
|
- name: Установка роли $role
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- $role
|
||||||
|
EOF
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "✅ Playbook'и обновлены"
|
echo "✅ Playbook'и обновлены"
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
$ANSIBLE_VAULT;1.1;AES256
|
|
||||||
35646637393562393632386237323463396437383465313133653161646465393066623139613931
|
|
||||||
3731306562663437326132393337313232373935613636320a393162333031623336383230353934
|
|
||||||
33323166643666323037353261663264663665333062306138346234353839383439323964643137
|
|
||||||
3762616565326465330a663932393563656532316430356266303761333230626133333363336234
|
|
||||||
63373562326330373737373265613438653135393039303665333236303533643365356464306436
|
|
||||||
38376531313765336266353037666665623535313162353061366463643964343966333035646236
|
|
||||||
64363833326266376162306132363330396565306264316233663665376630643563333234346433
|
|
||||||
39663735303837383339613732333865633333373465656164623235313938373039643636636537
|
|
||||||
35356164313534323662333062383536323961313837353632663666346537633530326566373632
|
|
||||||
35346266336536396363303262326362346436336564613635376566643235373638373636383164
|
|
||||||
64396137383231363637653235333066366462666335316433363363656337353632333665313866
|
|
||||||
38313837356538633465653539316563393965373163323166633737623963666531323532303037
|
|
||||||
39336330363338623134326163313034656265623539656565316361656437653463366165373137
|
|
||||||
32383735323430313531663139613165303865633435373664633866656631353763613338303934
|
|
||||||
34613461663665643965303833636131346462613236616162393861633465313866363831313332
|
|
||||||
65336335663735666634396135383038343436336138636137313135383961306461323831366233
|
|
||||||
66643766316339626639623036623835336361336231646161616437643733363636656433633130
|
|
||||||
32306537366462633030313036333331613066376235613835636236636564663164346263376161
|
|
||||||
39343837613134663537373461323239616236656633613637396261386335613437396164653664
|
|
||||||
38346564646432396634343430636664346435396138326236613133323930613531643730396231
|
|
||||||
34386166303031303239356565323566376565653139393265656463356631303831306136333865
|
|
||||||
36623732643463303264653735636664663130373233336162633533653338343735313932626562
|
|
||||||
64366233346237313230636263666561636462636139656461333432333036653036666132623932
|
|
||||||
65623033636333336533623437396539383932633438346132633339363532323536316338626339
|
|
||||||
38326237306661666637613064613435613931383265653761303734663832616434336430393535
|
|
||||||
33663335343937633135326530386164316631626162353138323132376538383437353862363137
|
|
||||||
38393638643066643335396566633239373338373531646334323831653832326532323464653834
|
|
||||||
39666264623033356635646433343631366335643764323465323737396262323932623634613635
|
|
||||||
65316536356662306533663839623133383263363630373766666464663063323035323834636539
|
|
||||||
63666137313935373366326565393830353837396463363330383534373331363539386463316266
|
|
||||||
35363734353262313366376530303231306133623465373133616139613031363230333432343265
|
|
||||||
38313637303336343238376466383737646135653964346564363432666462373665383662656534
|
|
||||||
34333234346133356430306232313430613739663464656336623739333330353961393866326634
|
|
||||||
62623633343439366133643534393237616138383235656237343836646464303130633637663430
|
|
||||||
33356631633363363535663139323330633533353465323234323238386132643032626664326431
|
|
||||||
34663862363830393465333662376563373932356363303432383461653464366633623538346263
|
|
||||||
32393431333931333963343363653935333662326632373463356566316537383739363064343862
|
|
||||||
37633466656364376332336434633266346465656261303736363864366237663535313566313334
|
|
||||||
34313734303137323163636636386238306335323561653166393335316563326661646566353662
|
|
||||||
39383861643264363366393434633236613564353232393631393266386463613433376561383763
|
|
||||||
30303262666630663138306237613939356138613330613431386236646338366434346330363736
|
|
||||||
62386535376164326566346365313133616265643035643861613635333730613438636430393565
|
|
||||||
66643864653634303139353434336564376562613933346138393534646532663763633363626535
|
|
||||||
38336532303338656134363665323030623064626261376237626265656332343036336638313733
|
|
||||||
35386438383561393636383536326262343931343530366339613332323066386366616165303033
|
|
||||||
64306139616432323837623466393738323865306135393064626665326139626439313332636132
|
|
||||||
63616664613732366338656236313439326336633930303133333330313761633132326362616537
|
|
||||||
62666634343937613136633962383331666361353036663839633733623533623466383432313462
|
|
||||||
34393733636432343365363862393663653163353534633136333661363363313139393330373930
|
|
||||||
6163336530313937363666636633313066333931336138643164
|
|
||||||
Reference in New Issue
Block a user