From 981ede5c9465526a46afdfd47e79f924c1539ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=90=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D0=BE=D0=B2?= Date: Thu, 30 Oct 2025 01:10:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 118 --------- Makefile | 274 +++++++++++++++------ README.md | 4 +- dockerfiles/README.md | 2 +- molecule/default/converge.yml | 443 ++++++++++++++-------------------- molecule/default/create.yml | 4 +- molecule/default/destroy.yml | 71 ------ molecule/default/run.yml | 248 ------------------- roles/deploy.yml | 35 +-- roles/devops/README.md | 8 +- roles/devops/tasks/main.yml | 35 ++- roles/devops/vars/main.yml | 10 + roles/docker/vars/main.yml | 0 scripts/update-playbooks.sh | 201 +-------------- vault/secrets.yml | 51 ---- 15 files changed, 440 insertions(+), 1064 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 molecule/default/run.yml create mode 100644 roles/docker/vars/main.yml delete mode 100644 vault/secrets.yml diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 6bfb056..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -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 diff --git a/Makefile b/Makefile index fc90adb..63904d9 100644 --- a/Makefile +++ b/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; \ - 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 diff --git a/README.md b/README.md index 2d6e731..f6461f0 100644 --- a/README.md +++ b/README.md @@ -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 ### Безопасность и качество diff --git a/dockerfiles/README.md b/dockerfiles/README.md index 6d24a5e..f57c5c1 100644 --- a/dockerfiles/README.md +++ b/dockerfiles/README.md @@ -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 diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml index a8ba329..3f69aef 100644 --- a/molecule/default/converge.yml +++ b/molecule/default/converge.yml @@ -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 - ================================================================================ \ No newline at end of file + 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 \ No newline at end of file diff --git a/molecule/default/create.yml b/molecule/default/create.yml index a6f5a79..6b60a84 100644 --- a/molecule/default/create.yml +++ b/molecule/default/create.yml @@ -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 diff --git a/molecule/default/destroy.yml b/molecule/default/destroy.yml index 8085d0b..cc45bd9 100644 --- a/molecule/default/destroy.yml +++ b/molecule/default/destroy.yml @@ -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: diff --git a/molecule/default/run.yml b/molecule/default/run.yml deleted file mode 100644 index 12c2d40..0000000 --- a/molecule/default/run.yml +++ /dev/null @@ -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 - diff --git a/roles/deploy.yml b/roles/deploy.yml index a2ac2b2..52ba2ea 100644 --- a/roles/deploy.yml +++ b/roles/deploy.yml @@ -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 diff --git a/roles/devops/README.md b/roles/devops/README.md index a39fa48..259c87d 100644 --- a/roles/devops/README.md +++ b/roles/devops/README.md @@ -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" ``` ## Обработчики diff --git a/roles/devops/tasks/main.yml b/roles/devops/tasks/main.yml index d116595..9f89515 100644 --- a/roles/devops/tasks/main.yml +++ b/roles/devops/tasks/main.yml @@ -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: diff --git a/roles/devops/vars/main.yml b/roles/devops/vars/main.yml index b46ab4b..5c0cc3c 100644 --- a/roles/devops/vars/main.yml +++ b/roles/devops/vars/main.yml @@ -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 diff --git a/roles/docker/vars/main.yml b/roles/docker/vars/main.yml new file mode 100644 index 0000000..e69de29 diff --git a/scripts/update-playbooks.sh b/scripts/update-playbooks.sh index b277296..40a33d8 100755 --- a/scripts/update-playbooks.sh +++ b/scripts/update-playbooks.sh @@ -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'и обновлены" diff --git a/vault/secrets.yml b/vault/secrets.yml deleted file mode 100644 index 109edc9..0000000 --- a/vault/secrets.yml +++ /dev/null @@ -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