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

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