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

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

274
Makefile
View File

@@ -50,6 +50,7 @@ BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.re
role:
@case "$(word 2, $(MAKECMDGOALS))" in \
lint) \
$(MAKE) decrypt; \
ROLE_NAME="$(word 3, $(MAKECMDGOALS))"; \
if [ -z "$$ROLE_NAME" ]; then \
echo "🔍 Проверка синтаксиса всех ролей ..."; \
@@ -65,6 +66,7 @@ role:
exit 1; \
fi; \
fi; \
$(MAKE) encrypt-all; \
echo ""; \
echo "✅ Lint завершен";; \
test) \
@@ -82,6 +84,7 @@ role:
exit 1; \
fi; \
echo ""; \
$(MAKE) decrypt; \
echo "🔧 Запуск ansible-controller контейнера..."; \
docker run --rm --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace \
-v /var/run/docker.sock:/var/run/docker.sock \
@@ -103,15 +106,16 @@ role:
echo '=== ПРОВЕРКА ПОДКЛЮЧЕНИЯ К КОНТЕЙНЕРАМ ==='; \
ansible all -i /tmp/molecule_workspace/inventory/hosts.ini -m ping && \
echo ''; \
echo '=== ЗАПУСК RUN.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ==='; \
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini run.yml -v -e vault_devops_password="123123" -e vault_devops_ssh_public_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDBjzRt/b5Xe/tgQS2rvOBXOSBq1hychcnbz6G4m9Ps6hQXCxLA0hcrzPIRGazeWEslqsBynSm4fVJC6zAnExEd7KsNxS5gsMxmcHsghuU6/IA62tP8w8tXKEWaCGMQyfcUO/MIrdEjAg8txl3FIxdlcYwBTLW9nJggOmUn9w1YOA6ECNBDUbTwZC62yomJhQoAK0W+uVkKSLTqRIvd0oZJEF+0dtzBrhhe7cjR6fuoLpkB1/Q9bQImVfAxEiiExhFWFMxcyf4SGxpmsbKI4rJ3eBvsMmhrX76p1bYX4fKGiBaqNyXqThYWYybXfDfaITQR87SIrVt4U4NzS79ZFfQ142VPs+YISiy/+/VKZ1NjHo1fRZJSqBtsWJCsvtuM6C2+dRZ0JqwwMlHKLNhmerYMLJMQxkxdB5jRxafC+3T0aFNIsFIa7MdC8i3WQBk5z5huY5pslkPWnmKTfCi3gLjWNhfW9xEgKAww6hGrZR/zlQXZQrmQ2LGspzXFngd9tmk= linux@key" && \
echo '=== ЗАПУСК CONVERGE.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ==='; \
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini converge.yml && \
echo ''; \
echo '=== ЗАПУСК ROLES/DEPLOY.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ==='; \
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini ../../roles/deploy.yml -v -e vault_devops_password="123123" -e vault_devops_ssh_public_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDBjzRt/b5Xe/tgQS2rvOBXOSBq1hychcnbz6G4m9Ps6hQXCxLA0hcrzPIRGazeWEslqsBynSm4fVJC6zAnExEd7KsNxS5gsMxmcHsghuU6/IA62tP8w8tXKEWaCGMQyfcUO/MIrdEjAg8txl3FIxdlcYwBTLW9nJggOmUn9w1YOA6ECNBDUbTwZC62yomJhQoAK0W+uVkKSLTqRIvd0oZJEF+0dtzBrhhe7cjR6fuoLpkB1/Q9bQImVfAxEiiExhFWFMxcyf4SGxpmsbKI4rJ3eBvsMmhrX76p1bYX4fKGiBaqNyXqThYWYybXfDfaITQR87SIrVt4U4NzS79ZFfQ142VPs+YISiy/+/VKZ1NjHo1fRZJSqBtsWJCsvtuM6C2+dRZ0JqwwMlHKLNhmerYMLJMQxkxdB5jRxafC+3T0aFNIsFIa7MdC8i3WQBk5z5huY5pslkPWnmKTfCi3gLjWNhfW9xEgKAww6hGrZR/zlQXZQrmQ2LGspzXFngd9tmk= linux@key" && \
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini ../../roles/deploy.yml && \
echo ''; \
echo '=== ОЧИСТКА РЕСУРСОВ ==='; \
ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && \
echo '✅ Тестирование завершено'";; \
echo '✅ Тестирование завершено'"; \
$(MAKE) encrypt-all;; \
deploy) \
echo "🚀 Развертывание ролей на реальные серверы..."; \
echo ""; \
@@ -120,6 +124,7 @@ role:
echo "💡 Создайте файл inventory/hosts.ini с вашими серверами"; \
exit 1; \
fi; \
$(MAKE) decrypt; \
echo "📋 Используется inventory: inventory/hosts.ini"; \
echo "📄 Содержимое inventory:"; \
docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) cat inventory/hosts.ini || cat inventory/hosts.ini; \
@@ -140,7 +145,8 @@ role:
bash -c "ansible-playbook -i inventory/hosts.ini roles/deploy.yml"; \
else \
echo "❌ Развертывание отменено"; \
fi;; \
fi; \
$(MAKE) encrypt-all;; \
list) \
./scripts/role-manager.sh list;; \
create) \
@@ -275,66 +281,59 @@ vault:
else \
echo "✅ Файл vault/.vault уже существует"; \
fi;; \
create) \
if [ ! -f "vault/.vault" ]; then \
echo "⚠️ Файл vault/.vault не найден!"; \
echo "💡 Сначала создайте файл: make vault init"; \
exit 1; \
fi; \
echo "🔐 Создание файла секретов..."; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
-e EDITOR=$(EDITOR) \
$(DOCKER_IMAGE) \
ansible-vault create --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
edit) \
echo "🔐 Редактирование секретов..."; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
-e EDITOR=$(EDITOR) \
$(DOCKER_IMAGE) \
ansible-vault edit --vault-password-file vault/.vault vault/$$FILE.yml;; \
echo "🔐 Редактирование vars/main.yml выбранной роли..."; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
read -p "Введите имя роли: " ROLE; \
FILE="roles/$$ROLE/vars/main.yml"; \
if [ ! -f "$$FILE" ]; then echo "❌ Файл $$FILE не найден"; exit 1; fi; \
$(MAKE) decrypt-role ROLE=$$ROLE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
-e EDITOR=$(EDITOR) \
$(DOCKER_IMAGE) \
bash -c 'exec ${EDITOR:-nano} "$1"' _ "$$FILE"; \
$(MAKE) encrypt-role ROLE=$$ROLE;; \
show) \
echo "🔐 Просмотр секретов..."; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
$(DOCKER_IMAGE) \
ansible-vault view --vault-password-file vault/.vault vault/$$FILE.yml;; \
delete) \
echo "🔐 Удаление секретов..."; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
rm -f vault/$$FILE.yml;; \
echo "🔐 Просмотр vars/main.yml выбранной роли..."; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
read -p "Введите имя роли: " ROLE; \
FILE="roles/$$ROLE/vars/main.yml"; \
if [ ! -f "$$FILE" ]; then echo "❌ Файл $$FILE не найден"; exit 1; fi; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
$(DOCKER_IMAGE) bash -c 'f="$1"; \
if grep -q "ANSIBLE_VAULT" "$${f}" 2>/dev/null; then \
ansible-vault view --vault-password-file vault/.vault "$${f}"; \
else \
cat "$${f}"; \
fi' _ "$$FILE";; \
encrypt) \
echo "🔐 Шифрование файла..."; \
ls -la vault/*.yml 2>/dev/null || echo "Нет файлов для шифрования"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
$(DOCKER_IMAGE) \
ansible-vault encrypt --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
echo "🔐 Шифрование vars/main.yml выбранной роли..."; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
read -p "Введите имя роли: " ROLE; \
$(MAKE) encrypt-role ROLE="$$ROLE";; \
decrypt) \
echo "🔐 Расшифровка файла..."; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
$(DOCKER_IMAGE) \
ansible-vault decrypt --vault-password-file vault/.vault vault/$$FILE.yml;; \
echo "🔓 Расшифровка vars/main.yml выбранной роли..."; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
read -p "Введите имя роли: " ROLE; \
$(MAKE) decrypt-role ROLE="$$ROLE";; \
rekey) \
echo "🔐 Смена пароля..."; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
-e EDITOR=$(EDITOR) \
$(DOCKER_IMAGE) \
ansible-vault rekey --vault-password-file vault/.vault vault/$$FILE.yml;; \
echo "🔑 Смена пароля для vars/main.yml..."; \
echo "Выберите действие:"; \
echo " 1) Сменить пароль для всех ролей"; \
echo " 2) Сменить пароль для одной роли"; \
read -p "Введите номер (1-2): " CHOICE; \
case "$$CHOICE" in \
1) $(MAKE) rekey-all;; \
2) echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
read -p "Введите имя роли: " ROLE; \
$(MAKE) rekey-role ROLE="$$ROLE";; \
*) echo "❌ Неверный выбор"; exit 1;; \
esac;; \
check) \
echo "🔍 Проверка vault файлов..."; \
if [ ! -d "vault" ]; then \
@@ -378,18 +377,12 @@ vault:
echo " 🔑 make vault init - инициализировать vault (создать vault/.vault)"; \
echo " 💡 Первая команда для настройки vault"; \
echo ""; \
echo " 🔐 make vault create - создать новый файл секретов"; \
echo " 💡 Интерактивное создание зашифрованного файла с nano"; \
echo ""; \
echo " ✏️ make vault edit - редактировать существующие секреты"; \
echo " 💡 Открывает nano для изменения секретов"; \
echo ""; \
echo " 👁️ make vault show - показать содержимое секретов"; \
echo " 💡 Расшифровывает и показывает содержимое"; \
echo ""; \
echo " 🗑️ make vault delete - удалить файл секретов"; \
echo " 💡 Безвозвратное удаление файла"; \
echo ""; \
echo " 🔒 make vault encrypt - зашифровать существующий файл"; \
echo " 💡 Шифрует незашифрованный файл"; \
echo ""; \
@@ -397,7 +390,7 @@ vault:
echo " 💡 Создает незашифрованную копию"; \
echo ""; \
echo " 🔑 make vault rekey - сменить пароль шифрования"; \
echo " 💡 Изменяет пароль для существующего файла с nano"; \
echo " 💡 Изменяет пароль для всех или одной роли"; \
echo ""; \
echo " ✅ make vault check - проверить vault файлы"; \
echo " 💡 Проверяет структуру и статус файлов"; \
@@ -413,6 +406,7 @@ git:
@case "$(word 2, $(MAKECMDGOALS))" in \
push) \
echo "📤 Отправка изменений в репозиторий..."; \
$(MAKE) encrypt-all; \
if [ -d "vault" ]; then \
VAULT_FILES=$$(find vault -maxdepth 1 -type f -name "*.yml" 2>/dev/null); \
if [ -n "$$VAULT_FILES" ]; then \
@@ -425,6 +419,7 @@ git:
done; \
fi; \
fi; \
$(MAKE) decrypt-all; \
git add .; \
git commit -m "Обновление проекта"; \
git push origin main;; \
@@ -1593,13 +1588,11 @@ help:
@echo ""
@echo "🔐 VAULT (управление секретами):"
@echo " make vault init - инициализировать vault (создать vault/.vault)"
@echo " make vault create - создать новый файл секретов"
@echo " make vault edit - редактировать существующие секреты"
@echo " make vault show - показать содержимое секретов"
@echo " make vault delete - удалить файл секретов"
@echo " make vault encrypt - зашифровать файл"
@echo " make vault decrypt - расшифровать файл"
@echo " make vault rekey - сменить пароль шифрования"
@echo " make vault rekey - сменить пароль шифрования (все/одна роль)"
@echo " make vault check - проверить vault файлы"
@echo " make vault scan - поиск потенциальных секретов"
@echo ""
@@ -1665,6 +1658,139 @@ setup-cicd:
@chmod +x scripts/setup-cicd.sh
@./scripts/setup-cicd.sh
# Вспомогательные функции: шифрование/расшифровка roles/*/vars/main.yml
.PHONY: encrypt decrypt rekey-all
encrypt-all:
@echo "🔐 Шифрование всех roles/*/vars/main.yml (только незашифрованных) ..."
@docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
VAULT=vault/.vault; \
for f in roles/*/vars/main.yml; do [ -f "$$f" ] || continue; \
if ! grep -q "ANSIBLE_VAULT" "$$f" 2>/dev/null; then \
ansible-vault encrypt --encrypt-vault-id default --vault-password-file "$$VAULT" "$$f" || true; \
printf "✅ Зашифровано: %s\n" "$$f"; \
else \
printf " Уже зашифровано: %s\n" "$$f"; \
fi; \
done'
decrypt-all:
@echo "🔓 Расшифровка всех roles/*/vars/main.yml (только зашифрованных) ..."
@docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
VAULT=vault/.vault; \
for f in roles/*/vars/main.yml; do [ -f "$$f" ] || continue; \
if grep -q "ANSIBLE_VAULT" "$$f" 2>/dev/null; then \
ansible-vault decrypt --vault-password-file "$$VAULT" "$$f" || true; \
printf "✅ Расшифровано: %s\n" "$$f"; \
else \
printf " Уже расшифровано: %s\n" "$$f"; \
fi; \
done'
rekey-all:
@echo "🔑 Смена пароля для всех roles/*/vars/main.yml (только зашифрованных) ..."
@docker run --rm -it -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
VAULT=vault/.vault; \
for f in roles/*/vars/main.yml; do [ -f "$$f" ] || continue; \
if grep -q "ANSIBLE_VAULT" "$$f" 2>/dev/null; then \
printf "🔑 Смена пароля для: %s\n" "$$f"; \
ansible-vault rekey --vault-password-file "$$VAULT" "$$f" || true; \
printf "✅ Пароль изменен: %s\n" "$$f"; \
else \
printf " Пропущено (не зашифровано): %s\n" "$$f"; \
fi; \
done'
# Вспомогательные функции: шифрование/расшифровка ТОЛЬКО одной роли
.PHONY: encrypt-role decrypt-role rekey-role
encrypt-role:
@ROLE_NAME="$(ROLE)"; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\.yml$$" | sed 's/^/ - /'; \
if [ -z "$$ROLE_NAME" ]; then \
read -p "Введите имя роли: " ROLE_NAME; \
fi; \
if [ ! -d "roles/$$ROLE_NAME" ]; then \
echo "❌ Роль '$$ROLE_NAME' не найдена"; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
echo "↩️ Возврат в интерактивный выбор роли для шифрования..."; \
$(MAKE) vault encrypt; \
exit 0; \
fi; \
FILE="roles/$$ROLE_NAME/vars/main.yml"; \
if [ ! -f "$$FILE" ]; then \
echo "❌ Файл $$FILE не найден"; \
exit 1; \
fi; \
if grep -q "ANSIBLE_VAULT" "$$FILE" 2>/dev/null; then \
echo " Уже зашифровано: $$FILE"; \
exit 0; \
fi; \
docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
VAULT=vault/.vault; \
ansible-vault encrypt --encrypt-vault-id default --vault-password-file "$$VAULT" "$$1" || true' _ "$$FILE"; \
echo "✅ Зашифровано: $$FILE"
decrypt-role:
@ROLE_NAME="$(ROLE)"; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\.yml$$" | sed 's/^/ - /'; \
if [ -z "$$ROLE_NAME" ]; then \
read -p "Введите имя роли: " ROLE_NAME; \
fi; \
if [ ! -d "roles/$$ROLE_NAME" ]; then \
echo "❌ Роль '$$ROLE_NAME' не найдена"; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
echo "↩️ Возврат в интерактивный выбор роли для расшифровки..."; \
$(MAKE) vault decrypt; \
exit 0; \
fi; \
FILE="roles/$$ROLE_NAME/vars/main.yml"; \
if [ ! -f "$$FILE" ]; then \
echo "❌ Файл $$FILE не найден"; \
exit 1; \
fi; \
if ! grep -q "ANSIBLE_VAULT" "$$FILE" 2>/dev/null; then \
echo " Уже расшифровано: $$FILE"; \
exit 0; \
fi; \
docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) bash -c '\
VAULT=vault/.vault; \
ansible-vault decrypt --vault-password-file "$$VAULT" "$$1" || true' _ "$$FILE"; \
echo "✅ Расшифровано: $$FILE"
rekey-role:
@ROLE_NAME="$(ROLE)"; \
echo "🔑 Смена пароля для vars/main.yml выбранной роли..."; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\.yml$$" | sed 's/^/ - /'; \
if [ -z "$$ROLE_NAME" ]; then \
read -p "Введите имя роли: " ROLE_NAME; \
fi; \
if [ ! -d "roles/$$ROLE_NAME" ]; then \
echo "❌ Роль '$$ROLE_NAME' не найдена"; \
echo "📋 Доступные роли:"; \
ls -1 roles | grep -v "\\.yml$$" | sed 's/^/ - /'; \
echo "↩️ Возврат в интерактивный выбор роли для смены пароля..."; \
$(MAKE) vault rekey; \
exit 0; \
fi; \
FILE="roles/$$ROLE_NAME/vars/main.yml"; \
if [ ! -f "$$FILE" ]; then \
echo "❌ Файл $$FILE не найден"; \
exit 1; \
fi; \
if ! grep -q "ANSIBLE_VAULT" "$$FILE" 2>/dev/null; then \
echo " Файл $$FILE не зашифрован, сначала зашифруйте его"; \
exit 1; \
fi; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
-e EDITOR=$(EDITOR) \
$(DOCKER_IMAGE) \
ansible-vault rekey --vault-password-file vault/.vault "$$FILE"; \
echo "✅ Пароль изменен для: $$FILE"
# Очистка контейнеров Molecule
.PHONY: clean-containers
clean-containers:
@@ -1680,6 +1806,14 @@ clean-containers:
@echo "✅ Очистка завершена"
# Пустые цели для совместимости
.PHONY: encrypt decrypt
encrypt:
@echo " Команда переименована. Используйте: make encrypt-all или make vault encrypt"
@true
decrypt:
@echo " Команда переименована. Используйте: make decrypt-all или make vault decrypt"
@true
view create edit show delete lint deploy new advanced list info test build push pull clean prepare update run stop purge clean-builder setup-builder diagnose reset-builder build-image:
@true