347 lines
17 KiB
Makefile
347 lines
17 KiB
Makefile
# =============================================================================
|
||
# 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
|
||
CONTAINER_NAME ?= ansible-controller
|
||
|
||
.PHONY: role molecule vault git docker help
|
||
|
||
####################################################################################################
|
||
# Работа с ролями
|
||
####################################################################################################
|
||
role:
|
||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||
lint) \
|
||
clear; \
|
||
echo "$(BLUE)🔍 Проверка синтаксиса ролей ...$(RESET)"; \
|
||
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 "$(GREEN)✅ Lint завершен$(RESET)";; \
|
||
test) \
|
||
clear; \
|
||
echo "$(PURPLE)🚀 Тестирование ролей ...$(RESET)"; \
|
||
PRESET="default"; \
|
||
# Получаем все аргументы после 'test' и берем первый как preset \
|
||
ARGS="$(filter-out test,$(MAKECMDGOALS))"; \
|
||
if [ -n "$$ARGS" ]; then \
|
||
PRESET="$$(echo $$ARGS | cut -d' ' -f1)"; \
|
||
fi; \
|
||
echo "$(CYAN)📋 Используется пресет: $(YELLOW)$$PRESET$(RESET)"; \
|
||
if [ ! -f "molecule/presets/$$PRESET.yml" ]; then \
|
||
echo "$(RED)❌ Ошибка: Пресет '$$PRESET' не найден!$(RESET)"; \
|
||
echo "$(YELLOW)💡 Доступные пресеты:$(RESET)"; \
|
||
ls -1 molecule/presets/*.yml 2>/dev/null | sed 's|molecule/presets/||g' | sed 's|\.yml||g' | sed 's/^/ - /' || echo " $(YELLOW)⚠️ Пресеты не найдены$(RESET)"; \
|
||
echo ""; \
|
||
echo "$(GREEN)💡 Использование:$(RESET)"; \
|
||
echo " $(BLUE)make role test$(RESET) - с default preset"; \
|
||
echo " $(BLUE)make role test [preset_name]$(RESET) - с любым preset"; \
|
||
echo " $(BLUE)make role test minimal$(RESET) - с minimal preset"; \
|
||
echo " $(BLUE)make role test standard$(RESET) - со standard preset"; \
|
||
echo " $(BLUE)make role test docker$(RESET) - с docker preset"; \
|
||
exit 1; \
|
||
fi; \
|
||
echo ""; \
|
||
docker run --rm --name $(CONTAINER_NAME) -v "$(PWD):/workspace" -w /workspace \
|
||
-e ANSIBLE_FORCE_COLOR=1 \
|
||
-e MOLECULE_PRESET=$$PRESET \
|
||
$(DOCKER_IMAGE) \
|
||
bash -c "cd molecule/default && ansible-playbook -i localhost, site.yml --connection=local" || echo "$(GREEN)✅ Тестирование завершено$(RESET)";; \
|
||
presets) \
|
||
clear; \
|
||
echo "$(CYAN)📋 Доступные пресеты:$(RESET)"; \
|
||
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 " $(BLUE)📄 %s$(RESET) - %s $(GREEN)(%s хостов)$(RESET)\n" "$$preset_name" "$$preset_desc" "$$host_count"; \
|
||
preset_count=$$((preset_count + 1)); \
|
||
fi; \
|
||
done; \
|
||
if [ $$preset_count -eq 0 ]; then \
|
||
echo " $(YELLOW)⚠️ Пресеты не найдены$(RESET)"; \
|
||
fi; \
|
||
echo ""; \
|
||
echo "$(GREEN)💡 Использование:$(RESET)"; \
|
||
echo " $(BLUE)make role test$(RESET) - с default preset"; \
|
||
echo " $(BLUE)make role test [preset_name]$(RESET) - с любым preset"; \
|
||
echo " $(BLUE)make role test minimal$(RESET) - с minimal preset"; \
|
||
echo " $(BLUE)make role test standard$(RESET) - со standard preset"; \
|
||
echo " $(BLUE)make role test docker$(RESET) - с docker preset"; \
|
||
echo ""; \
|
||
echo "$(YELLOW)💡 Примеры:$(RESET)"; \
|
||
echo " $(BLUE)make role test$(RESET) # default preset"; \
|
||
echo " $(BLUE)make role test minimal$(RESET) # minimal preset"; \
|
||
echo " $(BLUE)make role test my-custom-preset$(RESET) # любой preset";; \
|
||
deploy) \
|
||
clear; \
|
||
echo "$(PURPLE)🚀 Развертывание ролей на реальные серверы...$(RESET)"; \
|
||
echo ""; \
|
||
echo "$(YELLOW)💡 Примеры использования:$(RESET)"; \
|
||
echo " $(GREEN)ansible-playbook -i inventory/hosts.ini deploy.yml$(RESET)"; \
|
||
echo " $(GREEN)ansible-playbook -i inventory/hosts.ini deploy.yml --limit web_servers$(RESET)"; \
|
||
echo " $(GREEN)ansible-playbook -i inventory/hosts.ini deploy.yml --check$(RESET)"; \
|
||
echo ""; \
|
||
echo "$(CYAN)📄 Доступные playbook:$(RESET)"; \
|
||
ls -la *.yml 2>/dev/null | grep -v molecule || echo " $(BLUE)📄 deploy.yml - основной playbook для развертывания$(RESET)";; \
|
||
*) \
|
||
clear; \
|
||
echo "$(CYAN)🎯 Доступные команды:$(RESET)"; \
|
||
echo ""; \
|
||
echo " $(BLUE)🔧 make role install$(RESET) - установить зависимости"; \
|
||
echo " $(BLUE)🔍 make role lint$(RESET) - проверить синтаксис ролей"; \
|
||
echo " $(PURPLE)🚀 make role test$(RESET) - протестировать роли (default preset)"; \
|
||
echo " $(PURPLE)🚀 make role test [preset]$(RESET) - протестировать с любым preset"; \
|
||
echo " $(PURPLE)🚀 make role test minimal$(RESET) - протестировать с minimal preset"; \
|
||
echo " $(PURPLE)🚀 make role test standard$(RESET) - протестировать со standard preset"; \
|
||
echo " $(PURPLE)🚀 make role test docker$(RESET) - протестировать с docker preset"; \
|
||
echo " $(CYAN)📋 make role presets$(RESET) - показать список preset'ов"; \
|
||
echo " $(PURPLE)🚀 make role deploy$(RESET) - развернуть роли";; \
|
||
esac
|
||
|
||
|
||
####################################################################################################
|
||
# Работа с Molecule Universal
|
||
####################################################################################################
|
||
molecule:
|
||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||
create) \
|
||
clear; \
|
||
echo "Создание тестового окружения ..."; \
|
||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||
quay.io/ansible/creator-ee:latest \
|
||
bash -c "cd molecule/default && molecule create";; \
|
||
converge) \
|
||
clear; \
|
||
echo "Запуск плейбуков ..."; \
|
||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||
quay.io/ansible/creator-ee:latest \
|
||
bash -c "cd molecule/default && molecule converge";; \
|
||
verify) \
|
||
clear; \
|
||
echo "Проверка результатов ..."; \
|
||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||
quay.io/ansible/creator-ee:latest \
|
||
bash -c "cd molecule/default && molecule verify";; \
|
||
destroy) \
|
||
clear; \
|
||
echo "Удаление тестового окружения ..."; \
|
||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||
quay.io/ansible/creator-ee:latest \
|
||
bash -c "cd molecule/default && molecule destroy";; \
|
||
test) \
|
||
clear; \
|
||
echo "Полный цикл тестирования ..."; \
|
||
docker run --rm -v "$(PWD):/workspace" -w /workspace \
|
||
quay.io/ansible/creator-ee:latest \
|
||
bash -c "cd molecule/default && molecule test";; \
|
||
*) \
|
||
clear; \
|
||
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) \
|
||
clear; \
|
||
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) \
|
||
clear; \
|
||
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) \
|
||
clear; \
|
||
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) \
|
||
clear; \
|
||
echo "Доступные файлы секретов:"; \
|
||
ls -la vault/*.yml 2>/dev/null || echo "Нет зашифрованных файлов"; \
|
||
echo ""; \
|
||
read -p "Введите имя файла (без .yml): " FILE; \
|
||
rm -f vault/$$FILE.yml;; \
|
||
rekey) \
|
||
clear; \
|
||
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) \
|
||
clear; \
|
||
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) \
|
||
clear; \
|
||
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;; \
|
||
*) \
|
||
clear; \
|
||
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";; \
|
||
*) \
|
||
clear; \
|
||
echo "Доступные команды:"; \
|
||
echo " make git push - запушить изменения"; \
|
||
echo " make git pull - получить изменения"; \
|
||
echo " make git new - создать новую ветку";; \
|
||
esac
|
||
|
||
####################################################################################################
|
||
# Работа с Docker (упрощенная)
|
||
####################################################################################################
|
||
docker:
|
||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||
clean) \
|
||
clear; \
|
||
echo "$(RED)🧹 Очистка Docker ресурсов...$(RESET)"; \
|
||
docker system prune -f; \
|
||
docker volume prune -f; \
|
||
echo "$(GREEN)✅ Docker ресурсы очищены$(RESET)";; \
|
||
*) \
|
||
clear; \
|
||
echo "$(CYAN)🐳 Docker команды:$(RESET)"; \
|
||
echo ""; \
|
||
echo "$(RED)make docker clean$(RESET) - очистить Docker ресурсы"; \
|
||
echo ""; \
|
||
echo "$(YELLOW)💡 Основное тестирование через preset систему:$(RESET)"; \
|
||
echo " $(BLUE)make role test [preset]$(RESET) - универсальное тестирование"; \
|
||
echo " $(BLUE)make role presets$(RESET) - показать доступные preset'ы";; \
|
||
esac
|
||
|
||
####################################################################################################
|
||
# Справка
|
||
####################################################################################################
|
||
help:
|
||
@clear
|
||
@echo "=========================================="
|
||
@echo "AnsibleTemplate - Универсальная система"
|
||
@echo "тестирования Ansible ролей"
|
||
@echo "=========================================="
|
||
@echo ""
|
||
@echo "📁 Структура проекта:"
|
||
@echo " scripts/ - Скрипты автоматизации"
|
||
@echo " inventory/ - Инвентори файлы"
|
||
@echo " molecule/default/ - Molecule конфигурация"
|
||
@echo " roles/ - Ansible роли"
|
||
@echo " vault/ - Зашифрованные секреты"
|
||
@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 deploy - развернуть роли на серверы"
|
||
@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 test lint deploy new advanced presets:
|
||
@true
|
||
|
||
# Динамические цели для всех возможных preset'ов
|
||
# Это позволяет использовать make role test [любой_preset] без ошибок
|
||
%:
|
||
@true
|