feat: Добавлена автоматическая инициализация проекта при первом запуске

- Добавлена проверка инициализации проекта (check-init)
- Автоматический запуск инициализации при первом запуске
- Интерактивная настройка всех параметров проекта
- Создание файлов .env, vault/.vault, molecule/presets/minimal.yml
- Проверка наличия необходимых файлов и папок

Проверка инициализации:
- Проверка наличия .env файла
- Проверка наличия vault/.vault файла
- Проверка наличия папки molecule/presets
- Автоматический запуск инициализации при отсутствии файлов

Интерактивная инициализация:
- Настройка основных параметров проекта (название, версия, автор, сайт)
- Настройка Docker (образ, сеть)
- Настройка лаборатории (сценарий, пресет)
- Настройка Kubernetes (контекст, версии Istio/Kind)
- Настройка путей (папка ролей, файл vault)
- Создание файла .env с всеми настройками
- Создание vault файлов
- Создание минимального пресета лаборатории
- Создание необходимых папок

Преимущества:
- Автоматическая инициализация при первом запуске
- Интерактивная настройка всех параметров
- Значения по умолчанию для быстрой настройки
- Создание всех необходимых файлов и папок
- Проверка инициализации при каждом запуске
- Нет повторной инициализации после настройки

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
2025-10-22 15:36:48 +03:00
parent f45ae8b64e
commit 1909746098
23 changed files with 152 additions and 1865 deletions

143
Makefile
View File

@@ -76,7 +76,7 @@ help: ## Показать справку по всем командам
@echo "$(YELLOW)Подробная документация: docs/$(RESET)"
.PHONY: menu
menu: check-whiptail ## Интерактивное главное меню
menu: check-whiptail check-init ## Интерактивное главное меню
@while true; do \
CHOICE=$$(whiptail --title "Ansible Template - Универсальная лаборатория" \
--menu "Выберите действие:" 20 60 12 \
@@ -112,6 +112,147 @@ menu: check-whiptail ## Интерактивное главное меню
esac; \
done
# =============================================================================
# ПРОВЕРКИ ИНИЦИАЛИЗАЦИИ
# =============================================================================
.PHONY: check-init
check-init: ## Проверить инициализацию проекта
@if [ ! -f .env ] || [ ! -f vault/.vault ] || [ ! -d molecule/presets ]; then \
echo "$(YELLOW)🔧 Первый запуск проекта - требуется инициализация$(RESET)"; \
echo "$(CYAN)🚀 Добро пожаловать в Ansible Template!$(RESET)"; \
echo "$(BLUE)Добро пожаловать в универсальную лабораторию для тестирования Ansible ролей!$(RESET)"; \
echo "$(BLUE)Для начала работы необходимо выполнить инициализацию проекта.$(RESET)"; \
echo "$(BLUE)Это займет всего несколько минут и включает:$(RESET)"; \
echo "$(BLUE)• Настройку переменных окружения$(RESET)"; \
echo "$(BLUE)• Создание vault файлов$(RESET)"; \
echo "$(BLUE)• Подготовку пресетов лаборатории$(RESET)"; \
echo ""; \
echo "$(YELLOW)Нажмите Enter для начала инициализации...$(RESET)"; \
read -r; \
make init-interactive; \
fi
.PHONY: init-interactive
init-interactive: ## Интерактивная инициализация проекта
@echo "$(CYAN)🚀 Инициализация проекта Ansible Template$(RESET)"; \
echo "$(BLUE)📝 Настройка основных параметров проекта$(RESET)"; \
echo "$(YELLOW)Используйте значения по умолчанию (нажмите Enter) или введите свои значения$(RESET)"; \
echo ""; \
echo -n "$(BLUE)Название проекта [ansible-template]: $(RESET)"; \
read -r PROJECT_NAME; \
PROJECT_NAME=$${PROJECT_NAME:-ansible-template}; \
echo -n "$(BLUE)Версия проекта [0.1.0]: $(RESET)"; \
read -r VERSION; \
VERSION=$${VERSION:-0.1.0}; \
echo -n "$(BLUE)Автор проекта [Сергей Антропов]: $(RESET)"; \
read -r AUTHOR; \
AUTHOR=$${AUTHOR:-Сергей Антропов}; \
echo -n "$(BLUE)Сайт проекта [https://devops.org.ru]: $(RESET)"; \
read -r SITE; \
SITE=$${SITE:-https://devops.org.ru}; \
echo ""; \
echo "$(BLUE)🐳 Настройка Docker$(RESET)"; \
echo -n "$(BLUE)Docker образ для Ansible [quay.io/ansible/creator-ee:latest]: $(RESET)"; \
read -r DOCKER_IMAGE; \
DOCKER_IMAGE=$${DOCKER_IMAGE:-quay.io/ansible/creator-ee:latest}; \
echo -n "$(BLUE)Docker сеть [labnet]: $(RESET)"; \
read -r DOCKER_NETWORK; \
DOCKER_NETWORK=$${DOCKER_NETWORK:-labnet}; \
echo ""; \
echo "$(BLUE)🧪 Настройка лаборатории$(RESET)"; \
echo -n "$(BLUE)Сценарий Molecule [universal]: $(RESET)"; \
read -r SCENARIO; \
SCENARIO=$${SCENARIO:-universal}; \
echo -n "$(BLUE)Пресет лаборатории [molecule/presets/minimal.yml]: $(RESET)"; \
read -r LAB_SPEC; \
LAB_SPEC=$${LAB_SPEC:-molecule/presets/minimal.yml}; \
echo ""; \
echo "$(BLUE)☸️ Настройка Kubernetes$(RESET)"; \
echo -n "$(BLUE)Kubernetes контекст [kind-lab]: $(RESET)"; \
read -r KUBE_CONTEXT; \
KUBE_CONTEXT=$${KUBE_CONTEXT:-kind-lab}; \
echo -n "$(BLUE)Версия Istio [1.22.1]: $(RESET)"; \
read -r ISTIO_VERSION; \
ISTIO_VERSION=$${ISTIO_VERSION:-1.22.1}; \
echo -n "$(BLUE)Версия Kind [v0.23.0]: $(RESET)"; \
read -r KIND_VERSION; \
KIND_VERSION=$${KIND_VERSION:-v0.23.0}; \
echo ""; \
echo "$(BLUE)📁 Настройка путей$(RESET)"; \
echo -n "$(BLUE)Папка ролей [./roles]: $(RESET)"; \
read -r ROLES_DIR; \
ROLES_DIR=$${ROLES_DIR:-./roles}; \
echo -n "$(BLUE)Файл пароля vault [vault/.vault]: $(RESET)"; \
read -r VAULT_PASSWORD_FILE; \
VAULT_PASSWORD_FILE=$${VAULT_PASSWORD_FILE:-vault/.vault}; \
echo ""; \
echo "$(BLUE)📝 Создание файла .env$(RESET)"; \
echo "# Ansible Template - Универсальная лаборатория" > .env; \
echo "# Автор: $$AUTHOR" >> .env; \
echo "# Сайт: $$SITE" >> .env; \
echo "# Версия: $$VERSION" >> .env; \
echo "" >> .env; \
echo "# Основные переменные" >> .env; \
echo "PROJECT_NAME=$$PROJECT_NAME" >> .env; \
echo "VERSION=$$VERSION" >> .env; \
echo "AUTHOR=$$AUTHOR" >> .env; \
echo "SITE=$$SITE" >> .env; \
echo "" >> .env; \
echo "# Docker переменные" >> .env; \
echo "DOCKER_IMAGE=$$DOCKER_IMAGE" >> .env; \
echo "DOCKER_COMPOSE=docker compose" >> .env; \
echo "DOCKER_NETWORK=$$DOCKER_NETWORK" >> .env; \
echo "" >> .env; \
echo "# Molecule переменные" >> .env; \
echo "SCENARIO=$$SCENARIO" >> .env; \
echo "LAB_SPEC=$$LAB_SPEC" >> .env; \
echo "MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule" >> .env; \
echo "" >> .env; \
echo "# Kubernetes переменные" >> .env; \
echo "KUBE_CONTEXT=$$KUBE_CONTEXT" >> .env; \
echo "ISTIO_VERSION=$$ISTIO_VERSION" >> .env; \
echo "KIND_VERSION=$$KIND_VERSION" >> .env; \
echo "" >> .env; \
echo "# Переменные окружения" >> .env; \
echo "ENV_FILE=.env" >> .env; \
echo "ROLES_DIR=$$ROLES_DIR" >> .env; \
echo "VAULT_PASSWORD_FILE=$$VAULT_PASSWORD_FILE" >> .env; \
echo "$(BLUE)🔐 Создание vault файлов$(RESET)"; \
mkdir -p vault; \
echo "ansible-vault-password" > vault/.vault; \
echo "$(BLUE)📋 Создание пресетов лаборатории$(RESET)"; \
mkdir -p molecule/presets; \
echo "---" > molecule/presets/minimal.yml; \
echo "# Минимальный пресет лаборатории" >> molecule/presets/minimal.yml; \
echo "# Автор: $$AUTHOR" >> molecule/presets/minimal.yml; \
echo "# Сайт: $$SITE" >> molecule/presets/minimal.yml; \
echo "" >> molecule/presets/minimal.yml; \
echo "hosts:" >> molecule/presets/minimal.yml; \
echo " - name: host1" >> molecule/presets/minimal.yml; \
echo " family: debian" >> molecule/presets/minimal.yml; \
echo " groups: [all]" >> molecule/presets/minimal.yml; \
echo "" >> molecule/presets/minimal.yml; \
echo "features:" >> molecule/presets/minimal.yml; \
echo " docker: true" >> molecule/presets/minimal.yml; \
echo " dind: false" >> molecule/presets/minimal.yml; \
echo " k8s: false" >> molecule/presets/minimal.yml; \
echo " istio: false" >> molecule/presets/minimal.yml; \
echo " monitoring: false" >> molecule/presets/minimal.yml; \
echo " chaos: false" >> molecule/presets/minimal.yml; \
echo "$(BLUE)📁 Создание необходимых папок$(RESET)"; \
mkdir -p roles molecule/universal reports docs; \
echo ""; \
echo "$(GREEN)✅ Инициализация проекта завершена!$(RESET)"; \
echo "$(GREEN)Созданы файлы:$(RESET)"; \
echo "$(GREEN)• .env - переменные окружения$(RESET)"; \
echo "$(GREEN)• vault/.vault - пароль vault$(RESET)"; \
echo "$(GREEN)• molecule/presets/minimal.yml - минимальный пресет$(RESET)"; \
echo ""; \
echo "$(YELLOW)Теперь вы можете использовать все возможности лаборатории!$(RESET)"; \
echo "$(YELLOW)Нажмите Enter для продолжения...$(RESET)"; \
read -r
# =============================================================================
# ИНТЕРАКТИВНЫЕ МЕНЮ
# =============================================================================