feat: Полностью переписан Makefile с максимальной автоматизацией
- Создан новый 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
This commit is contained in:
805
Makefile
805
Makefile
@@ -1,271 +1,580 @@
|
|||||||
# Глобальные переменные
|
# =============================================================================
|
||||||
IMAGE ?= ansible
|
# Ansible Template - Универсальная лаборатория для тестирования Ansible ролей
|
||||||
TAG ?= 0.1
|
# Автор: Сергей Антропов
|
||||||
REGISTRY ?= inecs/ansible
|
# Сайт: https://devops.org.ru
|
||||||
# По умолчанию используем docker. Для локальной разработки используйте docker-compose
|
# =============================================================================
|
||||||
RUN_MODE ?= docker
|
|
||||||
|
|
||||||
# Определение команды 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"
|
||||||
|
|
||||||
####################################################################################################
|
# Docker переменные
|
||||||
# Инициализация новой роли
|
DOCKER_IMAGE ?= quay.io/ansible/creator-ee:latest
|
||||||
####################################################################################################
|
DOCKER_COMPOSE ?= docker compose
|
||||||
init:
|
DOCKER_NETWORK ?= labnet
|
||||||
@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
|
|
||||||
|
|
||||||
####################################################################################################
|
# Molecule переменные
|
||||||
# Управление контейнерами с помощью docker compose или docker run
|
SCENARIO ?= universal
|
||||||
####################################################################################################
|
LAB_SPEC ?= molecule/presets/minimal.yml
|
||||||
docker:
|
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 \
|
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||||
build) \
|
build) \
|
||||||
docker buildx create --use --name multiarch-builder --driver docker-container; \
|
echo "$(YELLOW)🔨 Собираем Docker образы...$(RESET)"; \
|
||||||
if [ "$(RUN_MODE)" = "docker-compose" ]; then \
|
$(DOCKER_COMPOSE) build;; \
|
||||||
docker compose build $(c); \
|
|
||||||
else \
|
|
||||||
docker build -t $(REGISTRY)/$(IMAGE) .; \
|
|
||||||
fi;; \
|
|
||||||
rebuild) \
|
rebuild) \
|
||||||
docker buildx create --use --name multiarch-builder --driver docker-container; \
|
echo "$(YELLOW)🔨 Пересобираем Docker образы...$(RESET)"; \
|
||||||
if [ "$(RUN_MODE)" = "docker-compose" ]; then \
|
$(DOCKER_COMPOSE) build --no-cache;; \
|
||||||
docker compose build --no-cache $(c); \
|
|
||||||
else \
|
|
||||||
docker build --no-cache -t $(REGISTRY)/$(IMAGE) .; \
|
|
||||||
fi;; \
|
|
||||||
prune) \
|
prune) \
|
||||||
|
echo "$(RED)🧹 Очищаем Docker...$(RESET)"; \
|
||||||
docker system prune -af;; \
|
docker system prune -af;; \
|
||||||
shell) \
|
shell) \
|
||||||
clear; \
|
echo "$(BLUE)🐚 Входим в Docker контейнер...$(RESET)"; \
|
||||||
echo "Entering to Ansible container shell..."; \
|
docker exec -it ansible-controller bash;; \
|
||||||
$(RUN) bash ;; \
|
logs) \
|
||||||
release) \
|
echo "$(CYAN)📋 Показываем логи...$(RESET)"; \
|
||||||
docker buildx create --use --name multiarch-builder --driver docker-container; \
|
$(DOCKER_COMPOSE) logs -f;; \
|
||||||
docker login $(REGISTRY); \
|
stop) \
|
||||||
docker buildx build -t $(REGISTRY)/$(IMAGE):$(TAG) -t $(REGISTRY)/$(IMAGE):latest --platform linux/amd64,linux/arm64 --push .;; \
|
echo "$(RED)🛑 Останавливаем контейнеры...$(RESET)"; \
|
||||||
images) \
|
$(DOCKER_COMPOSE) stop;; \
|
||||||
docker buildx create --use --name multiarch-builder --driver docker-container; \
|
start) \
|
||||||
echo "Логинимся в Docker Hub..."; \
|
echo "$(GREEN)▶️ Запускаем контейнеры...$(RESET)"; \
|
||||||
docker login; \
|
$(DOCKER_COMPOSE) start;; \
|
||||||
echo "Собираем и пушим основной Ansible образ..."; \
|
*) \
|
||||||
docker buildx build -t $(REGISTRY)/$(IMAGE):$(TAG) -t $(REGISTRY)/$(IMAGE):latest --platform linux/amd64,linux/arm64 --push .; \
|
echo "$(RED)❌ Неизвестная команда. Доступные: build, rebuild, prune, shell, logs, stop, start$(RESET)";; \
|
||||||
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";; \
|
|
||||||
esac
|
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:
|
.PHONY: report
|
||||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
report: ## Сгенерировать HTML отчет
|
||||||
new) \
|
@echo "$(PURPLE)📊 Генерируем HTML отчет...$(RESET)"
|
||||||
clear; \
|
@docker exec ansible-controller bash -lc 'python3 /ansible/scripts/report_html.py /ansible/reports/lab-health.json /ansible/reports/lab-report.html'
|
||||||
echo "Введите название новой роли на английском:"; \
|
@echo "$(GREEN)✅ HTML отчет: reports/lab-report.html$(RESET)"
|
||||||
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: snapshot
|
||||||
# Работа с Git
|
snapshot: ## Сохранить снапшот лаборатории
|
||||||
####################################################################################################
|
@echo "$(YELLOW)📸 Создаем снапшот...$(RESET)"
|
||||||
git:
|
@bash scripts/snapshot.sh
|
||||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
@echo "$(GREEN)✅ Снапшот сохранен$(RESET)"
|
||||||
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
|
|
||||||
|
|
||||||
# ====== УНИВЕРСАЛЬНАЯ ЛАБОРАТОРИЯ (Molecule universal) ======
|
.PHONY: restore
|
||||||
SCENARIO ?= universal
|
restore: ## Восстановить из снапшота
|
||||||
COMPOSE ?= docker compose
|
@echo "$(BLUE)🔄 Восстанавливаем из снапшота...$(RESET)"
|
||||||
|
@bash scripts/restore.sh
|
||||||
|
@echo "$(GREEN)✅ Снапшот восстановлен$(RESET)"
|
||||||
|
|
||||||
lab-up: ## Поднять контроллер
|
.PHONY: cleanup
|
||||||
$(COMPOSE) up -d
|
cleanup: ## Очистить лабораторию
|
||||||
|
@echo "$(RED)🧹 Очищаем лабораторию...$(RESET)"
|
||||||
|
@bash scripts/cleanup.sh
|
||||||
|
@echo "$(GREEN)✅ Лаборатория очищена$(RESET)"
|
||||||
|
|
||||||
lab-down: ## Погасить контроллер
|
# =============================================================================
|
||||||
$(COMPOSE) down -v
|
# УТИЛИТЫ
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
lab-sh: ## Войти в контроллер
|
.PHONY: env
|
||||||
docker exec -it ansible-controller bash
|
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)
|
.PHONY: clean
|
||||||
docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule ansible-controller \
|
clean: cleanup ## Полная очистка проекта
|
||||||
bash -lc 'cd /ansible && molecule test -s $(SCENARIO)'
|
@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 \
|
# ЗАГРУЗКА ПЕРЕМЕННЫХ ИЗ .env
|
||||||
bash -lc 'cd /ansible && molecule verify -s $(SCENARIO)'
|
# =============================================================================
|
||||||
|
|
||||||
lab-destroy: ## Уничтожить инфраструктуру лаборатории
|
ifneq (,$(wildcard .env))
|
||||||
docker exec -e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule ansible-controller \
|
include .env
|
||||||
bash -lc 'cd /ansible && molecule destroy -s $(SCENARIO)'
|
export
|
||||||
|
endif
|
||||||
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
|
|
||||||
67
README.md
67
README.md
@@ -50,14 +50,71 @@ make pre-commit-install
|
|||||||
### Первый запуск
|
### Первый запуск
|
||||||
|
|
||||||
```bash
|
```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 контейнеров
|
||||||
systemd_defaults:
|
systemd_defaults:
|
||||||
privileged: true
|
privileged: true
|
||||||
command: "/sbin/init"
|
command: "/sbin/init"
|
||||||
volumes:
|
volumes:
|
||||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||||
tmpfs:
|
tmpfs:
|
||||||
- "/run"
|
- "/run"
|
||||||
|
|||||||
73
env.example
73
env.example
@@ -1,16 +1,69 @@
|
|||||||
# Переменные окружения для универсальной лаборатории
|
# =============================================================================
|
||||||
|
# Ansible Template Environment Configuration
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: 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 уведомления (опционально)
|
# Docker настройки
|
||||||
TG_TOKEN=your_telegram_bot_token
|
DOCKER_IMAGE=quay.io/ansible/creator-ee:latest
|
||||||
TG_CHAT=your_telegram_chat_id
|
DOCKER_NETWORK=labnet
|
||||||
|
DOCKER_COMPOSE=docker compose
|
||||||
|
|
||||||
# Пауза для ручной проверки (минуты)
|
# Molecule настройки
|
||||||
LAB_PAUSE_MINUTES=10
|
|
||||||
|
|
||||||
# Сценарий Molecule
|
|
||||||
SCENARIO=universal
|
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
|
||||||
Reference in New Issue
Block a user