From e98bfa9c1f0006cf11869bff9a18f6d0de17d741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=90=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D0=BE=D0=B2?= Date: Sat, 25 Oct 2025 19:19:06 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=80=D0=BE=D0=BB?= =?UTF-8?q?=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлен скрипт scripts/role-manager.sh для управления ролями - Добавлены команды make role list, create, delete - Автоматическое создание структуры ролей (tasks, handlers, defaults, meta, README) - Автоматическое обновление roles/deploy.yml при создании/удалении ролей - Интерактивный интерфейс с подтверждением удаления - Цветной вывод с эмодзи для лучшего UX Команды: - make role list - показать все роли - make role create - создать новую роль (интерактивно) - make role delete - удалить роль (интерактивно) Скрипт создает полную структуру роли: - tasks/main.yml - основные задачи - defaults/main.yml - переменные по умолчанию - handlers/main.yml - обработчики - meta/main.yml - метаданные для Ansible Galaxy - README.md - документация роли --- Makefile | 26 ++++- scripts/role-manager.sh | 253 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 277 insertions(+), 2 deletions(-) create mode 100755 scripts/role-manager.sh diff --git a/Makefile b/Makefile index 4759ebf..cc67116 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ DOCKER_BUILDX_BUILDER ?= multiarch-builder # Базовые образы и их теги BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi quay.io/centos/centos:stream9 almalinux:8 rockylinux:8 -.PHONY: role vault git docker presets controller help update-playbooks generate-docs setup-cicd +.PHONY: role vault git docker presets controller help update-playbooks generate-docs setup-cicd list create delete # ============================================================================= # КОМАНДЫ ДЛЯ РАБОТЫ С РОЛЯМИ @@ -109,6 +109,12 @@ role: else \ echo "❌ Развертывание отменено"; \ fi;; \ + list) \ + ./scripts/role-manager.sh list;; \ + create) \ + ./scripts/role-manager.sh create;; \ + delete) \ + ./scripts/role-manager.sh delete;; \ *) \ echo "🎯 Доступные команды:"; \ echo ""; \ @@ -123,7 +129,20 @@ role: echo " 💡 Требует: inventory/hosts.ini"; \ echo ""; \ echo " 🔍 make role lint - проверить синтаксис ролей"; \ - echo " 💡 Использует: ansible-lint";; \ + echo " 💡 Использует: ansible-lint"; \ + echo ""; \ + echo " 📋 make role list - показать все роли"; \ + echo " 💡 Показывает: список всех ролей в roles/"; \ + echo ""; \ + echo " ➕ make role create - создать новую роль"; \ + echo " 💡 Интерактивно: запрашивает имя роли"; \ + echo " 💡 Создает: структуру папок и файлов"; \ + echo " 💡 Обновляет: roles/deploy.yml"; \ + echo ""; \ + echo " 🗑️ make role delete - удалить роль"; \ + echo " 💡 Интерактивно: запрашивает имя роли"; \ + echo " 💡 Удаляет: папку роли и файлы"; \ + echo " 💡 Обновляет: roles/deploy.yml";; \ esac # ============================================================================= @@ -914,6 +933,9 @@ help: @echo " make role lint - проверить синтаксис ролей" @echo " make role test [preset] - протестировать роли с preset'ом" @echo " make role deploy - развернуть роли на реальные серверы" + @echo " make role list - показать все роли" + @echo " make role create - создать новую роль (интерактивно)" + @echo " make role delete - удалить роль (интерактивно)" @echo "" @echo "📋 PRESET'Ы (тестовые окружения):" @echo " make presets list - показать все доступные preset'ы" diff --git a/scripts/role-manager.sh b/scripts/role-manager.sh new file mode 100755 index 0000000..569e769 --- /dev/null +++ b/scripts/role-manager.sh @@ -0,0 +1,253 @@ +#!/bin/bash +# Интерактивный менеджер ролей +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +set -euo pipefail + +# Цвета для вывода +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' + +# Функция для вывода заголовков +print_header() { + echo -e "${BLUE}==========================================${RESET}" + echo -e "${BLUE}$1${RESET}" + echo -e "${BLUE}==========================================${RESET}" +} + +# Функция для вывода успеха +print_success() { + echo -e "${GREEN}✅ $1${RESET}" +} + +# Функция для вывода ошибки +print_error() { + echo -e "${RED}❌ $1${RESET}" +} + +# Функция для вывода предупреждения +print_warning() { + echo -e "${YELLOW}⚠️ $1${RESET}" +} + +# Функция для вывода информации +print_info() { + echo -e "${CYAN}💡 $1${RESET}" +} + +# Список всех ролей +list_roles() { + print_header "📋 Список всех ролей" + echo "" + + if [ -d "roles" ]; then + ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | grep -v '^deploy$' | sort) + if [ -n "$ROLES" ]; then + echo "$ROLES" | sed 's/^/ - /' + echo "" + echo "📊 Всего ролей: $(echo "$ROLES" | wc -l)" + else + print_warning "Роли не найдены" + fi + else + print_error "Директория roles/ не найдена" + fi +} + +# Создание новой роли +create_role() { + print_header "➕ Создание новой роли" + echo "" + + read -p "Введите имя роли: " ROLE_NAME + if [ -z "$ROLE_NAME" ]; then + print_error "Имя роли не может быть пустым" + exit 1 + fi + + if [ -d "roles/$ROLE_NAME" ]; then + print_error "Роль '$ROLE_NAME' уже существует" + exit 1 + fi + + echo "📁 Создание структуры роли '$ROLE_NAME'..." + mkdir -p "roles/$ROLE_NAME"/{tasks,handlers,templates,files,vars,defaults,meta} + + echo "📝 Создание файлов..." + + # tasks/main.yml + cat > "roles/$ROLE_NAME/tasks/main.yml" << EOF +--- +# Задачи для роли $ROLE_NAME +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Пример задачи + debug: + msg: "Роль $ROLE_NAME выполнена" +EOF + + # defaults/main.yml + cat > "roles/$ROLE_NAME/defaults/main.yml" << EOF +--- +# Переменные по умолчанию для роли $ROLE_NAME +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru +EOF + + # handlers/main.yml + cat > "roles/$ROLE_NAME/handlers/main.yml" << EOF +--- +# Обработчики для роли $ROLE_NAME +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru +EOF + + # meta/main.yml + cat > "roles/$ROLE_NAME/meta/main.yml" << EOF +--- +galaxy_info: + author: Сергей Антропов + description: Роль $ROLE_NAME + company: https://devops.org.ru + license: MIT + min_ansible_version: "2.9" + platforms: + - name: Ubuntu + versions: + - focal + - jammy + - name: Debian + versions: + - bullseye + - bookworm + - name: RHEL + versions: + - "8" + - "9" + - name: CentOS + versions: + - "8" + - "9" + galaxy_tags: + - $ROLE_NAME +EOF + + # README.md + cat > "roles/$ROLE_NAME/README.md" << EOF +# Роль $ROLE_NAME + +## Описание + +Роль для ... + +## Переменные + +| Переменная | По умолчанию | Описание | +|------------|--------------|----------| +| | | | + +## Примеры использования + +\`\`\`yaml +- hosts: all + roles: + - $ROLE_NAME +\`\`\` + +## Автор + +Сергей Антропов - https://devops.org.ru +EOF + + echo "🔄 Обновление roles/deploy.yml..." + ./scripts/update-playbooks.sh + + print_success "Роль '$ROLE_NAME' создана и добавлена в deploy.yml" + echo "" + echo "📁 Структура создана:" + echo " roles/$ROLE_NAME/" + echo " ├── tasks/main.yml" + echo " ├── defaults/main.yml" + echo " ├── handlers/main.yml" + echo " ├── meta/main.yml" + echo " └── README.md" + echo "" + print_info "Следующие шаги:" + echo " 1. Отредактируйте tasks/main.yml" + echo " 2. Добавьте переменные в defaults/main.yml" + echo " 3. Протестируйте: make role test" +} + +# Удаление роли +delete_role() { + print_header "🗑️ Удаление роли" + echo "" + + echo "📋 Доступные роли:" + ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | grep -v '^deploy$' | sort) + if [ -n "$ROLES" ]; then + echo "$ROLES" | sed 's/^/ - /' + echo "" + read -p "Введите имя роли для удаления: " ROLE_NAME + if [ -z "$ROLE_NAME" ]; then + print_error "Имя роли не может быть пустым" + exit 1 + fi + + if [ ! -d "roles/$ROLE_NAME" ]; then + print_error "Роль '$ROLE_NAME' не найдена" + exit 1 + fi + + print_warning "Вы уверены, что хотите удалить роль '$ROLE_NAME'?" + read -p "Введите 'yes' для подтверждения: " CONFIRM + if [ "$CONFIRM" = "yes" ]; then + echo "🗑️ Удаление роли '$ROLE_NAME'..." + rm -rf "roles/$ROLE_NAME" + echo "🔄 Обновление roles/deploy.yml..." + ./scripts/update-playbooks.sh + print_success "Роль '$ROLE_NAME' удалена и убрана из deploy.yml" + else + print_error "Удаление отменено" + fi + else + print_warning "Роли не найдены" + fi +} + +# Главное меню +main() { + case "${1:-}" in + list) + list_roles + ;; + create) + create_role + ;; + delete) + delete_role + ;; + *) + echo "🎯 Доступные команды:" + echo "" + echo " 📋 ./scripts/role-manager.sh list - показать все роли" + echo " ➕ ./scripts/role-manager.sh create - создать новую роль" + echo " 🗑️ ./scripts/role-manager.sh delete - удалить роль" + echo "" + echo "💡 Или используйте:" + echo " make role list" + echo " make role create" + echo " make role delete" + ;; + esac +} + +main "$@"