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