feat: Добавлены интерактивные команды для управления ролями

- Добавлен скрипт 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 - документация роли
This commit is contained in:
Сергей Антропов
2025-10-25 19:19:06 +03:00
parent 9ce30e0d67
commit e98bfa9c1f
2 changed files with 277 additions and 2 deletions

View File

@@ -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'ы"

253
scripts/role-manager.sh Executable file
View File

@@ -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 "$@"