Files
DevOpsLab/Makefile

335 lines
16 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# =============================================================================
# AnsibleTemplate - Универсальная система тестирования Ansible ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# =============================================================================
SHELL := /bin/bash
# =============================================================================
# ЦВЕТА ДЛЯ ВЫВОДА
# =============================================================================
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
# =============================================================================
# ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
# =============================================================================
PROJECT_NAME ?= ansible-template
VERSION ?= 0.1.0
AUTHOR ?= "Сергей Антропов"
SITE ?= "https://devops.org.ru"
DOCKER_IMAGE ?= quay.io/ansible/creator-ee:latest
DOCKER_DIND_IMAGE ?= docker:27-dind
CONTAINER_NAME ?= ansible-controller
.PHONY: role molecule vault git docker help
role:
@case "$(word 2, $(MAKECMDGOALS))" in \
lint) \
echo "🔍 Проверка синтаксиса ролей ..."; \
docker run --rm --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace -e ANSIBLE_FORCE_COLOR=1 $(DOCKER_IMAGE) bash -c "ansible-lint roles/ --config-file .ansible-lint || true"; \
echo "✅ Lint завершен";; \
test) \
echo "🚀 Тестирование ролей ..."; \
PRESET="default"; \
ARGS="$(wordlist 3,10,$(MAKECMDGOALS))"; \
if [ -n "$$ARGS" ]; then \
PRESET="$$(echo $$ARGS | cut -d' ' -f1)"; \
fi; \
echo "📋 Используется пресет: $$PRESET"; \
if [ ! -f "molecule/presets/$$PRESET.yml" ]; then \
echo "❌ Ошибка: Пресет '$$PRESET' не найден!"; \
echo "💡 Доступные пресеты:"; \
ls -1 molecule/presets/*.yml 2>/dev/null | sed 's|molecule/presets/||g' | sed 's|\.yml||g' | sed 's/^/ - /' || echo " ⚠️ Пресеты не найдены"; \
exit 1; \
fi; \
echo ""; \
if [ "$$PRESET" = "standart" ]; then \
./scripts/test-standart.sh; \
else \
docker run --rm --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace \
-v /var/run/docker.sock:/var/run/docker.sock \
-e ANSIBLE_FORCE_COLOR=1 \
-e MOLECULE_PRESET=$$PRESET \
$(DOCKER_IMAGE) \
bash -c "cd molecule/default && ansible-playbook -i localhost, create.yml --connection=local && ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini site.yml && ansible-playbook -i localhost, destroy.yml --connection=local" || echo "✅ Тестирование завершено"; \
fi;; \
presets) \
echo "📋 Доступные пресеты:"; \
echo ""; \
preset_count=0; \
for preset in molecule/presets/*.yml; do \
if [ -f "$$preset" ]; then \
preset_name=$$(basename "$$preset" .yml); \
preset_desc=$$(grep -E "^#.*пресет|^#.*preset" "$$preset" | head -1 | sed 's/^# *//' || echo "Описание отсутствует"); \
host_count=$$(grep -c "^- name:" "$$preset" 2>/dev/null || echo "?"); \
printf " 📄 %s - %s (%s хостов)\n" "$$preset_name" "$$preset_desc" "$$host_count"; \
preset_count=$$((preset_count + 1)); \
fi; \
done; \
if [ $$preset_count -eq 0 ]; then \
echo " ⚠️ Пресеты не найдены"; \
fi; \
echo ""; \
echo "💡 Использование:"; \
echo " make role test - с default preset"; \
echo " make role test [preset_name] - с любым preset"; \
echo " make role test minimal - с minimal preset"; \
echo " make role test standard - со standard preset"; \
echo " make role test docker - с docker preset"; \
echo ""; \
echo "💡 Примеры:"; \
echo " make role test # default preset"; \
echo " make role test minimal # minimal preset"; \
echo " make role test my-custom-preset # любой preset";; \
deploy) \
echo "🚀 Развертывание ролей на реальные серверы..."; \
echo ""; \
if [ ! -f "inventory/hosts.ini" ]; then \
echo "❌ Ошибка: Файл inventory/hosts.ini не найден!"; \
echo "💡 Создайте файл inventory/hosts.ini с вашими серверами"; \
exit 1; \
fi; \
echo "📋 Используется inventory: inventory/hosts.ini"; \
echo "📄 Содержимое inventory:"; \
cat inventory/hosts.ini; \
echo ""; \
echo "🚀 Запуск развертывания..."; \
ansible-playbook -i inventory/hosts.ini deploy.yml --check; \
echo ""; \
read -p "Продолжить развертывание? (y/N): " confirm; \
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
ansible-playbook -i inventory/hosts.ini deploy.yml; \
else \
echo "❌ Развертывание отменено"; \
fi;; \
*) \
echo "🎯 Доступные команды:"; \
echo ""; \
echo " 🔧 make role install - установить зависимости"; \
echo " 🔍 make role lint - проверить синтаксис ролей"; \
echo " 🚀 make role test - протестировать роли (default preset)"; \
echo " 🚀 make role test [preset] - протестировать с любым preset"; \
echo " 🚀 make role test minimal - протестировать с minimal preset"; \
echo " 🚀 make role test standard - протестировать со standard preset"; \
echo " 🚀 make role test docker - протестировать с docker preset"; \
echo " 📋 make role presets - показать список preset'ов"; \
echo " 🚀 make role deploy - развернуть роли";; \
esac
####################################################################################################
# Работа с Molecule Universal
####################################################################################################
molecule:
@case "$(word 2, $(MAKECMDGOALS))" in \
create) \
echo "Создание тестового окружения ..."; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
bash -c "cd molecule/default && molecule create";; \
converge) \
echo "Запуск плейбуков ..."; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
bash -c "cd molecule/default && molecule converge";; \
verify) \
echo "Проверка результатов ..."; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
bash -c "cd molecule/default && molecule verify";; \
destroy) \
echo "Удаление тестового окружения ..."; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
bash -c "cd molecule/default && molecule destroy";; \
test) \
echo "Полный цикл тестирования ..."; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
bash -c "cd molecule/default && molecule test";; \
*) \
echo "Доступные команды:"; \
echo " make molecule create - создать окружение"; \
echo " make molecule converge - запустить плейбуки"; \
echo " make molecule verify - проверить результаты"; \
echo " make molecule destroy - удалить окружение"; \
echo " make molecule test - полный цикл тестирования"; \
;; \
esac
####################################################################################################
# Работа с Ansible Vault
####################################################################################################
vault:
@case "$(word 2, $(MAKECMDGOALS))" in \
show) \
echo "Доступные файлы секретов:"; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
ansible-vault view --vault-password-file vault/.vault vault/$$FILE.yml;; \
create) \
echo "Создание файла секретов:"; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
ansible-vault create --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
edit) \
echo "Доступные файлы секретов:"; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
ansible-vault edit --vault-password-file vault/.vault vault/$$FILE.yml;; \
delete) \
echo "Доступные файлы секретов:"; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
rm -f vault/$$FILE.yml;; \
rekey) \
echo "Доступные файлы секретов:"; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
ansible-vault rekey --vault-password-file vault/.vault vault/$$FILE.yml;; \
decrypt) \
echo "Доступные файлы секретов:"; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
ansible-vault decrypt --vault-password-file vault/.vault vault/$$FILE.yml;; \
encrypt) \
echo "Доступные файлы секретов:"; \
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
echo ""; \
read -p "Введите имя файла (без .yml): " FILE; \
docker run --rm -v "$(PWD):/workspace" -w /workspace \
quay.io/ansible/creator-ee:latest \
ansible-vault encrypt --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
*) \
echo "Доступные команды:"; \
echo " make vault create - создать файл секретов"; \
echo " make vault edit - редактировать секреты"; \
echo " make vault show - показать секреты"; \
echo " make vault delete - удалить секреты"; \
echo " make vault encrypt - зашифровать файл"; \
echo " make vault decrypt - расшифровать файл"; \
echo " make vault rekey - сменить пароль";; \
esac
####################################################################################################
# Работа с 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 "Доступные команды:"; \
echo " make git push - запушить изменения"; \
echo " make git pull - получить изменения"; \
echo " make git new - создать новую ветку";; \
esac
####################################################################################################
# Работа с Docker (упрощенная)
####################################################################################################
docker:
@case "$(word 2, $(MAKECMDGOALS))" in \
clean) \
echo "🧹 Очистка Docker ресурсов..."; \
docker system prune -f; \
docker volume prune -f; \
echo "✅ Docker ресурсы очищены";; \
*) \
echo "🐳 Docker команды:"; \
echo ""; \
echo "make docker clean - очистить Docker ресурсы"; \
echo ""; \
echo "💡 Основное тестирование через preset систему:"; \
echo " make role test [preset] - универсальное тестирование"; \
echo " make role presets - показать доступные preset'ы";; \
esac
####################################################################################################
# Справка
####################################################################################################
help:
@echo "=========================================="
@echo "AnsibleTemplate - Универсальная система"
@echo "тестирования Ansible ролей"
@echo "=========================================="
@echo ""
@echo "📁 Структура проекта:"
@echo " scripts/ - Скрипты автоматизации"
@echo " inventory/ - Инвентори файлы"
@echo " molecule/default/ - Molecule конфигурация"
@echo " roles/ - Ansible роли"
@echo " vault/ - Зашифрованные секреты"
@echo ""
@echo "🚀 Основные команды:"
@echo ""
@echo "🧪 ТЕСТИРОВАНИЕ (Docker контейнеры):"
@echo " make role test - протестировать роли (default preset)"
@echo " make role test [preset] - протестировать с любым preset"
@echo " make role test minimal - тест с minimal preset"
@echo " make role test standard - тест со standard preset"
@echo " make role test docker - тест с docker preset"
@echo ""
@echo "🚀 РАЗВЕРТЫВАНИЕ (Реальные серверы):"
@echo " make role deploy - развернуть роли на серверы"
@echo ""
@echo "🔧 ВСПОМОГАТЕЛЬНЫЕ:"
@echo " make role install - установить зависимости"
@echo " make role lint - проверить синтаксис ролей"
@echo " make docker clean - очистить Docker ресурсы"
@echo " make vault create - создать файл секретов"
@echo " make git new - создать новую ветку"
@echo ""
@echo "📖 Для подробной справки:"
@echo " make role - команды для ролей"
@echo " make molecule - команды Molecule"
@echo " make docker - команды Docker"
@echo " make vault - команды Vault"
@echo " make git - команды Git"
@echo "=========================================="
# Пустые цели для совместимости
view create edit show delete lint deploy new advanced presets:
@true
# Динамические цели для всех возможных preset'ов
# Это позволяет использовать make role test [любой_preset] без ошибок
%:
@true