From f2a0f46813c39721776b80042efc1ae2c8d4f1ec Mon Sep 17 00:00:00 2001 From: Sergey Antropoff Date: Wed, 22 Oct 2025 13:37:48 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9F=D0=BE=D0=BB=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C=D1=8E=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=20Makefile=20=D1=81=20=D0=BC=D0=B0=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Создан новый Makefile с унифицированными командами - Команды теперь работают как: make lab up, make kube sh, make preset list - Добавлена поддержка .env файла для конфигурации - Созданы команды для автоматизации всех аспектов работы: Основные команды: - make help - справка по всем командам - make init - полная инициализация проекта - make setup-env - создание .env файла - make setup-vault - создание vault-password.txt - make setup-roles - создание директории ролей - make setup-precommit - установка pre-commit хуков Лаборатория (make lab): - make lab up/down/sh/test/create/converge/verify/destroy/reset - Полная автоматизация работы с лабораторией - Цветной вывод и информативные сообщения Kubernetes (make kube): - make kube sh/cmd/enter/kiali/istio/grafana/prom/pf-stop - Управление Kubernetes кластерами - Port-forward для всех сервисов мониторинга Пресеты (make preset): - make preset list/create/edit/test/copy - Автоматическое создание новых пресетов - Копирование существующих пресетов - Тестирование пресетов Роли (make role): - make role list/create/edit/test/lint/deploy - Автоматическое создание структуры ролей - Тестирование и линтинг ролей Vault (make vault): - make vault show/create/edit/delete/rekey/decrypt/encrypt - Полное управление Ansible Vault Git (make git): - make git status/add/commit/push/pull/branch/merge - Автоматизация работы с Git Docker (make docker): - make docker build/rebuild/prune/shell/logs/stop/start - Управление Docker контейнерами Утилиты: - make report - генерация HTML отчетов - make snapshot/restore - управление снапшотами - make cleanup - очистка лаборатории - make env - показ переменных окружения - make clean - полная очистка проекта Особенности: - Цветной вывод для лучшего UX - Информативные сообщения о выполняемых действиях - Автоматическая загрузка переменных из .env файла - Валидация параметров команд - Подробная справка по всем командам - Единообразный интерфейс для всех операций Создан env.example с примером конфигурации Обновлен README.md с новыми командами Добавлена поддержка всех 21 пресета Интеграция с существующей документацией Автор: Сергей Антропов Сайт: https://devops.org.ru --- Makefile | 805 ++++++++++++++++++++++++++++++++++++---------------- README.md | 67 ++++- env.example | 73 ++++- 3 files changed, 682 insertions(+), 263 deletions(-) diff --git a/Makefile b/Makefile index 1038187..bfcaa9b 100644 --- a/Makefile +++ b/Makefile @@ -1,271 +1,580 @@ -# Глобальные переменные -IMAGE ?= ansible -TAG ?= 0.1 -REGISTRY ?= inecs/ansible -# По умолчанию используем docker. Для локальной разработки используйте docker-compose -RUN_MODE ?= docker +# ============================================================================= +# Ansible Template - Универсальная лаборатория для тестирования Ansible ролей +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru +# ============================================================================= -# Определение команды RUN в зависимости от RUN_MODE -ifeq ($(RUN_MODE), docker-compose) - RUN = docker compose run --rm $(IMAGE) -else ifeq ($(RUN_MODE), docker) - RUN = docker run -it --rm \ - --name $(IMAGE) \ - -v $(PWD):/ansible \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro \ - -e ANSIBLE_VAULT_PASSWORD_FILE=/ansible/vault-password.txt \ - --privileged \ - --workdir /ansible \ - $(REGISTRY)/$(IMAGE) -else - $(error Invalid RUN_MODE. Use "docker-compose" or "docker") -endif +# ============================================================================= +# ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ +# ============================================================================= -view create edit show delete test lint deploy new init build rebuild prune release images push pull shell: - @true +# Основные переменные +PROJECT_NAME ?= ansible-template +VERSION ?= 0.1.0 +AUTHOR ?= "Сергей Антропов" +SITE ?= "https://devops.org.ru" -#################################################################################################### -# Инициализация новой роли -#################################################################################################### -init: - @echo "Шаг 1: Создание Docker-образа..." - @make docker build - @echo "Шаг 2: Создание Docker-образов для запуска Molecule..." - @make docker images - @echo "Шаг 3: Создание нового vault-файла с паролем..." - @read -p "Введите пароль для vault: " VAULT_PASSWORD; \ - echo "$$VAULT_PASSWORD" > vault-password.txt; \ - make vault create - @echo "Шаг 4: Создание нового брэнча в гите..." - @make git new - @echo "Шаг 5: Создание новой роли..." - @make role new +# Docker переменные +DOCKER_IMAGE ?= quay.io/ansible/creator-ee:latest +DOCKER_COMPOSE ?= docker compose +DOCKER_NETWORK ?= labnet -#################################################################################################### -# Управление контейнерами с помощью docker compose или docker run -#################################################################################################### -docker: +# Molecule переменные +SCENARIO ?= universal +LAB_SPEC ?= molecule/presets/minimal.yml +MOLECULE_EPHEMERAL_DIRECTORY ?= /tmp/molecule + +# Kubernetes переменные +KUBE_CONTEXT ?= kind-lab +ISTIO_VERSION ?= 1.22.1 +KIND_VERSION ?= v0.23.0 + +# Переменные окружения +ENV_FILE ?= .env +ROLES_DIR ?= ./roles +VAULT_PASSWORD_FILE ?= vault-password.txt + +# Цвета для вывода +RED := \033[0;31m +GREEN := \033[0;32m +YELLOW := \033[0;33m +BLUE := \033[0;34m +PURPLE := \033[0;35m +CYAN := \033[0;36m +WHITE := \033[0;37m +RESET := \033[0m + +# ============================================================================= +# ОСНОВНЫЕ КОМАНДЫ +# ============================================================================= + +.PHONY: help +help: ## Показать справку по всем командам + @echo "$(CYAN)Ansible Template - Универсальная лаборатория$(RESET)" + @echo "$(YELLOW)Автор: $(AUTHOR)$(RESET)" + @echo "$(YELLOW)Сайт: $(SITE)$(RESET)" + @echo "" + @echo "$(GREEN)Основные команды:$(RESET)" + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' $(MAKEFILE_LIST) | grep -E "^(init|setup|clean|help)" + @echo "" + @echo "$(GREEN)Лаборатория:$(RESET)" + @awk 'BEGIN {FS = ":.*?## "} /^lab-[a-zA-Z_-]+:.*?## / {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' $(MAKEFILE_LIST) + @echo "" + @echo "$(GREEN)Kubernetes:$(RESET)" + @awk 'BEGIN {FS = ":.*?## "} /^kube-[a-zA-Z_-]+:.*?## / {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' $(MAKEFILE_LIST) + @echo "" + @echo "$(GREEN)Пресеты:$(RESET)" + @awk 'BEGIN {FS = ":.*?## "} /^preset-[a-zA-Z_-]+:.*?## / {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' $(MAKEFILE_LIST) + @echo "" + @echo "$(GREEN)Роли:$(RESET)" + @awk 'BEGIN {FS = ":.*?## "} /^role-[a-zA-Z_-]+:.*?## / {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' $(MAKEFILE_LIST) + @echo "" + @echo "$(GREEN)Утилиты:$(RESET)" + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " $(CYAN)%-20s$(RESET) %s\n", $$1, $$2}' $(MAKEFILE_LIST) | grep -E "^(env|vault|git|docker|report|snapshot|cleanup)" + +# ============================================================================= +# ИНИЦИАЛИЗАЦИЯ И НАСТРОЙКА +# ============================================================================= + +.PHONY: init +init: setup-env setup-vault setup-roles setup-precommit ## Полная инициализация проекта + @echo "$(GREEN)✅ Проект успешно инициализирован!$(RESET)" + @echo "$(YELLOW)📖 Документация: $(SITE)$(RESET)" + @echo "$(YELLOW)🚀 Быстрый старт: make lab up$(RESET)" + +.PHONY: setup-env +setup-env: ## Создать .env файл с настройками + @if [ ! -f $(ENV_FILE) ]; then \ + echo "$(YELLOW)Создание .env файла...$(RESET)"; \ + echo "# Ansible Template Environment" > $(ENV_FILE); \ + echo "PROJECT_NAME=$(PROJECT_NAME)" >> $(ENV_FILE); \ + echo "VERSION=$(VERSION)" >> $(ENV_FILE); \ + echo "AUTHOR=$(AUTHOR)" >> $(ENV_FILE); \ + echo "SITE=$(SITE)" >> $(ENV_FILE); \ + echo "" >> $(ENV_FILE); \ + echo "# Docker settings" >> $(ENV_FILE); \ + echo "DOCKER_IMAGE=$(DOCKER_IMAGE)" >> $(ENV_FILE); \ + echo "DOCKER_NETWORK=$(DOCKER_NETWORK)" >> $(ENV_FILE); \ + echo "" >> $(ENV_FILE); \ + echo "# Molecule settings" >> $(ENV_FILE); \ + echo "SCENARIO=$(SCENARIO)" >> $(ENV_FILE); \ + echo "LAB_SPEC=$(LAB_SPEC)" >> $(ENV_FILE); \ + echo "" >> $(ENV_FILE); \ + echo "# Kubernetes settings" >> $(ENV_FILE); \ + echo "KUBE_CONTEXT=$(KUBE_CONTEXT)" >> $(ENV_FILE); \ + echo "ISTIO_VERSION=$(ISTIO_VERSION)" >> $(ENV_FILE); \ + echo "KIND_VERSION=$(KIND_VERSION)" >> $(ENV_FILE); \ + echo "" >> $(ENV_FILE); \ + echo "# Paths" >> $(ENV_FILE); \ + echo "ROLES_DIR=$(ROLES_DIR)" >> $(ENV_FILE); \ + echo "VAULT_PASSWORD_FILE=$(VAULT_PASSWORD_FILE)" >> $(ENV_FILE); \ + echo "$(GREEN)✅ .env файл создан$(RESET)"; \ + else \ + echo "$(YELLOW)⚠️ .env файл уже существует$(RESET)"; \ + fi + +.PHONY: setup-vault +setup-vault: ## Создать vault-password.txt + @if [ ! -f $(VAULT_PASSWORD_FILE) ]; then \ + echo "$(YELLOW)Создание vault-password.txt...$(RESET)"; \ + echo "ansible-vault-password" > $(VAULT_PASSWORD_FILE); \ + echo "$(GREEN)✅ vault-password.txt создан$(RESET)"; \ + else \ + echo "$(YELLOW)⚠️ vault-password.txt уже существует$(RESET)"; \ + fi + +.PHONY: setup-roles +setup-roles: ## Создать директорию для ролей + @mkdir -p $(ROLES_DIR) + @echo "$(GREEN)✅ Директория ролей создана: $(ROLES_DIR)$(RESET)" + +.PHONY: setup-precommit +setup-precommit: ## Установить pre-commit хуки + @if command -v pre-commit >/dev/null 2>&1; then \ + pre-commit install; \ + echo "$(GREEN)✅ Pre-commit хуки установлены$(RESET)"; \ + else \ + echo "$(YELLOW)⚠️ pre-commit не установлен. Установите: pip install pre-commit$(RESET)"; \ + fi + +# ============================================================================= +# УПРАВЛЕНИЕ ЛАБОРАТОРИЕЙ +# ============================================================================= + +.PHONY: lab +lab: ## Управление лабораторией (up|down|sh|test|create|converge|verify|destroy|reset) + @case "$(word 2, $(MAKECMDGOALS))" in \ + up) \ + echo "$(GREEN)🚀 Поднимаем контроллер...$(RESET)"; \ + $(DOCKER_COMPOSE) up -d; \ + echo "$(GREEN)✅ Контроллер запущен$(RESET)";; \ + down) \ + echo "$(YELLOW)🛑 Останавливаем контроллер...$(RESET)"; \ + $(DOCKER_COMPOSE) down -v; \ + echo "$(GREEN)✅ Контроллер остановлен$(RESET)";; \ + sh) \ + echo "$(BLUE)🐚 Входим в контроллер...$(RESET)"; \ + docker exec -it ansible-controller bash;; \ + test) \ + echo "$(PURPLE)🧪 Запускаем полный цикл тестирования...$(RESET)"; \ + $(MAKE) lab up; \ + docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=$(MOLECULE_EPHEMERAL_DIRECTORY) ansible-controller \ + bash -lc 'cd /ansible && molecule test -s $(SCENARIO)'; \ + echo "$(GREEN)✅ Тестирование завершено$(RESET)";; \ + create) \ + echo "$(BLUE)🏗️ Создаем инфраструктуру...$(RESET)"; \ + $(MAKE) lab up; \ + docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=$(MOLECULE_EPHEMERAL_DIRECTORY) ansible-controller \ + bash -lc 'cd /ansible && molecule create -s $(SCENARIO)'; \ + echo "$(GREEN)✅ Инфраструктура создана$(RESET)";; \ + converge) \ + echo "$(YELLOW)⚙️ Запускаем роли...$(RESET)"; \ + docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=$(MOLECULE_EPHEMERAL_DIRECTORY) ansible-controller \ + bash -lc 'cd /ansible && molecule converge -s $(SCENARIO)'; \ + echo "$(GREEN)✅ Роли выполнены$(RESET)";; \ + verify) \ + echo "$(CYAN)🔍 Проверяем работу лаборатории...$(RESET)"; \ + docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=$(MOLECULE_EPHEMERAL_DIRECTORY) ansible-controller \ + bash -lc 'cd /ansible && molecule verify -s $(SCENARIO)'; \ + echo "$(GREEN)✅ Проверка завершена$(RESET)";; \ + destroy) \ + echo "$(RED)💥 Уничтожаем инфраструктуру...$(RESET)"; \ + docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=$(MOLECULE_EPHEMERAL_DIRECTORY) ansible-controller \ + bash -lc 'cd /ansible && molecule destroy -s $(SCENARIO)'; \ + echo "$(GREEN)✅ Инфраструктура уничтожена$(RESET)";; \ + reset) \ + echo "$(PURPLE)🔄 Полный сброс лаборатории...$(RESET)"; \ + $(MAKE) lab destroy; \ + $(MAKE) lab down; \ + $(MAKE) lab up; \ + echo "$(GREEN)✅ Лаборатория сброшена$(RESET)";; \ + *) \ + echo "$(RED)❌ Неизвестная команда. Доступные: up, down, sh, test, create, converge, verify, destroy, reset$(RESET)";; \ + esac + +# ============================================================================= +# УПРАВЛЕНИЕ KUBERNETES +# ============================================================================= + +.PHONY: kube +kube: ## Управление Kubernetes (sh|cmd|enter|kiali|istio|grafana|prom|pf-stop) + @case "$(word 2, $(MAKECMDGOALS))" in \ + sh) \ + echo "$(BLUE)🐚 Входим в контейнер с kubectl...$(RESET)"; \ + docker exec -it ansible-controller bash;; \ + cmd) \ + if [ -z "$(CLUSTER)" ]; then \ + echo "$(RED)❌ Использование: make kube cmd CLUSTER=lab CMD=\"get pods -A\"$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(CYAN)🔧 Выполняем kubectl команду...$(RESET)"; \ + docker exec -it ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) $(CMD)';; \ + enter) \ + if [ -z "$(CLUSTER)" ]; then \ + echo "$(RED)❌ Использование: make kube enter CLUSTER=lab$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(BLUE)🚪 Входим в кластер...$(RESET)"; \ + docker exec -it ansible-controller bash -lc '\ + POD=$$(kubectl --context kind-$(CLUSTER) -n lab-demo get pod -l app=toolbox -o jsonpath="{.items[0].metadata.name}"); \ + [ -n "$$POD" ] || { echo "toolbox pod not found"; exit 1; }; \ + kubectl --context kind-$(CLUSTER) -n lab-demo exec -it $$POD -- /bin/sh';; \ + kiali) \ + if [ -z "$(CLUSTER)" ]; then \ + echo "$(RED)❌ Использование: make kube kiali CLUSTER=lab$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(PURPLE)🔮 Port-forward Kiali...$(RESET)"; \ + docker exec -d ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) -n istio-system port-forward svc/kiali 20001:20001'; \ + echo "$(GREEN)✅ Kiali: http://localhost:20001$(RESET)";; \ + istio) \ + if [ -z "$(CLUSTER)" ]; then \ + echo "$(RED)❌ Использование: make kube istio CLUSTER=lab$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(PURPLE)🌐 Port-forward Istio Gateway...$(RESET)"; \ + docker exec -d ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) -n istio-system port-forward svc/istio-ingressgateway 8082:80 8444:443'; \ + echo "$(GREEN)✅ Istio GW: http://localhost:8082 https://localhost:8444$(RESET)";; \ + grafana) \ + if [ -z "$(CLUSTER)" ]; then \ + echo "$(RED)❌ Использование: make kube grafana CLUSTER=lab$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(BLUE)📊 Port-forward Grafana...$(RESET)"; \ + docker exec -d ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) -n monitoring port-forward svc/monitoring-grafana 3000:80'; \ + echo "$(GREEN)✅ Grafana: http://localhost:3000 (admin/admin)$(RESET)";; \ + prom) \ + if [ -z "$(CLUSTER)" ]; then \ + echo "$(RED)❌ Использование: make kube prom CLUSTER=lab$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(YELLOW)📈 Port-forward Prometheus...$(RESET)"; \ + docker exec -d ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) -n monitoring port-forward svc/monitoring-kube-prometheus-prometheus 9090:9090'; \ + echo "$(GREEN)✅ Prometheus: http://localhost:9090$(RESET)";; \ + pf-stop) \ + echo "$(RED)🛑 Останавливаем все port-forward...$(RESET)"; \ + docker exec -it ansible-controller bash -lc 'pkill -f "kubectl .* port-forward" || true'; \ + echo "$(GREEN)✅ Port-forward остановлены$(RESET)";; \ + *) \ + echo "$(RED)❌ Неизвестная команда. Доступные: sh, cmd, enter, kiali, istio, grafana, prom, pf-stop$(RESET)";; \ + esac + +# ============================================================================= +# УПРАВЛЕНИЕ ПРЕСЕТАМИ +# ============================================================================= + +.PHONY: preset +preset: ## Управление пресетами (list|create|edit|test|copy) + @case "$(word 2, $(MAKECMDGOALS))" in \ + list) \ + echo "$(CYAN)📋 Доступные пресеты:$(RESET)"; \ + echo ""; \ + echo "$(GREEN)Классические пресеты:$(RESET)"; \ + echo " minimal.yml - Минимальная лаборатория (1-3 машины)"; \ + echo " webapp.yml - Веб-приложение (3-5 машин)"; \ + echo " microservices.yml - Микросервисы (5-8 машин)"; \ + echo " ha.yml - Высокая доступность (6-10 машин)"; \ + echo " k8s-cluster.yml - Kubernetes кластер (8-12 машин)"; \ + echo " cicd.yml - CI/CD пайплайн (10-15 машин)"; \ + echo " bigdata.yml - Big Data кластер (12-18 машин)"; \ + echo " servicemesh.yml - Service Mesh (15-20 машин)"; \ + echo " enterprise.yml - Enterprise (18-20 машин)"; \ + echo " maximum.yml - Максимальный (20 машин)"; \ + echo ""; \ + echo "$(GREEN)Kubernetes пресеты:$(RESET)"; \ + echo " k8s-single.yml - Kubernetes Single Node"; \ + echo " k8s-multi.yml - Kubernetes Multi-Cluster"; \ + echo " k8s-istio-full.yml - Kubernetes + Istio Full Stack"; \ + echo ""; \ + echo "$(GREEN)DinD пресеты:$(RESET)"; \ + echo " dind-simple.yml - DinD Simple"; \ + echo " dind-swarm.yml - DinD Swarm"; \ + echo " dind-compose.yml - DinD Compose"; \ + echo ""; \ + echo "$(GREEN)DOoD пресеты:$(RESET)"; \ + echo " dood-simple.yml - DOoD Simple"; \ + echo " dood-mixed.yml - DOoD Mixed"; \ + echo ""; \ + echo "$(GREEN)Смешанные пресеты:$(RESET)"; \ + echo " mixed-k8s-dind.yml - Mixed Kubernetes + DinD"; \ + echo " mixed-k8s-dood.yml - Mixed Kubernetes + DOoD"; \ + echo " mixed-full.yml - Mixed Full Stack";; \ + create) \ + if [ -z "$(NAME)" ]; then \ + echo "$(RED)❌ Использование: make preset create NAME=my-preset$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(YELLOW)📝 Создаем пресет: $(NAME).yml$(RESET)"; \ + $(MAKE) preset copy SOURCE=minimal.yml TARGET=$(NAME).yml; \ + echo "$(GREEN)✅ Пресет создан: molecule/presets/$(NAME).yml$(RESET)";; \ + edit) \ + if [ -z "$(NAME)" ]; then \ + echo "$(RED)❌ Использование: make preset edit NAME=my-preset$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(BLUE)✏️ Редактируем пресет: $(NAME).yml$(RESET)"; \ + $${EDITOR:-vim} molecule/presets/$(NAME).yml;; \ + test) \ + if [ -z "$(NAME)" ]; then \ + echo "$(RED)❌ Использование: make preset test NAME=my-preset$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(PURPLE)🧪 Тестируем пресет: $(NAME).yml$(RESET)"; \ + $(MAKE) lab test LAB_SPEC=molecule/presets/$(NAME).yml;; \ + copy) \ + if [ -z "$(SOURCE)" ] || [ -z "$(TARGET)" ]; then \ + echo "$(RED)❌ Использование: make preset copy SOURCE=minimal.yml TARGET=my-preset.yml$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(YELLOW)📋 Копируем пресет: $(SOURCE) -> $(TARGET)$(RESET)"; \ + cp molecule/presets/$(SOURCE) molecule/presets/$(TARGET); \ + echo "$(GREEN)✅ Пресет скопирован$(RESET)";; \ + *) \ + echo "$(RED)❌ Неизвестная команда. Доступные: list, create, edit, test, copy$(RESET)";; \ + esac + +# ============================================================================= +# УПРАВЛЕНИЕ РОЛЯМИ +# ============================================================================= + +.PHONY: role +role: ## Управление ролями (list|create|edit|test|lint|deploy) + @case "$(word 2, $(MAKECMDGOALS))" in \ + list) \ + echo "$(CYAN)📋 Доступные роли:$(RESET)"; \ + if [ -d "$(ROLES_DIR)" ]; then \ + ls -la $(ROLES_DIR)/ | grep "^d" | awk '{print " " $$9}' | grep -v "^\.$\|^\.\.$"; \ + else \ + echo " $(YELLOW)Директория ролей не найдена$(RESET)"; \ + fi;; \ + create) \ + if [ -z "$(NAME)" ]; then \ + echo "$(RED)❌ Использование: make role create NAME=my-role$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(YELLOW)📝 Создаем роль: $(NAME)$(RESET)"; \ + mkdir -p $(ROLES_DIR)/$(NAME)/{tasks,handlers,templates,files,vars,defaults,meta,tests}; \ + echo "---" > $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo "# Основные задачи роли $(NAME)" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo "" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo "- name: Install package" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo " package:" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo " name: \"{{ package_name }}\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo " state: present" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo "" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo "- name: Start service" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo " service:" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo " name: \"{{ service_name }}\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo " state: started" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo " enabled: true" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \ + echo "---" > $(ROLES_DIR)/$(NAME)/defaults/main.yml; \ + echo "# Переменные по умолчанию для роли $(NAME)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \ + echo "" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \ + echo "package_name: nginx" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \ + echo "service_name: nginx" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \ + echo "$(GREEN)✅ Роль создана: $(ROLES_DIR)/$(NAME)/$(RESET)";; \ + edit) \ + if [ -z "$(NAME)" ]; then \ + echo "$(RED)❌ Использование: make role edit NAME=my-role$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(BLUE)✏️ Редактируем роль: $(NAME)$(RESET)"; \ + $${EDITOR:-vim} $(ROLES_DIR)/$(NAME)/tasks/main.yml;; \ + test) \ + if [ -z "$(NAME)" ]; then \ + echo "$(RED)❌ Использование: make role test NAME=my-role$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(PURPLE)🧪 Тестируем роль: $(NAME)$(RESET)"; \ + $(MAKE) lab test LAB_SPEC=molecule/presets/minimal.yml;; \ + lint) \ + echo "$(YELLOW)🔍 Проверяем роли...$(RESET)"; \ + docker exec ansible-controller bash -lc 'ansible-lint $(ROLES_DIR)/*'; \ + echo "$(GREEN)✅ Проверка завершена$(RESET)";; \ + deploy) \ + echo "$(PURPLE)🚀 Развертываем роли...$(RESET)"; \ + docker exec ansible-controller bash -lc 'ansible-playbook files/playbooks/site.yml'; \ + echo "$(GREEN)✅ Развертывание завершено$(RESET)";; \ + *) \ + echo "$(RED)❌ Неизвестная команда. Доступные: list, create, edit, test, lint, deploy$(RESET)";; \ + esac + +# ============================================================================= +# УПРАВЛЕНИЕ VAULT +# ============================================================================= + +.PHONY: vault +vault: ## Управление Ansible Vault (show|create|edit|delete|rekey|decrypt|encrypt) + @case "$(word 2, $(MAKECMDGOALS))" in \ + show) \ + echo "$(BLUE)🔍 Показываем содержимое vault...$(RESET)"; \ + docker exec ansible-controller bash -lc 'ansible-vault view --vault-password-file $(VAULT_PASSWORD_FILE) vars/secrets.yml';; \ + create) \ + echo "$(YELLOW)📝 Создаем vault файл...$(RESET)"; \ + docker exec ansible-controller bash -lc 'ansible-vault create --encrypt-vault-id default --vault-password-file $(VAULT_PASSWORD_FILE) vars/secrets.yml';; \ + edit) \ + echo "$(BLUE)✏️ Редактируем vault файл...$(RESET)"; \ + docker exec ansible-controller bash -lc 'ansible-vault edit --vault-password-file $(VAULT_PASSWORD_FILE) vars/secrets.yml';; \ + delete) \ + echo "$(RED)🗑️ Удаляем vault файл...$(RESET)"; \ + docker exec ansible-controller bash -lc 'rm vars/secrets.yml';; \ + rekey) \ + echo "$(YELLOW)🔑 Изменяем пароль vault...$(RESET)"; \ + docker exec ansible-controller bash -lc 'ansible-vault rekey --vault-password-file $(VAULT_PASSWORD_FILE) vars/secrets.yml';; \ + decrypt) \ + echo "$(GREEN)🔓 Расшифровываем vault файл...$(RESET)"; \ + docker exec ansible-controller bash -lc 'ansible-vault decrypt --vault-password-file $(VAULT_PASSWORD_FILE) vars/secrets.yml';; \ + encrypt) \ + echo "$(RED)🔒 Шифруем vault файл...$(RESET)"; \ + docker exec ansible-controller bash -lc 'ansible-vault encrypt --encrypt-vault-id default --vault-password-file $(VAULT_PASSWORD_FILE) vars/secrets.yml';; \ + *) \ + echo "$(RED)❌ Неизвестная команда. Доступные: show, create, edit, delete, rekey, decrypt, encrypt$(RESET)";; \ + esac + +# ============================================================================= +# УПРАВЛЕНИЕ GIT +# ============================================================================= + +.PHONY: git +git: ## Управление Git (status|add|commit|push|pull|branch|merge) + @case "$(word 2, $(MAKECMDGOALS))" in \ + status) \ + echo "$(CYAN)📊 Статус Git репозитория:$(RESET)"; \ + git status;; \ + add) \ + echo "$(GREEN)➕ Добавляем файлы в Git...$(RESET)"; \ + git add .;; \ + commit) \ + if [ -z "$(MESSAGE)" ]; then \ + echo "$(RED)❌ Использование: make git commit MESSAGE=\"your commit message\"$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(YELLOW)💾 Создаем коммит...$(RESET)"; \ + git commit -m "$(MESSAGE)";; \ + push) \ + echo "$(BLUE)🚀 Отправляем изменения...$(RESET)"; \ + git push;; \ + pull) \ + echo "$(GREEN)📥 Получаем изменения...$(RESET)"; \ + git pull;; \ + branch) \ + if [ -z "$(NAME)" ]; then \ + echo "$(RED)❌ Использование: make git branch NAME=my-branch$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(PURPLE)🌿 Создаем ветку: $(NAME)$(RESET)"; \ + git checkout -b $(NAME);; \ + merge) \ + if [ -z "$(BRANCH)" ]; then \ + echo "$(RED)❌ Использование: make git merge BRANCH=my-branch$(RESET)"; \ + exit 1; \ + fi; \ + echo "$(YELLOW)🔀 Сливаем ветку: $(BRANCH)$(RESET)"; \ + git merge $(BRANCH);; \ + *) \ + echo "$(RED)❌ Неизвестная команда. Доступные: status, add, commit, push, pull, branch, merge$(RESET)";; \ + esac + +# ============================================================================= +# УПРАВЛЕНИЕ DOCKER +# ============================================================================= + +.PHONY: docker +docker: ## Управление Docker (build|rebuild|prune|shell|logs|stop|start) @case "$(word 2, $(MAKECMDGOALS))" in \ build) \ - docker buildx create --use --name multiarch-builder --driver docker-container; \ - if [ "$(RUN_MODE)" = "docker-compose" ]; then \ - docker compose build $(c); \ - else \ - docker build -t $(REGISTRY)/$(IMAGE) .; \ - fi;; \ + echo "$(YELLOW)🔨 Собираем Docker образы...$(RESET)"; \ + $(DOCKER_COMPOSE) build;; \ rebuild) \ - docker buildx create --use --name multiarch-builder --driver docker-container; \ - if [ "$(RUN_MODE)" = "docker-compose" ]; then \ - docker compose build --no-cache $(c); \ - else \ - docker build --no-cache -t $(REGISTRY)/$(IMAGE) .; \ - fi;; \ + echo "$(YELLOW)🔨 Пересобираем Docker образы...$(RESET)"; \ + $(DOCKER_COMPOSE) build --no-cache;; \ prune) \ + echo "$(RED)🧹 Очищаем Docker...$(RESET)"; \ docker system prune -af;; \ shell) \ - clear; \ - echo "Entering to Ansible container shell..."; \ - $(RUN) bash ;; \ - release) \ - docker buildx create --use --name multiarch-builder --driver docker-container; \ - docker login $(REGISTRY); \ - docker buildx build -t $(REGISTRY)/$(IMAGE):$(TAG) -t $(REGISTRY)/$(IMAGE):latest --platform linux/amd64,linux/arm64 --push .;; \ - images) \ - docker buildx create --use --name multiarch-builder --driver docker-container; \ - echo "Логинимся в Docker Hub..."; \ - docker login; \ - echo "Собираем и пушим основной Ansible образ..."; \ - docker buildx build -t $(REGISTRY)/$(IMAGE):$(TAG) -t $(REGISTRY)/$(IMAGE):latest --platform linux/amd64,linux/arm64 --push .; \ - echo "Собираем и пушим образ CentOS..."; \ - docker buildx build -t $(REGISTRY):centos --platform linux/amd64,linux/arm64 --push -f Dockerfile-CentOS .; \ - echo "Собираем и пушим образ Ubuntu..."; \ - docker buildx build -t $(REGISTRY):ubuntu --platform linux/amd64,linux/arm64 --push -f Dockerfile-Ubuntu .; \ - echo "Образы успешно опубликованы в Docker Hub: $(REGISTRY)";; \ - *) echo "Unknown action. Available actions: build, rebuild, prune, release";; \ + echo "$(BLUE)🐚 Входим в Docker контейнер...$(RESET)"; \ + docker exec -it ansible-controller bash;; \ + logs) \ + echo "$(CYAN)📋 Показываем логи...$(RESET)"; \ + $(DOCKER_COMPOSE) logs -f;; \ + stop) \ + echo "$(RED)🛑 Останавливаем контейнеры...$(RESET)"; \ + $(DOCKER_COMPOSE) stop;; \ + start) \ + echo "$(GREEN)▶️ Запускаем контейнеры...$(RESET)"; \ + $(DOCKER_COMPOSE) start;; \ + *) \ + echo "$(RED)❌ Неизвестная команда. Доступные: build, rebuild, prune, shell, logs, stop, start$(RESET)";; \ esac -#################################################################################################### -# Работа с ролью -#################################################################################################### -vault: - @case "$(word 2, $(MAKECMDGOALS))" in \ - show) $(RUN) bash -c "ansible-vault view --vault-password-file vault-password.txt vars/secrets.yml";; \ - create) $(RUN) bash -c "ansible-vault create --encrypt-vault-id default --vault-password-file vault-password.txt vars/secrets.yml";; \ - edit) $(RUN) bash -c "ansible-vault edit --vault-password-file vault-password.txt vars/secrets.yml";; \ - delete) $(RUN) bash -c "rm vars/secrets.yml";; \ - rekey) $(RUN) bash -c "ansible-vault rekey --vault-password-file vault-password.txt vars/secrets.yml";; \ - decrypt) $(RUN) bash -c "ansible-vault decrypt --vault-password-file vault-password.txt vars/secrets.yml";; \ - encrypt) $(RUN) bash -c "ansible-vault encrypt --encrypt-vault-id default --vault-password-file vault-password.txt vars/secrets.yml";; \ - *) echo "Unknown action";; \ - esac +# ============================================================================= +# ОТЧЕТЫ И МОНИТОРИНГ +# ============================================================================= -role: - @case "$(word 2, $(MAKECMDGOALS))" in \ - new) \ - clear; \ - echo "Введите название новой роли на английском:"; \ - read ROLE_NAME; \ - echo "Введите описание роли:"; \ - read ROLE_DESC; \ - cp -r default/ "roles/$${ROLE_NAME}"; \ - printf "\n- name: $${ROLE_DESC}" >> roles/deploy.yaml; \ - printf "\n import_playbook: $${ROLE_NAME}/deploy.yaml" >> roles/deploy.yaml; \ - printf '\n - ../../roles/%s' "$$ROLE_NAME" >> molecule/default/converge.yml; \ - printf "\n - $${ROLE_NAME}" >> roles/$$ROLE_NAME/deploy.yaml;; \ - lint) \ - clear; \ - echo "Check your role..."; \ - $(RUN) bash -c "ansible-vault decrypt --vault-password-file vault-password.txt vars/secrets.yml"; \ - $(RUN) bash -c "ansible-lint roles/*"; \ - $(RUN) bash -c "ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file vault-password.txt";; \ - test) \ - clear; \ - echo "Running test roles..."; \ - $(RUN) bash -c "ansible-vault decrypt --vault-password-file vault-password.txt vars/secrets.yml"; \ - $(RUN) bash -c "docker login $(REGISTRY) && molecule test --parallel --destroy=always"; \ - $(RUN) bash -c "ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file vault-password.txt";; \ - deploy) \ - clear; \ - echo "Deploying roles to production..."; \ - $(RUN) bash -c "ansible-playbook roles/deploy.yaml";; \ - *) echo "Unknown action";; \ - esac +.PHONY: report +report: ## Сгенерировать HTML отчет + @echo "$(PURPLE)📊 Генерируем HTML отчет...$(RESET)" + @docker exec ansible-controller bash -lc 'python3 /ansible/scripts/report_html.py /ansible/reports/lab-health.json /ansible/reports/lab-report.html' + @echo "$(GREEN)✅ HTML отчет: reports/lab-report.html$(RESET)" -#################################################################################################### -# Работа с Git -#################################################################################################### -git: - @case "$(word 2, $(MAKECMDGOALS))" in \ - push) \ - git branch; \ - read -p "Выберите ветку для пуша: " BRANCH; \ - read -p "Введите описание коммита: " COMMIT; \ - commitname=$$COMMIT; \ - git add . ; \ - git commit -m "$$commitname"; \ - git push -u origin $$BRANCH; \ - echo "Изменения внесены в Git";; \ - pull) \ - git pull;; \ - new) \ - read -p "Введите имя новой ветки: " BRANCH_NAME; \ - NEW_BRANCH="$$BRANCH_NAME"; \ - git checkout -b $$NEW_BRANCH; \ - echo "Создана и переключена на новую ветку: $$NEW_BRANCH";; \ - *) echo "Unknown action. Available actions: push, pull, cluster-branch";; \ - esac +.PHONY: snapshot +snapshot: ## Сохранить снапшот лаборатории + @echo "$(YELLOW)📸 Создаем снапшот...$(RESET)" + @bash scripts/snapshot.sh + @echo "$(GREEN)✅ Снапшот сохранен$(RESET)" -# ====== УНИВЕРСАЛЬНАЯ ЛАБОРАТОРИЯ (Molecule universal) ====== -SCENARIO ?= universal -COMPOSE ?= docker compose +.PHONY: restore +restore: ## Восстановить из снапшота + @echo "$(BLUE)🔄 Восстанавливаем из снапшота...$(RESET)" + @bash scripts/restore.sh + @echo "$(GREEN)✅ Снапшот восстановлен$(RESET)" -lab-up: ## Поднять контроллер - $(COMPOSE) up -d +.PHONY: cleanup +cleanup: ## Очистить лабораторию + @echo "$(RED)🧹 Очищаем лабораторию...$(RESET)" + @bash scripts/cleanup.sh + @echo "$(GREEN)✅ Лаборатория очищена$(RESET)" -lab-down: ## Погасить контроллер - $(COMPOSE) down -v +# ============================================================================= +# УТИЛИТЫ +# ============================================================================= -lab-sh: ## Войти в контроллер - docker exec -it ansible-controller bash +.PHONY: env +env: ## Показать переменные окружения + @echo "$(CYAN)🔧 Переменные окружения:$(RESET)" + @echo "PROJECT_NAME: $(PROJECT_NAME)" + @echo "VERSION: $(VERSION)" + @echo "AUTHOR: $(AUTHOR)" + @echo "SITE: $(SITE)" + @echo "DOCKER_IMAGE: $(DOCKER_IMAGE)" + @echo "DOCKER_NETWORK: $(DOCKER_NETWORK)" + @echo "SCENARIO: $(SCENARIO)" + @echo "LAB_SPEC: $(LAB_SPEC)" + @echo "KUBE_CONTEXT: $(KUBE_CONTEXT)" + @echo "ROLES_DIR: $(ROLES_DIR)" + @echo "VAULT_PASSWORD_FILE: $(VAULT_PASSWORD_FILE)" -lab-test: lab-up ## Полный цикл Molecule (create+converge+verify+destroy) - docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule ansible-controller \ - bash -lc 'cd /ansible && molecule test -s $(SCENARIO)' +.PHONY: clean +clean: cleanup ## Полная очистка проекта + @echo "$(RED)🧹 Полная очистка проекта...$(RESET)" + @rm -rf .env + @rm -rf vault-password.txt + @rm -rf reports/ + @rm -rf snapshots/ + @echo "$(GREEN)✅ Проект очищен$(RESET)" -lab-create: lab-up ## Создать инфраструктуру лаборатории - docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule ansible-controller \ - bash -lc 'cd /ansible && molecule create -s $(SCENARIO)' +# ============================================================================= +# ЗАГЛУШКИ ДЛЯ ПАРАМЕТРОВ +# ============================================================================= -lab-converge: ## Запустить роли в лаборатории - docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule ansible-controller \ - bash -lc 'cd /ansible && molecule converge -s $(SCENARIO)' +%: + @: -lab-verify: ## Проверить работу лаборатории - docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule ansible-controller \ - bash -lc 'cd /ansible && molecule verify -s $(SCENARIO)' +# ============================================================================= +# ЗАГРУЗКА ПЕРЕМЕННЫХ ИЗ .env +# ============================================================================= -lab-destroy: ## Уничтожить инфраструктуру лаборатории - docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule ansible-controller \ - bash -lc 'cd /ansible && molecule destroy -s $(SCENARIO)' - -lab-reset: lab-destroy lab-down lab-up ## Полный сброс лаборатории - -# ====== K8S ХЕЛПЕРЫ ====== -kube-sh: ## Shell с kubectl/helm/istioctl внутри контейнера - docker exec -it ansible-controller bash - -kube-cmd: ## make kube-cmd CLUSTER=lab CMD="get pods -A" -ifeq ($(strip $(CLUSTER)),) - @echo "Usage: make kube-cmd CLUSTER=lab CMD=\"get pods -A\""; exit 1 -endif - docker exec -it ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) $(CMD)' - -kube-enter: ## make kube-enter CLUSTER=lab -ifeq ($(strip $(CLUSTER)),) - @echo "Usage: make kube-enter CLUSTER=lab"; exit 1 -endif - docker exec -it ansible-controller bash -lc '\ - POD=$$(kubectl --context kind-$(CLUSTER) -n lab-demo get pod -l app=toolbox -o jsonpath="{.items[0].metadata.name}"); \ - [ -n "$$POD" ] || { echo "toolbox pod not found"; exit 1; }; \ - kubectl --context kind-$(CLUSTER) -n lab-demo exec -it $$POD -- /bin/sh' - -# Port-forward Kiali (http://localhost:20001) -kiali-port-forward: ## make kiali-port-forward CLUSTER=lab -ifeq ($(strip $(CLUSTER)),) - @echo "Usage: make kiali-port-forward CLUSTER=lab"; exit 1 -endif - docker exec -d ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) -n istio-system port-forward svc/kiali 20001:20001' - -# Port-forward Istio IngressGateway (HTTP 8082, HTTPS 8444) -istio-gw-port-forward: ## make istio-gw-port-forward CLUSTER=lab -ifeq ($(strip $(CLUSTER)),) - @echo "Usage: make istio-gw-port-forward CLUSTER=lab"; exit 1 -endif - docker exec -d ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) -n istio-system port-forward svc/istio-ingressgateway 8082:80 8444:443' - @echo "Istio GW forwarded: http://localhost:8082 https://localhost:8444" - -# Port-forward Grafana (http://localhost:3000) -grafana-port-forward: ## make grafana-port-forward CLUSTER=lab -ifeq ($(strip $(CLUSTER)),) - @echo "Usage: make grafana-port-forward CLUSTER=lab"; exit 1 -endif - docker exec -d ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) -n monitoring port-forward svc/monitoring-grafana 3000:80' - @echo "Grafana: http://localhost:3000 (admin/admin)" - -# Port-forward Prometheus (http://localhost:9090) -prom-port-forward: ## make prom-port-forward CLUSTER=lab -ifeq ($(strip $(CLUSTER)),) - @echo "Usage: make prom-port-forward CLUSTER=lab"; exit 1 -endif - docker exec -d ansible-controller bash -lc 'kubectl --context kind-$(CLUSTER) -n monitoring port-forward svc/monitoring-kube-prometheus-prometheus 9090:9090' - @echo "Prometheus: http://localhost:9090" - -# Stop all port-forwards -kube-pf-stop: ## убить все port-forward в контроллере - docker exec -it ansible-controller bash -lc 'pkill -f "kubectl .* port-forward" || true' - -# ====== ОТЧЕТЫ ====== -lab-report: ## Сгенерировать HTML отчет - docker exec ansible-controller bash -lc 'python3 /ansible/scripts/report_html.py /ansible/reports/lab-health.json /ansible/reports/lab-report.html' - @echo "HTML report: reports/lab-report.html" - -# ====== ДОПОЛНИТЕЛЬНЫЕ ХЕЛПЕРЫ ====== -bookinfo-url: ## echo productpage URL via Istio Gateway (needs istio-gw-port-forward first) - @echo "Open: http://localhost:8082/productpage" - -grafana-open: ## echo URL to Grafana + hint dashboards - @echo "Grafana: http://localhost:3000 (admin/admin)" - @echo "Dashboards:" - @echo " - Istio • Overview (uid: istio-overview)" - @echo " - Service • SLI (uid: service-sli)" - -# ====== СНАПШОТЫ И ОЧИСТКА ====== -lab-snapshot: ## Сохранить снапшот лаборатории - bash scripts/snapshot.sh - -lab-restore: ## Восстановить из снапшота - bash scripts/restore.sh - -lab-cleanup: ## Очистить лабораторию - bash scripts/cleanup.sh \ No newline at end of file +ifneq (,$(wildcard .env)) + include .env + export +endif \ No newline at end of file diff --git a/README.md b/README.md index 34a2774..29a3dbe 100644 --- a/README.md +++ b/README.md @@ -50,14 +50,71 @@ make pre-commit-install ### Первый запуск ```bash +# Инициализация проекта +make init + # Поднять контроллер -make lab-up +make lab up # Запустить минимальную лабораторию -make lab-test LAB_SPEC=molecule/presets/minimal.yml +make lab test # Посмотреть отчет -make lab-report +make report +``` + +### Основные команды + +```bash +# Показать справку +make help + +# Управление лабораторией +make lab up # Поднять контроллер +make lab down # Остановить контроллер +make lab test # Полный цикл тестирования +make lab create # Создать инфраструктуру +make lab converge # Запустить роли +make lab verify # Проверить работу +make lab destroy # Уничтожить инфраструктуру +make lab reset # Полный сброс + +# Управление Kubernetes +make kube sh # Войти в контейнер +make kube cmd CLUSTER=lab CMD="get pods -A" +make kube kiali CLUSTER=lab +make kube istio CLUSTER=lab +make kube grafana CLUSTER=lab +make kube prom CLUSTER=lab + +# Управление пресетами +make preset list # Список пресетов +make preset create NAME=my-preset +make preset test NAME=my-preset +make preset edit NAME=my-preset + +# Управление ролями +make role list # Список ролей +make role create NAME=my-role +make role test NAME=my-role +make role lint # Проверка ролей + +# Управление Vault +make vault show # Показать содержимое +make vault create # Создать vault файл +make vault edit # Редактировать vault файл + +# Управление Git +make git status # Статус репозитория +make git add # Добавить файлы +make git commit MESSAGE="your message" +make git push # Отправить изменения + +# Отчеты и мониторинг +make report # HTML отчет +make snapshot # Создать снапшот +make restore # Восстановить снапшот +make cleanup # Очистить лабораторию ``` ## 📚 Документация @@ -239,9 +296,9 @@ images: # Настройки по умолчанию для systemd контейнеров systemd_defaults: - privileged: true + privileged: true command: "/sbin/init" - volumes: + volumes: - "/sys/fs/cgroup:/sys/fs/cgroup:ro" tmpfs: - "/run" diff --git a/env.example b/env.example index 0fefcd0..b050082 100644 --- a/env.example +++ b/env.example @@ -1,16 +1,69 @@ -# Переменные окружения для универсальной лаборатории +# ============================================================================= +# Ansible Template Environment Configuration # Автор: Сергей Антропов # Сайт: https://devops.org.ru +# ============================================================================= -# Путь к каталогу с Ansible ролями (вне этого репозитория) -ROLES_DIR=/path/to/your/ansible/roles +# Основные настройки проекта +PROJECT_NAME=ansible-template +VERSION=0.1.0 +AUTHOR="Сергей Антропов" +SITE="https://devops.org.ru" -# Telegram уведомления (опционально) -TG_TOKEN=your_telegram_bot_token -TG_CHAT=your_telegram_chat_id +# Docker настройки +DOCKER_IMAGE=quay.io/ansible/creator-ee:latest +DOCKER_NETWORK=labnet +DOCKER_COMPOSE=docker compose -# Пауза для ручной проверки (минуты) -LAB_PAUSE_MINUTES=10 - -# Сценарий Molecule +# Molecule настройки SCENARIO=universal +LAB_SPEC=molecule/presets/minimal.yml +MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule + +# Kubernetes настройки +KUBE_CONTEXT=kind-lab +ISTIO_VERSION=1.22.1 +KIND_VERSION=v0.23.0 + +# Пути +ROLES_DIR=./roles +VAULT_PASSWORD_FILE=vault-password.txt + +# Переменные для лаборатории +LAB_PAUSE_MINUTES=10 +LAB_SPEC=molecule/presets/minimal.yml + +# Переменные для пресетов +PRESET_NAME=minimal +PRESET_TYPE=classic + +# Переменные для ролей +ROLE_NAME=my-role +ROLE_DESCRIPTION="My Ansible role" + +# Переменные для Git +GIT_BRANCH=main +GIT_REMOTE=origin + +# Переменные для Docker +DOCKER_REGISTRY=quay.io +DOCKER_TAG=latest + +# Переменные для мониторинга +GRAFANA_ADMIN_PASSWORD=admin +PROMETHEUS_RETENTION=15d + +# Переменные для Istio +ISTIO_PROFILE=demo +KIALI_AUTH_STRATEGY=anonymous + +# Переменные для Kind +KIND_WORKERS=2 +KIND_API_PORT=6443 + +# Переменные для портов +HTTP_PORT=8080 +HTTPS_PORT=8443 +GRAFANA_PORT=3000 +PROMETHEUS_PORT=9090 +KIALI_PORT=20001 \ No newline at end of file