Обновление проекта
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
|
||||
266
Makefile
266
Makefile
@@ -50,6 +50,7 @@ BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.re
|
||||
role:
|
||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||
lint) \
|
||||
$(MAKE) decrypt; \
|
||||
ROLE_NAME="$(word 3, $(MAKECMDGOALS))"; \
|
||||
if [ -z "$$ROLE_NAME" ]; then \
|
||||
echo "🔍 Проверка синтаксиса всех ролей ..."; \
|
||||
@@ -65,6 +66,7 @@ role:
|
||||
exit 1; \
|
||||
fi; \
|
||||
fi; \
|
||||
$(MAKE) encrypt-all; \
|
||||
echo ""; \
|
||||
echo "✅ Lint завершен";; \
|
||||
test) \
|
||||
@@ -82,6 +84,7 @@ role:
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo ""; \
|
||||
$(MAKE) decrypt; \
|
||||
echo "🔧 Запуск ansible-controller контейнера..."; \
|
||||
docker run --rm --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
@@ -103,15 +106,16 @@ role:
|
||||
echo '=== ПРОВЕРКА ПОДКЛЮЧЕНИЯ К КОНТЕЙНЕРАМ ==='; \
|
||||
ansible all -i /tmp/molecule_workspace/inventory/hosts.ini -m ping && \
|
||||
echo ''; \
|
||||
echo '=== ЗАПУСК RUN.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" && \
|
||||
echo '=== ЗАПУСК CONVERGE.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ==='; \
|
||||
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini converge.yml && \
|
||||
echo ''; \
|
||||
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 '=== ОЧИСТКА РЕСУРСОВ ==='; \
|
||||
ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && \
|
||||
echo '✅ Тестирование завершено'";; \
|
||||
echo '✅ Тестирование завершено'"; \
|
||||
$(MAKE) encrypt-all;; \
|
||||
deploy) \
|
||||
echo "🚀 Развертывание ролей на реальные серверы..."; \
|
||||
echo ""; \
|
||||
@@ -120,6 +124,7 @@ role:
|
||||
echo "💡 Создайте файл inventory/hosts.ini с вашими серверами"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
$(MAKE) decrypt; \
|
||||
echo "📋 Используется inventory: inventory/hosts.ini"; \
|
||||
echo "📄 Содержимое inventory:"; \
|
||||
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"; \
|
||||
else \
|
||||
echo "❌ Развертывание отменено"; \
|
||||
fi;; \
|
||||
fi; \
|
||||
$(MAKE) encrypt-all;; \
|
||||
list) \
|
||||
./scripts/role-manager.sh list;; \
|
||||
create) \
|
||||
@@ -275,66 +281,59 @@ vault:
|
||||
else \
|
||||
echo "✅ Файл vault/.vault уже существует"; \
|
||||
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) \
|
||||
echo "🔐 Редактирование секретов..."; \
|
||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
||||
echo ""; \
|
||||
read -p "Введите имя файла (без .yml): " FILE; \
|
||||
echo "🔐 Редактирование vars/main.yml выбранной роли..."; \
|
||||
echo "📋 Доступные роли:"; \
|
||||
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||
read -p "Введите имя роли: " ROLE; \
|
||||
FILE="roles/$$ROLE/vars/main.yml"; \
|
||||
if [ ! -f "$$FILE" ]; then echo "❌ Файл $$FILE не найден"; exit 1; fi; \
|
||||
$(MAKE) decrypt-role ROLE=$$ROLE; \
|
||||
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;; \
|
||||
bash -c 'exec ${EDITOR:-nano} "$1"' _ "$$FILE"; \
|
||||
$(MAKE) encrypt-role ROLE=$$ROLE;; \
|
||||
show) \
|
||||
echo "🔐 Просмотр секретов..."; \
|
||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
||||
echo ""; \
|
||||
read -p "Введите имя файла (без .yml): " FILE; \
|
||||
echo "🔐 Просмотр vars/main.yml выбранной роли..."; \
|
||||
echo "📋 Доступные роли:"; \
|
||||
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||
read -p "Введите имя роли: " ROLE; \
|
||||
FILE="roles/$$ROLE/vars/main.yml"; \
|
||||
if [ ! -f "$$FILE" ]; then echo "❌ Файл $$FILE не найден"; exit 1; fi; \
|
||||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||||
$(DOCKER_IMAGE) \
|
||||
ansible-vault view --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
||||
delete) \
|
||||
echo "🔐 Удаление секретов..."; \
|
||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
||||
echo ""; \
|
||||
read -p "Введите имя файла (без .yml): " FILE; \
|
||||
rm -f vault/$$FILE.yml;; \
|
||||
$(DOCKER_IMAGE) bash -c 'f="$1"; \
|
||||
if grep -q "ANSIBLE_VAULT" "$${f}" 2>/dev/null; then \
|
||||
ansible-vault view --vault-password-file vault/.vault "$${f}"; \
|
||||
else \
|
||||
cat "$${f}"; \
|
||||
fi' _ "$$FILE";; \
|
||||
encrypt) \
|
||||
echo "🔐 Шифрование файла..."; \
|
||||
ls -la vault/*.yml 2>/dev/null || echo "Нет файлов для шифрования"; \
|
||||
echo ""; \
|
||||
read -p "Введите имя файла (без .yml): " FILE; \
|
||||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||||
$(DOCKER_IMAGE) \
|
||||
ansible-vault encrypt --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
||||
echo "🔐 Шифрование vars/main.yml выбранной роли..."; \
|
||||
echo "📋 Доступные роли:"; \
|
||||
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||
read -p "Введите имя роли: " ROLE; \
|
||||
$(MAKE) encrypt-role ROLE="$$ROLE";; \
|
||||
decrypt) \
|
||||
echo "🔐 Расшифровка файла..."; \
|
||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
||||
echo ""; \
|
||||
read -p "Введите имя файла (без .yml): " FILE; \
|
||||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||||
$(DOCKER_IMAGE) \
|
||||
ansible-vault decrypt --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
||||
echo "🔓 Расшифровка vars/main.yml выбранной роли..."; \
|
||||
echo "📋 Доступные роли:"; \
|
||||
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||
read -p "Введите имя роли: " ROLE; \
|
||||
$(MAKE) decrypt-role ROLE="$$ROLE";; \
|
||||
rekey) \
|
||||
echo "🔐 Смена пароля..."; \
|
||||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
||||
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;; \
|
||||
echo "🔑 Смена пароля для vars/main.yml..."; \
|
||||
echo "Выберите действие:"; \
|
||||
echo " 1) Сменить пароль для всех ролей"; \
|
||||
echo " 2) Сменить пароль для одной роли"; \
|
||||
read -p "Введите номер (1-2): " CHOICE; \
|
||||
case "$$CHOICE" in \
|
||||
1) $(MAKE) rekey-all;; \
|
||||
2) echo "📋 Доступные роли:"; \
|
||||
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
|
||||
read -p "Введите имя роли: " ROLE; \
|
||||
$(MAKE) rekey-role ROLE="$$ROLE";; \
|
||||
*) echo "❌ Неверный выбор"; exit 1;; \
|
||||
esac;; \
|
||||
check) \
|
||||
echo "🔍 Проверка vault файлов..."; \
|
||||
if [ ! -d "vault" ]; then \
|
||||
@@ -378,18 +377,12 @@ vault:
|
||||
echo " 🔑 make vault init - инициализировать vault (создать vault/.vault)"; \
|
||||
echo " 💡 Первая команда для настройки vault"; \
|
||||
echo ""; \
|
||||
echo " 🔐 make vault create - создать новый файл секретов"; \
|
||||
echo " 💡 Интерактивное создание зашифрованного файла с nano"; \
|
||||
echo ""; \
|
||||
echo " ✏️ make vault edit - редактировать существующие секреты"; \
|
||||
echo " 💡 Открывает nano для изменения секретов"; \
|
||||
echo ""; \
|
||||
echo " 👁️ make vault show - показать содержимое секретов"; \
|
||||
echo " 💡 Расшифровывает и показывает содержимое"; \
|
||||
echo ""; \
|
||||
echo " 🗑️ make vault delete - удалить файл секретов"; \
|
||||
echo " 💡 Безвозвратное удаление файла"; \
|
||||
echo ""; \
|
||||
echo " 🔒 make vault encrypt - зашифровать существующий файл"; \
|
||||
echo " 💡 Шифрует незашифрованный файл"; \
|
||||
echo ""; \
|
||||
@@ -397,7 +390,7 @@ vault:
|
||||
echo " 💡 Создает незашифрованную копию"; \
|
||||
echo ""; \
|
||||
echo " 🔑 make vault rekey - сменить пароль шифрования"; \
|
||||
echo " 💡 Изменяет пароль для существующего файла с nano"; \
|
||||
echo " 💡 Изменяет пароль для всех или одной роли"; \
|
||||
echo ""; \
|
||||
echo " ✅ make vault check - проверить vault файлы"; \
|
||||
echo " 💡 Проверяет структуру и статус файлов"; \
|
||||
@@ -413,6 +406,7 @@ git:
|
||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||
push) \
|
||||
echo "📤 Отправка изменений в репозиторий..."; \
|
||||
$(MAKE) encrypt-all; \
|
||||
if [ -d "vault" ]; then \
|
||||
VAULT_FILES=$$(find vault -maxdepth 1 -type f -name "*.yml" 2>/dev/null); \
|
||||
if [ -n "$$VAULT_FILES" ]; then \
|
||||
@@ -425,6 +419,7 @@ git:
|
||||
done; \
|
||||
fi; \
|
||||
fi; \
|
||||
$(MAKE) decrypt-all; \
|
||||
git add .; \
|
||||
git commit -m "Обновление проекта"; \
|
||||
git push origin main;; \
|
||||
@@ -1593,13 +1588,11 @@ help:
|
||||
@echo ""
|
||||
@echo "🔐 VAULT (управление секретами):"
|
||||
@echo " make vault init - инициализировать vault (создать vault/.vault)"
|
||||
@echo " make vault create - создать новый файл секретов"
|
||||
@echo " make vault edit - редактировать существующие секреты"
|
||||
@echo " make vault show - показать содержимое секретов"
|
||||
@echo " make vault delete - удалить файл секретов"
|
||||
@echo " make vault encrypt - зашифровать файл"
|
||||
@echo " make vault decrypt - расшифровать файл"
|
||||
@echo " make vault rekey - сменить пароль шифрования"
|
||||
@echo " make vault rekey - сменить пароль шифрования (все/одна роль)"
|
||||
@echo " make vault check - проверить vault файлы"
|
||||
@echo " make vault scan - поиск потенциальных секретов"
|
||||
@echo ""
|
||||
@@ -1665,6 +1658,139 @@ setup-cicd:
|
||||
@chmod +x 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
|
||||
.PHONY: clean-containers
|
||||
clean-containers:
|
||||
@@ -1680,6 +1806,14 @@ clean-containers:
|
||||
@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:
|
||||
@true
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ DevOpsLab/
|
||||
│ │ ├── create.yml # Создание контейнеров
|
||||
│ │ ├── converge.yml # Запуск тестов
|
||||
│ │ ├── destroy.yml # Удаление контейнеров
|
||||
│ │ ├── run.yml # Основной playbook для обновления контейнеров
|
||||
│ │ ├── converge.yml # Основной playbook (включает логику бывшего run.yml)
|
||||
│ │ ├── verify.yml # Проверка конфигурации
|
||||
│ │ └── molecule.yml # Конфигурация Molecule
|
||||
│ └── 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
|
||||
|
||||
### Безопасность и качество
|
||||
|
||||
@@ -111,7 +111,7 @@ docker run --rm \
|
||||
-v $(pwd):/workspace \
|
||||
-w /workspace \
|
||||
inecs/ansible-lab:ansible-controller-latest \
|
||||
ansible-playbook run.yml
|
||||
ansible-playbook converge.yml
|
||||
```
|
||||
|
||||
### 2. k8s
|
||||
|
||||
@@ -9,16 +9,6 @@
|
||||
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||
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:
|
||||
# =============================================================================
|
||||
# НАСТРОЙКА - Загрузка конфигурации и подготовка
|
||||
@@ -38,262 +28,197 @@
|
||||
ignore_errors: true
|
||||
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# VAULT - Работа с зашифрованными файлами
|
||||
# НАСТРОЙКА ЗАВЕРШЕНА - Переходим к подготовке контейнеров
|
||||
# =============================================================================
|
||||
- name: Vault operations
|
||||
- name: Configuration loaded and proceed to container preparation
|
||||
debug:
|
||||
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:
|
||||
container: ansible-controller
|
||||
command: |
|
||||
bash -c '
|
||||
VAULT_TARGETS_JSON="{{ vault_targets | to_json }}"
|
||||
VAULT_PASSWORD_FILE="/workspace/vault/.vault"
|
||||
|
||||
echo "=== ENCRYPTING PLAINTEXT VAULT FILES ==="
|
||||
|
||||
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
|
||||
# =============================================================================
|
||||
# ПОДГОТОВКА КОНТЕЙНЕРОВ (бывший run.yml)
|
||||
# =============================================================================
|
||||
- name: Подготовка окружения для тестирования
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
# Сброс цветовых кодов ANSI для корректного отображения
|
||||
- name: Reset ANSI color codes
|
||||
debug:
|
||||
msg: |
|
||||
================================================================================
|
||||
CONVERGE ЗАВЕРШЕН
|
||||
================================================================================
|
||||
Vault переменные загружены и готовы к использованию
|
||||
Playbook'и run.yml и roles/deploy.yml будут выполнены через Makefile
|
||||
================================================================================
|
||||
msg: "\033[0m"
|
||||
changed_when: false
|
||||
tags:
|
||||
- setup
|
||||
- color-reset
|
||||
|
||||
# Создание 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
|
||||
until: container_info.container.State.Running | default(false)
|
||||
|
||||
# Примечание: Установка пакетов и создание директорий перенесены в run.yml
|
||||
# для выполнения на всех поднятых контейнерах
|
||||
# Примечание: Установка пакетов и создание директорий перенесены в converge.yml
|
||||
# (в секцию для hosts: all) для выполнения на всех поднятых контейнерах
|
||||
|
||||
# =============================================================================
|
||||
# DIND NODES - Создание контейнеров Docker-in-Docker
|
||||
|
||||
@@ -18,10 +18,6 @@
|
||||
groups: [test]
|
||||
kind_clusters: []
|
||||
|
||||
# перечисли файлы/глобы, которые нужно временно расшифровать
|
||||
vault_targets:
|
||||
- /workspace/vault/secrets.yml
|
||||
- /workspace/vault/secret.yml
|
||||
|
||||
tasks:
|
||||
# =============================================================================
|
||||
@@ -41,62 +37,6 @@
|
||||
when: preset_file is file
|
||||
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:
|
||||
# Используем переменную 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
|
||||
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
|
||||
|
||||
- name: Развертывание всех ролей
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
# Сброс цветовых кодов ANSI для корректного отображения
|
||||
- name: Reset ANSI color codes
|
||||
debug:
|
||||
msg: "\033[0m"
|
||||
changed_when: false
|
||||
tags:
|
||||
- color-reset
|
||||
|
||||
- name: Установка роли devops
|
||||
hosts: all
|
||||
become: true
|
||||
roles:
|
||||
- devops
|
||||
|
||||
#- name: Установка роли python
|
||||
# hosts: all
|
||||
# become: true
|
||||
# roles:
|
||||
# - python
|
||||
|
||||
#- name: Установка роли docker
|
||||
# hosts: all
|
||||
# become: true
|
||||
# roles:
|
||||
# - docker
|
||||
|
||||
- name: Установка роли docker
|
||||
hosts: all
|
||||
become: true
|
||||
roles:
|
||||
- docker
|
||||
- name: Установка роли python
|
||||
hosts: all
|
||||
become: true
|
||||
roles:
|
||||
- python
|
||||
|
||||
@@ -149,16 +149,16 @@
|
||||
|
||||
```bash
|
||||
# Только создание пользователя и группы
|
||||
ansible-playbook -i inventory run.yml --tags "user,group"
|
||||
ansible-playbook -i inventory converge.yml --tags "user,group"
|
||||
|
||||
# Только настройка SSH
|
||||
ansible-playbook -i inventory run.yml --tags "ssh,keys"
|
||||
ansible-playbook -i inventory converge.yml --tags "ssh,keys"
|
||||
|
||||
# Только настройка 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"
|
||||
fail:
|
||||
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_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@devops.org.ru"
|
||||
|
||||
Для шифрования файла используйте:
|
||||
ansible-vault encrypt vault/secrets.yml
|
||||
when:
|
||||
- vault_devops_password is not defined
|
||||
- vault_devops_password == ""
|
||||
@@ -33,16 +30,14 @@
|
||||
- name: "Проверка наличия SSH публичного ключа"
|
||||
fail:
|
||||
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: "ваш_пароль_здесь"
|
||||
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@devops.org.ru"
|
||||
|
||||
Для шифрования файла используйте:
|
||||
ansible-vault encrypt vault/secrets.yml
|
||||
Пример в roles/devops/vars/main.yml:
|
||||
vault_devops_ssh_public_key: |
|
||||
ssh-rsa AAAAB3... user@host
|
||||
when:
|
||||
- vault_devops_ssh_public_key is not defined
|
||||
- vault_devops_ssh_public_key == ""
|
||||
@@ -51,7 +46,7 @@
|
||||
- name: "✅ Проверка успешна - все необходимые секреты найдены"
|
||||
debug:
|
||||
msg: |
|
||||
✅ Все необходимые секреты найдены в vault/secrets.yml:
|
||||
✅ Все необходимые секреты найдены в переменных роли (vars/main.yml или инвентарь):
|
||||
- Пароль пользователя: {{ 'установлен' 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 'НЕ УСТАНОВЛЕН' }}
|
||||
when:
|
||||
|
||||
@@ -250,3 +250,13 @@ devops_notification_config:
|
||||
failure_message: "Ошибка при настройке пользователя {{ devops_user }}"
|
||||
ssh_message: "SSH ключ для пользователя {{ 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"
|
||||
|
||||
# Обновляем 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
|
||||
echo "📝 Обновление roles/deploy.yml..."
|
||||
@@ -210,13 +21,17 @@ cat > roles/deploy.yml << EOF
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: Развертывание всех ролей
|
||||
hosts: all
|
||||
roles:
|
||||
EOF
|
||||
|
||||
# Добавляем каждую роль как отдельный playbook блок
|
||||
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
|
||||
|
||||
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