Обновление проекта

This commit is contained in:
Сергей Антропов
2025-10-30 01:10:35 +03:00
parent 2ce450215b
commit 981ede5c94
15 changed files with 440 additions and 1064 deletions

View File

@@ -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
View File

@@ -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; \
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;; \
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) \
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; \
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;; \
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) 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

View File

@@ -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
### Безопасность и качество

View File

@@ -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

View File

@@ -8,16 +8,6 @@
# Получаем preset из переменной окружения или используем default
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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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"
```
## Обработчики

View File

@@ -15,16 +15,13 @@
- name: "Проверка наличия пароля пользователя devops"
fail:
msg: |
❌ ОШИБКА: Пароль пользователя devops не найден в vault/secrets.yml!
Для корректной работы роли необходимо установить переменную vault_devops_password в файле vault/secrets.yml.
Пример содержимого vault/secrets.yml:
❌ ОШИБКА: Пароль пользователя devops не определён.
Ожидаемая переменная: vault_devops_password
Где задавать: roles/devops/vars/main.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!
Для корректной работы роли необходимо установить переменную vault_devops_ssh_public_key в файле vault/secrets.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
❌ ОШИБКА: SSH публичный ключ не определён.
Ожидаемая переменная: vault_devops_ssh_public_key
Где задавать: roles/devops/vars/main.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:

View File

@@ -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

View File

View 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'и обновлены"

View File

@@ -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