Merge k8s в main: добавлена поддержка Kubernetes Kind кластеров

This commit is contained in:
Сергей Антропов
2025-10-27 11:21:45 +03:00
35 changed files with 4457 additions and 127 deletions

459
Makefile
View File

@@ -1,5 +1,5 @@
# =============================================================================
# AnsibleLab - Универсальная система тестирования Ansible ролей
# DevOpsLab - Универсальная система тестирования Ansible ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# =============================================================================
@@ -20,11 +20,12 @@ WHITE := \033[0;37m
RESET := \033[0m
# Глобальные переменные
PROJECT_NAME ?= ansible-lab
PROJECT_NAME ?= devops-lab
VERSION ?= 0.1.0
AUTHOR ?= "Сергей Антропов"
SITE ?= "https://devops.org.ru"
DOCKER_IMAGE ?= inecs/ansible-lab:ansible-controller-latest
DOCKER_K8S_IMAGE ?= inecs/ansible-lab:k8s-latest
DOCKER_DIND_IMAGE ?= docker:27-dind
CONTAINER_NAME ?= ansible-controller
@@ -40,7 +41,7 @@ DOCKER_BUILDX_BUILDER ?= multiarch-builder
# Базовые образы и их теги
BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi centos:7 quay.io/centos/centos:8 quay.io/centos/centos:stream9 almalinux:8 rockylinux:8 ubuntu:20.04 ubuntu:22.04 ubuntu:24.04 debian:9 debian:10 debian:11 debian:bookworm
.PHONY: role vault git docker presets controller help update-playbooks generate-docs setup-cicd list create delete
.PHONY: role vault git docker presets controller k8s help update-playbooks generate-docs setup-cicd list create delete
# =============================================================================
# КОМАНДЫ ДЛЯ РАБОТЫ С РОЛЯМИ
@@ -914,11 +915,15 @@ docker-get-base-tag:
TAG=$$(docker inspect --format='{{.RepoTags}}' $$BASE_IMAGE 2>/dev/null | tr -d '[]' | cut -d',' -f1 | cut -d':' -f2 | tr -d ' ' || echo "latest");; \
ansible-controller) \
TAG="latest";; \
*) \
echo "❌ Неизвестный образ: $(IMAGE)"; \
exit 1;; \
esac; \
echo "$$TAG"
k8s) \
TAG="latest";; \
k8s-portforward) \
TAG="latest";; \
*) \
echo "❌ Неизвестный образ: $(IMAGE)"; \
exit 1;; \
esac; \
echo "$$TAG"
# Сборка одного образа с multi-arch
docker-build-image:
@@ -1022,12 +1027,428 @@ controller:
echo " 💡 Удаляет: контейнеры и сети";; \
esac
# =============================================================================
# КОМАНДЫ ДЛЯ РАБОТЫ С KUBERNETES KIND
# =============================================================================
k8s:
@case "$(word 2, $(MAKECMDGOALS))" in \
create) \
echo "☸️ Создание Kind кластера..."; \
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
if [ -z "$$PRESET_ARG" ]; then \
PRESET=k8s-minimal; \
echo "📋 Используется preset по умолчанию: $$PRESET (минимальный без аддонов)"; \
else \
PRESET=$$PRESET_ARG; \
echo "📋 Используется preset: $$PRESET"; \
fi; \
if [ ! -f "molecule/presets/k8s/$$PRESET.yml" ]; then \
echo "❌ Ошибка: Пресет '$$PRESET' не найден!"; \
echo "💡 Доступные пресеты:"; \
ls -1 molecule/presets/k8s/*.yml 2>/dev/null | sed 's|molecule/presets/k8s/||g' | sed 's|\.yml||g' | sed 's/^/ - /' || echo " - k8s-minimal"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
docker run -d --name $$CONTAINER_NAME --rm \
-v "$(PWD):/workspace" -w /workspace \
-v /var/run/docker.sock:/var/run/docker.sock \
-u root \
-e ANSIBLE_FORCE_COLOR=1 \
-e MOLECULE_PRESET=$$PRESET \
-e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule_workspace \
$(DOCKER_K8S_IMAGE) \
/bin/bash -c 'sleep infinity'; \
echo "🚀 Запуск создания кластера..."; \
docker exec $$CONTAINER_NAME bash -c "cd /workspace && python3 /workspace/scripts/create_k8s_cluster.py molecule/presets/k8s/$$PRESET.yml $$CONTAINER_NAME"; \
echo "✅ Kind кластер создан"; \
echo "💡 Для создания port-forward: make k8s portforward create"; \
echo "💡 Для подключения используйте: make k8s kubeconfig"; \
echo "💡 Для остановки используйте: make k8s stop";; \
destroy) \
echo "🗑️ Удаление Kind кластера и контейнеров..."; \
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
PRESET=$${PRESET_ARG:-k8s-minimal}; \
CONTAINER_NAME=k8s-controller; \
echo "🔌 Очистка port-forward..."; \
python3 scripts/portforward.py clear || echo "⚠️ Не удалось очистить port-forward"; \
if docker ps | grep -q $$CONTAINER_NAME; then \
echo "🗑️ Удаление Kind кластеров..."; \
docker exec $$CONTAINER_NAME bash -c "kind delete clusters --all" 2>/dev/null || true; \
else \
echo "⚠️ Контейнер $$CONTAINER_NAME не запущен"; \
fi; \
docker rm -f $$CONTAINER_NAME 2>/dev/null || true; \
echo "🗑️ Удаление контейнеров из пресета..."; \
if [ -f "molecule/presets/k8s/$$PRESET.yml" ]; then \
if docker ps | grep -q $$CONTAINER_NAME; then \
docker exec $$CONTAINER_NAME bash -c "python3 /workspace/scripts/delete_hosts.py /workspace/molecule/presets/k8s/$$PRESET.yml" 2>/dev/null || true; \
else \
python3 scripts/delete_hosts.py molecule/presets/k8s/$$PRESET.yml 2>/dev/null || true; \
fi; \
fi; \
echo "✅ Удаление завершено";; \
stop) \
echo "🛑 Остановка Kind кластера..."; \
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
if [ -z "$$PRESET_ARG" ]; then \
echo "❌ Ошибка: Укажите пресет"; \
echo "💡 Пример: make k8s stop kubernetes"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if docker ps | grep -q $$CONTAINER_NAME; then \
docker exec $$CONTAINER_NAME bash -c "kind get clusters | xargs -I {} kind stop cluster --name {}" 2>/dev/null || true; \
echo "✅ Kind кластер остановлен"; \
else \
echo "⚠️ Контейнер $$CONTAINER_NAME не запущен"; \
fi; \
echo "💡 Кластер остановлен, но не удален"; \
echo "💡 Для перезапуска: make k8s start $$PRESET_ARG"; \
echo "💡 Для полного удаления: make k8s destroy $$PRESET_ARG";; \
start) \
echo "🚀 Запуск Kind кластера..."; \
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
if [ -z "$$PRESET_ARG" ]; then \
echo "❌ Ошибка: Укажите пресет"; \
echo "💡 Пример: make k8s start kubernetes"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if ! docker ps | grep -q $$CONTAINER_NAME; then \
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
exit 1; \
fi; \
docker exec $$CONTAINER_NAME bash -c "kind get clusters | xargs -I {} kind start cluster --name {}" 2>/dev/null || true; \
echo "✅ Kind кластер запущен";; \
status) \
echo "📊 Детальный отчет о состоянии кластера..."; \
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
if [ -z "$$PRESET_ARG" ]; then \
echo "❌ Ошибка: Укажите пресет"; \
echo "💡 Пример: make k8s status kubernetes"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if docker ps | grep -q $$CONTAINER_NAME; then \
python3 scripts/k8s_status.py; \
else \
echo "⚠️ Контейнер $$CONTAINER_NAME не запущен"; \
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
fi;; \
config) \
echo "📋 Получение kubeconfig..."; \
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
if [ -z "$$PRESET_ARG" ]; then \
echo "❌ Ошибка: Укажите пресет"; \
echo "💡 Пример: make k8s config kubernetes"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if ! docker ps | grep -q $$CONTAINER_NAME; then \
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
exit 1; \
fi; \
KUBECONFIG_FILE="$$(pwd)/kubeconfig"; \
docker exec $$CONTAINER_NAME bash -c "kind get kubeconfig" > $$KUBECONFIG_FILE 2>/dev/null || true; \
if [ -f $$KUBECONFIG_FILE ] && [ -s $$KUBECONFIG_FILE ]; then \
echo "✅ kubeconfig сохранен в: $$KUBECONFIG_FILE"; \
echo ""; \
echo "💡 Для использования:"; \
echo " export KUBECONFIG=$$KUBECONFIG_FILE"; \
echo " kubectl get nodes"; \
echo ""; \
echo "💡 Или для однократного использования:"; \
echo " kubectl --kubeconfig=$$KUBECONFIG_FILE get nodes"; \
else \
echo "❌ Не удалось получить kubeconfig"; \
rm -f $$KUBECONFIG_FILE; \
fi;; \
nodes) \
echo "🖥️ Просмотр узлов кластера..."; \
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
if [ -z "$$PRESET_ARG" ]; then \
echo "❌ Ошибка: Укажите пресет"; \
echo "💡 Пример: make k8s nodes kubernetes"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if ! docker ps | grep -q $$CONTAINER_NAME; then \
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
exit 1; \
fi; \
CLUSTER_NAME=$$(docker exec $$CONTAINER_NAME kind get clusters | head -1); \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify get nodes";; \
shell) \
echo "🐚 Открытие shell в контейнере..."; \
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
if [ -z "$$PRESET_ARG" ]; then \
echo "❌ Ошибка: Укажите пресет"; \
echo "💡 Пример: make k8s shell kubernetes"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if docker ps | grep -q $$CONTAINER_NAME; then \
docker exec -it $$CONTAINER_NAME bash; \
else \
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
fi;; \
manifest) \
echo "📄 Работа с манифестами..."; \
MANIFEST_CMD="$(word 3, $(MAKECMDGOALS))"; \
PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \
MANIFEST_ARG="$(word 5, $(MAKECMDGOALS))"; \
if [ -z "$$MANIFEST_CMD" ] || [ -z "$$PRESET_ARG" ] || [ -z "$$MANIFEST_ARG" ]; then \
echo "❌ Ошибка: Укажите команду, пресет и путь к манифесту"; \
echo "💡 Пример: make k8s manifest apply kubernetes https://example.com/manifest.yaml"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if ! docker ps | grep -q $$CONTAINER_NAME; then \
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
exit 1; \
fi; \
CLUSTER_NAME=$$(docker exec $$CONTAINER_NAME kind get clusters | head -1); \
case "$$MANIFEST_CMD" in \
apply) \
echo "📥 Применение манифеста: $$MANIFEST_ARG"; \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify apply -f $$MANIFEST_ARG";; \
delete) \
echo "🗑️ Удаление ресурсов из манифеста: $$MANIFEST_ARG"; \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify delete -f $$MANIFEST_ARG";; \
*) \
echo "❌ Неизвестная команда: $$MANIFEST_CMD"; \
echo "💡 Доступные команды: apply, delete"; \
exit 1;; \
esac;; \
helm) \
echo "📦 Работа с Helm..."; \
HELM_CMD="$(word 3, $(MAKECMDGOALS))"; \
PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \
RELEASE_ARG="$(word 5, $(MAKECMDGOALS))"; \
CHART_ARG="$(word 6, $(MAKECMDGOALS))"; \
if [ -z "$$HELM_CMD" ] || [ -z "$$PRESET_ARG" ]; then \
echo "❌ Ошибка: Укажите команду и пресет"; \
echo "💡 Пример: make k8s helm list kubernetes"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if ! docker ps | grep -q $$CONTAINER_NAME; then \
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
exit 1; \
fi; \
CLUSTER_NAME=$$(docker exec $$CONTAINER_NAME kind get clusters | head -1); \
case "$$HELM_CMD" in \
apply) \
if [ -z "$$RELEASE_ARG" ] || [ -z "$$CHART_ARG" ]; then \
echo "❌ Ошибка: Укажите имя релиза и чарт"; \
echo "💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress"; \
exit 1; \
fi; \
echo "📦 Установка Helm чарта: $$CHART_ARG как $$RELEASE_ARG"; \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade --install $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
delete) \
if [ -z "$$RELEASE_ARG" ]; then \
echo "❌ Ошибка: Укажите имя релиза"; \
echo "💡 Пример: make k8s helm delete kubernetes my-release"; \
exit 1; \
fi; \
echo "🗑️ Удаление Helm релиза: $$RELEASE_ARG"; \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm uninstall $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
update) \
if [ -z "$$RELEASE_ARG" ] || [ -z "$$CHART_ARG" ]; then \
echo "❌ Ошибка: Укажите имя релиза и чарт"; \
echo "💡 Пример: make k8s helm update kubernetes my-release stable/nginx-ingress"; \
exit 1; \
fi; \
echo "🔄 Обновление Helm релиза: $$RELEASE_ARG"; \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
rollback) \
if [ -z "$$RELEASE_ARG" ]; then \
echo "❌ Ошибка: Укажите имя релиза"; \
echo "💡 Пример: make k8s helm rollback kubernetes my-release"; \
exit 1; \
fi; \
echo "⏪ Откат Helm релиза: $$RELEASE_ARG"; \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm rollback $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
list) \
echo "📋 Список Helm релизов:"; \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm list --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy --all-namespaces 2>&1 | grep -v '^WARNING' || true";; \
status) \
if [ -z "$$RELEASE_ARG" ]; then \
echo "❌ Ошибка: Укажите имя релиза"; \
echo "💡 Пример: make k8s helm status kubernetes my-release"; \
exit 1; \
fi; \
echo "📊 Статус Helm релиза: $$RELEASE_ARG"; \
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm status $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
*) \
echo "❌ Неизвестная команда: $$HELM_CMD"; \
echo "💡 Доступные команды: apply, delete, update, rollback, list, status"; \
exit 1;; \
esac;; \
helmrepo) \
echo "🏪 Работа с Helm репозиториями..."; \
REPO_CMD="$(word 3, $(MAKECMDGOALS))"; \
PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \
NAME_ARG="$(word 5, $(MAKECMDGOALS))"; \
URL_ARG="$(word 6, $(MAKECMDGOALS))"; \
if [ -z "$$REPO_CMD" ] || [ -z "$$PRESET_ARG" ]; then \
echo "❌ Ошибка: Укажите команду и пресет"; \
echo "💡 Пример: make k8s helmrepo list kubernetes"; \
exit 1; \
fi; \
CONTAINER_NAME=k8s-controller; \
if ! docker ps | grep -q $$CONTAINER_NAME; then \
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
exit 1; \
fi; \
case "$$REPO_CMD" in \
add) \
if [ -z "$$NAME_ARG" ] || [ -z "$$URL_ARG" ]; then \
echo "❌ Ошибка: Укажите имя и URL репозитория"; \
echo "💡 Пример: make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable"; \
exit 1; \
fi; \
echo " Добавление Helm репозитория: $$NAME_ARG"; \
docker exec $$CONTAINER_NAME bash -c "helm repo add $$NAME_ARG $$URL_ARG 2>&1 | grep -v '^WARNING' || true; helm repo update";; \
list) \
echo "📋 Список Helm репозиториев:"; \
docker exec $$CONTAINER_NAME bash -c "helm repo list 2>&1 | grep -v '^WARNING' || true";; \
delete) \
if [ -z "$$NAME_ARG" ]; then \
echo "❌ Ошибка: Укажите имя репозитория"; \
echo "💡 Пример: make k8s helmrepo delete kubernetes stable"; \
exit 1; \
fi; \
echo "🗑️ Удаление Helm репозитория: $$NAME_ARG"; \
docker exec $$CONTAINER_NAME bash -c "helm repo remove $$NAME_ARG 2>&1 | grep -v '^WARNING' || true";; \
update) \
echo "🔄 Обновление Helm репозиториев"; \
docker exec $$CONTAINER_NAME bash -c "helm repo update 2>&1 | grep -v '^WARNING' || true";; \
packages) \
if [ -z "$$NAME_ARG" ]; then \
echo "❌ Ошибка: Укажите имя репозитория"; \
echo "💡 Пример: make k8s helmrepo packages kubernetes stable"; \
exit 1; \
fi; \
echo "📦 Пакеты в репозитории: $$NAME_ARG"; \
docker exec $$CONTAINER_NAME bash -c "helm search repo $$NAME_ARG 2>&1 | grep -v '^WARNING' || true";; \
*) \
echo "❌ Неизвестная команда: $$REPO_CMD"; \
echo "💡 Доступные команды: add, list, delete, update, packages"; \
exit 1;; \
esac;; \
portforward) \
PORTFWD_CMD="$(word 3, $(MAKECMDGOALS))"; \
PORT_ARG="$(word 4, $(MAKECMDGOALS))"; \
if [ -z "$$PORTFWD_CMD" ]; then \
echo "❌ Ошибка: Укажите команду"; \
echo "💡 Пример: make k8s portforward create"; \
exit 1; \
fi; \
case "$$PORTFWD_CMD" in \
create) \
echo "🔌 Создание port-forward..."; \
python3 scripts/portforward.py create;; \
list) \
echo "📋 Список активных port-forward..."; \
python3 scripts/portforward.py list;; \
clear) \
echo "🗑️ Очистка всех port-forward..."; \
python3 scripts/portforward.py clear;; \
recreate) \
echo "🔄 Пересоздание port-forward..."; \
python3 scripts/portforward.py recreate;; \
delete) \
if [ -z "$$PORT_ARG" ]; then \
echo "❌ Ошибка: Укажите порт"; \
echo "💡 Пример: make k8s portforward delete 3000"; \
exit 1; \
fi; \
echo "🗑️ Удаление port-forward на порту $$PORT_ARG..."; \
python3 scripts/portforward.py delete $$PORT_ARG;; \
*) \
echo "❌ Неизвестная команда: $$PORTFWD_CMD"; \
echo "💡 Доступные команды: create, list, clear, recreate, delete"; \
exit 1;; \
esac;; \
*) \
echo "☸️ Доступные команды:"; \
echo ""; \
echo " make k8s create [preset] - создать Kind кластер"; \
echo " 💡 Без параметра: используется k8s-minimal (без аддонов)"; \
echo " 💡 С параметром: используется указанный пресет"; \
echo " 💡 Кластер НЕ удаляется автоматически"; \
echo ""; \
echo " make k8s destroy [preset] - удалить Kind кластер полностью"; \
echo " 💡 Удалит: кластер и контейнер ansible-controller"; \
echo ""; \
echo " make k8s stop [cluster] - остановить Kind кластер (без удаления)"; \
echo " 💡 Можно указать имя кластера или остановить все"; \
echo " 💡 Для перезапуска: make k8s start"; \
echo ""; \
echo " make k8s start [cluster] - запустить остановленный кластер"; \
echo " 💡 Можно указать имя кластера или запустить все"; \
echo ""; \
echo " make k8s status [preset] - детальный отчет о состоянии кластера"; \
echo " 💡 Показывает: узлы, pods, сервисы, Ingress, события, Helm релизы и т.д."; \
echo " 💡 Требует: пресет"; \
echo " 💡 Пример: make k8s status kubernetes"; \
echo ""; \
echo " make k8s config [cluster] - получить kubeconfig для подключения"; \
echo " 💡 Сохраняет: kubeconfig в корне проекта"; \
echo " 💡 Можно указать имя конкретного кластера"; \
echo ""; \
echo " make k8s nodes [preset] - показать узлы кластера"; \
echo " 💡 Требует: пресет"; \
echo " 💡 Пример: make k8s nodes kubernetes"; \
echo ""; \
echo " make k8s shell [preset] - открыть shell в контейнере"; \
echo " 💡 Для: ручного управления kubectl/kind"; \
echo " 💡 Пример: make k8s shell kubernetes"; \
echo ""; \
echo " make k8s manifest [cmd] [preset] [url] - работа с манифестами"; \
echo " 💡 Команды: apply, delete"; \
echo " 💡 Пример: make k8s manifest apply kubernetes https://example.com/deploy.yaml"; \
echo ""; \
echo " make k8s helm [cmd] [preset] [release] [chart] - работа с Helm"; \
echo " 💡 Команды: apply, delete, update, rollback, list, status"; \
echo " 💡 Пример: make k8s helm apply kubernetes nginx stable/nginx-ingress"; \
echo ""; \
echo " make k8s helmrepo [cmd] [preset] [name] [url] - работа с Helm репозиториями"; \
echo " 💡 Команды: add, list, delete, update, packages"; \
echo " 💡 Пример: make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable"; \
echo ""; \
echo " make k8s portforward [cmd] - управление port-forward"; \
echo " 💡 Команды: create, list, clear, recreate, delete [port]"; \
echo " 💡 Пример: make k8s portforward create"; \
echo ""; \
echo "💡 Примеры:"; \
echo " make k8s create # создать минимальный кластер"; \
echo " make k8s create kubernetes # создать кластер с аддонами"; \
echo " make k8s nodes kubernetes # показать узлы кластера"; \
echo " make k8s config kubernetes # получить kubeconfig для кластера"; \
echo " export KUBECONFIG=kubeconfig # использовать конфиг"; \
echo " kubectl get nodes # проверить узлы"; \
echo " make k8s manifest apply kubernetes https://example.com/manifest.yaml # установить манифест"; \
echo " make k8s stop kubernetes # остановить кластер"; \
echo " make k8s start kubernetes # запустить кластер"; \
echo " make k8s destroy kubernetes # удалить кластер с пресетом kubernetes";; \
esac
# =============================================================================
# СПРАВКА
# =============================================================================
help:
@echo "=========================================="
@echo "AnsibleLab - Универсальная система"
@echo "DevOpsLab - Универсальная система"
@echo "тестирования Ansible ролей"
@echo "=========================================="
@echo ""
@@ -1063,7 +1484,7 @@ help:
@echo " make presets info - подробная информация о preset'е"
@echo " make presets test - запустить тест с preset'ом"
@echo ""
@echo "🖼️ СОБСТВЕННЫЕ ОБРАЗЫ (AnsibleLab):"
@echo "🖼️ СОБСТВЕННЫЕ ОБРАЗЫ (DevOpsLab):"
@echo " make custom-images test [minimal|full|performance] - тест с собственными образами"
@echo " make custom-images check - проверить наличие собственных образов"
@echo " make custom-images build - собрать все образы для тестирования"
@@ -1115,6 +1536,20 @@ help:
@echo " make controller run - запустить ansible-controller"
@echo " make controller stop - остановить ansible-controller"
@echo ""
@echo "☸️ KUBERNETES (Kind кластеры):"
@echo " make k8s create [preset] - создать Kind кластер (по умолчанию: k8s-minimal)"
@echo " make k8s destroy [preset] - удалить Kind кластер"
@echo " make k8s start [preset] - запустить Kind кластер"
@echo " make k8s stop [preset] - остановить Kind кластер"
@echo " make k8s status [preset] - детальный отчет о состоянии кластера"
@echo " make k8s nodes [preset] - показать узлы кластера"
@echo " make k8s config [preset] - получить kubeconfig для подключения"
@echo " make k8s manifest [cmd] [preset] [url] - работа с манифестами (apply, delete)"
@echo " make k8s helm [cmd] [preset] [release] [chart] - работа с Helm"
@echo " make k8s helmrepo [cmd] [preset] [name] [url] - управление Helm репозиториями"
@echo " make k8s portforward [cmd] - управление port-forward (create, list, clear)"
@echo " make k8s shell [preset] - открыть shell в контейнере k8s"
@echo ""
@echo "💡 ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:"
@echo " make presets list # показать все preset'ы"
@echo " make presets test PRESET=etcd-patroni # тест с etcd-patroni"
@@ -1140,7 +1575,7 @@ help:
custom-images:
@case "$(word 2, $(MAKECMDGOALS))" in \
test) \
echo "🧪 Тестирование с собственными образами AnsibleLab..."; \
echo "🧪 Тестирование с собственными образами DevOpsLab..."; \
if [ -z "$(word 3, $(MAKECMDGOALS))" ]; then \
echo "💡 Использование: make custom-images test [minimal|full|performance]"; \
echo "💡 По умолчанию: minimal"; \
@@ -1168,7 +1603,7 @@ custom-images:
echo ""; \
echo " 🔨 make custom-images build - собрать все образы для тестирования"; \
echo " 💡 Выполняет: make docker build"; \
echo " 💡 Собирает: все образы AnsibleLab"; \
echo " 💡 Собирает: все образы DevOpsLab"; \
echo ""; \
echo "💡 Пресеты для тестирования:"; \
echo " - custom-minimal.yml - минимальный тест (4 хоста)"; \