make: добавлен setup и усилен podman role test

Добавлен таргет make setup для создания vault/.vault с интерактивным вводом пароля.
В make role test добавлены проверки локального ansible-controller, запрет pull и корректный exit code.

Made-with: Cursor
This commit is contained in:
Sergey Antropoff
2026-03-25 12:12:49 +03:00
parent 05881e8d74
commit 700452f681

108
Makefile
View File

@@ -42,7 +42,39 @@ DOCKER_PLATFORMS ?= linux/amd64,linux/arm64
# Базовые образы и их теги # Базовые образы и их теги
BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi centos:7 quay.io/centos/centos:8 quay.io/centos/centos:stream9 almalinux:8 rockylinux:8 ubuntu:20.04 ubuntu:22.04 ubuntu:24.04 debian:9 debian:10 debian:11 debian:bookworm BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi centos:7 quay.io/centos/centos:8 quay.io/centos/centos:stream9 almalinux:8 rockylinux:8 ubuntu:20.04 ubuntu:22.04 ubuntu:24.04 debian:9 debian:10 debian:11 debian:bookworm
.PHONY: role vault git docker presets controller k8s help update-playbooks generate-docs setup-cicd list create delete buildall buildall-image .PHONY: role vault git docker presets controller k8s help update-playbooks generate-docs setup-cicd list create delete buildall buildall-image setup
# =============================================================================
# ПЕРВИЧНАЯ НАСТРОЙКА (vault: пароль для ansible-vault)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# =============================================================================
# Создаёт каталоги и файл vault/.vault с паролем (интерактивно, без вывода пароля в лог).
setup:
@set -e; \
echo "🔧 Первичная настройка проекта..."; \
mkdir -p vault inventory; \
echo "📁 Каталоги: vault/, inventory/"; \
if [ -f vault/.vault ]; then \
echo "⚠️ Файл vault/.vault уже существует."; \
read -p "Перезаписать пароль? (y/N): " confirm; \
if [ "$$confirm" != "y" ] && [ "$$confirm" != "Y" ]; then \
echo "✅ Оставлен существующий vault/.vault"; \
exit 0; \
fi; \
fi; \
read -sp "Введите пароль для ansible-vault (будет записан в vault/.vault): " VAULT_PASS; \
echo ""; \
read -sp "Повторите пароль: " VAULT_PASS2; \
echo ""; \
if [ "$$VAULT_PASS" != "$$VAULT_PASS2" ]; then \
echo "❌ Пароли не совпадают"; \
exit 1; \
fi; \
printf '%s\n' "$$VAULT_PASS" > vault/.vault; \
chmod 600 vault/.vault; \
echo "✅ Создан/обновлён файл vault/.vault (права 600)."; \
echo "💡 Для развёртывания на серверах создайте inventory/hosts.ini при необходимости."
# ============================================================================= # =============================================================================
# КОМАНДЫ ДЛЯ РАБОТЫ С РОЛЯМИ # КОМАНДЫ ДЛЯ РАБОТЫ С РОЛЯМИ
@@ -85,8 +117,18 @@ role:
fi; \ fi; \
echo ""; \ echo ""; \
$(MAKE) decrypt-all; \ $(MAKE) decrypt-all; \
echo "🔎 Проверка локального образа ansible-controller..."; \
if ! podman image exists $(DOCKER_IMAGE); then \
echo "⚠️ Образ $(DOCKER_IMAGE) не найден локально. Выполняю локальную сборку..."; \
podman build -t $(DOCKER_IMAGE) dockerfiles/ansible-controller; \
fi; \
echo "🔎 Проверка наличия podman внутри ansible-controller..."; \
if ! podman run --rm --pull=never $(DOCKER_IMAGE) bash -lc "command -v podman >/dev/null 2>&1"; then \
echo "⚠️ В образе отсутствует podman. Пересобираю локально..."; \
podman build --no-cache -t $(DOCKER_IMAGE) dockerfiles/ansible-controller; \
fi; \
echo "🔧 Запуск ansible-controller контейнера (Podman)..."; \ echo "🔧 Запуск ansible-controller контейнера (Podman)..."; \
podman run --rm --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace \ podman run --rm --pull=never --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace \
-v $(PODMAN_SOCKET):/run/podman/podman.sock \ -v $(PODMAN_SOCKET):/run/podman/podman.sock \
-u root \ -u root \
-e ANSIBLE_FORCE_COLOR=1 \ -e ANSIBLE_FORCE_COLOR=1 \
@@ -96,35 +138,49 @@ role:
-e MOLECULE_VAULT_ENABLED=$${MOLECULE_VAULT_ENABLED:-false} \ -e MOLECULE_VAULT_ENABLED=$${MOLECULE_VAULT_ENABLED:-false} \
$(DOCKER_IMAGE) \ $(DOCKER_IMAGE) \
bash -c " \ bash -c " \
echo -e '\033[33m=== СОЗДАНИЕ ТЕСТОВЫХ КОНТЕЙНЕРОВ ==='; \ set -Eeuo pipefail; \
echo ''; \ cleanup() { \
mkdir -p /tmp/molecule_workspace/inventory && \
cd molecule/default && \
ansible-playbook -i localhost, create.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && \
echo ''; \
echo -e '\033[33m=== НАСТРОЙКА VAULT И ПЕРЕМЕННЫХ ==='; \
echo ''; \
ansible-playbook -i localhost, converge.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && \
echo ''; \
echo -e '\033[33m=== ПРОВЕРКА ПОДКЛЮЧЕНИЯ К КОНТЕЙНЕРАМ ==='; \
echo ''; \
ansible all -i /tmp/molecule_workspace/inventory/hosts.ini -m ping && \
echo ''; \
echo -e '\033[33m=== ЗАПУСК CONVERGE.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ===\033[0m'; \
echo ''; \
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini converge.yml && \
echo ''; \
echo -e '\033[33m=== ЗАПУСК ROLES/DEPLOY.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ===\033[0m'; \
echo ''; \
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini ../../roles/deploy.yml && \
echo ''; \ echo ''; \
echo -e '\033[33m=== ОЧИСТКА РЕСУРСОВ ==='; \ echo -e '\033[33m=== ОЧИСТКА РЕСУРСОВ ==='; \
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 || true; \
}; \
trap cleanup EXIT; \
echo -e '\033[33m=== СОЗДАНИЕ ТЕСТОВЫХ КОНТЕЙНЕРОВ ==='; \
echo ''; \
mkdir -p /tmp/molecule_workspace/inventory; \
cd molecule/default; \
ansible-playbook -i localhost, create.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace; \
if [ ! -f /tmp/molecule_workspace/inventory/hosts.ini ]; then \
echo '❌ Inventory не создан: /tmp/molecule_workspace/inventory/hosts.ini'; \
exit 1; \
fi; \
if ! awk '/^[a-zA-Z0-9._-]+$$/{found=1} END{exit(found?0:1)}' /tmp/molecule_workspace/inventory/hosts.ini; then \
echo '❌ Inventory пустой: не найдено ни одного тестового хоста'; \
exit 1; \
fi; \
echo ''; \
echo -e '\033[33m=== НАСТРОЙКА VAULT И ПЕРЕМЕННЫХ ==='; \
echo ''; \
ansible-playbook -i localhost, converge.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace; \
echo ''; \
echo -e '\033[33m=== ПРОВЕРКА ПОДКЛЮЧЕНИЯ К КОНТЕЙНЕРАМ ==='; \
echo ''; \
ansible all -i /tmp/molecule_workspace/inventory/hosts.ini -m ping; \
echo ''; \
echo -e '\033[33m=== ЗАПУСК CONVERGE.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ===\033[0m'; \
echo ''; \
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini converge.yml; \
echo ''; \
echo -e '\033[33m=== ЗАПУСК ROLES/DEPLOY.YML НА ТЕСТОВЫХ КОНТЕЙНЕРАХ ===\033[0m'; \
echo ''; \
ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini ../../roles/deploy.yml; \
echo ''; \ echo ''; \
echo '✅ Тестирование завершено'"; \ echo '✅ Тестирование завершено'"; \
TEST_RC=$$?; \
echo ''; \ echo ''; \
$(MAKE) encrypt-all;; \ $(MAKE) encrypt-all; \
exit $$TEST_RC;; \
dryrun) \ dryrun) \
echo "🔍 Проверка роли на реальных серверах (dry-run)..."; \ echo "🔍 Проверка роли на реальных серверах (dry-run)..."; \
echo ""; \ echo ""; \
@@ -1248,6 +1304,7 @@ help:
@echo " dockerfiles/ - Docker образы для тестирования" @echo " dockerfiles/ - Docker образы для тестирования"
@echo "" @echo ""
@echo "🚀 ОСНОВНЫЕ КОМАНДЫ:" @echo "🚀 ОСНОВНЫЕ КОМАНДЫ:"
@echo " make setup - первичная настройка: vault/.vault, каталоги vault и inventory"
@echo " make role lint [role] - проверить синтаксис ролей (все или конкретную)" @echo " make role lint [role] - проверить синтаксис ролей (все или конкретную)"
@echo " 💡 Примеры: make role lint, make role lint devops" @echo " 💡 Примеры: make role lint, make role lint devops"
@echo " make role test [preset] - протестировать роли с preset'ом" @echo " make role test [preset] - протестировать роли с preset'ом"
@@ -1333,6 +1390,7 @@ help:
@echo " make k8s shell [preset] - открыть shell в контейнере k8s" @echo " make k8s shell [preset] - открыть shell в контейнере k8s"
@echo "" @echo ""
@echo "💡 ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:" @echo "💡 ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:"
@echo " make setup # создать vault/.vault и каталоги (пароль vault)"
@echo " make presets list # показать все preset'ы" @echo " make presets list # показать все preset'ы"
@echo " make role test minimal # быстрый тест" @echo " make role test minimal # быстрый тест"
@echo " make role test all-images # тест всех образов" @echo " make role test all-images # тест всех образов"