# ============================================================================= # 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