From 700452f6810cb9f186d682a359fe90bba9f55120 Mon Sep 17 00:00:00 2001 From: Sergey Antropoff Date: Wed, 25 Mar 2026 12:12:49 +0300 Subject: [PATCH] =?UTF-8?q?make:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20setup=20=D0=B8=20=D1=83=D1=81=D0=B8=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20podman=20role=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлен таргет make setup для создания vault/.vault с интерактивным вводом пароля. В make role test добавлены проверки локального ansible-controller, запрет pull и корректный exit code. Made-with: Cursor --- Makefile | 86 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index d841973..3afbb9f 100644 --- a/Makefile +++ b/Makefile @@ -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 -.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; \ echo ""; \ $(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)..."; \ - 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 \ -u root \ -e ANSIBLE_FORCE_COLOR=1 \ @@ -96,35 +138,49 @@ role: -e MOLECULE_VAULT_ENABLED=$${MOLECULE_VAULT_ENABLED:-false} \ $(DOCKER_IMAGE) \ bash -c " \ + set -Eeuo pipefail; \ + cleanup() { \ + echo ''; \ + echo -e '\033[33m=== ОЧИСТКА РЕСУРСОВ ==='; \ + echo ''; \ + 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 && \ + 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 && \ + 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 && \ + 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 && \ + 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 -e '\033[33m=== ОЧИСТКА РЕСУРСОВ ==='; \ - echo ''; \ - ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && \ + ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini ../../roles/deploy.yml; \ echo ''; \ echo '✅ Тестирование завершено'"; \ + TEST_RC=$$?; \ echo ''; \ - $(MAKE) encrypt-all;; \ + $(MAKE) encrypt-all; \ + exit $$TEST_RC;; \ dryrun) \ echo "🔍 Проверка роли на реальных серверах (dry-run)..."; \ echo ""; \ @@ -1248,6 +1304,7 @@ help: @echo " dockerfiles/ - Docker образы для тестирования" @echo "" @echo "🚀 ОСНОВНЫЕ КОМАНДЫ:" + @echo " make setup - первичная настройка: vault/.vault, каталоги vault и inventory" @echo " make role lint [role] - проверить синтаксис ролей (все или конкретную)" @echo " 💡 Примеры: make role lint, make role lint devops" @echo " make role test [preset] - протестировать роли с preset'ом" @@ -1333,6 +1390,7 @@ help: @echo " make k8s shell [preset] - открыть shell в контейнере k8s" @echo "" @echo "💡 ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:" + @echo " make setup # создать vault/.vault и каталоги (пароль vault)" @echo " make presets list # показать все preset'ы" @echo " make role test minimal # быстрый тест" @echo " make role test all-images # тест всех образов"