#!/bin/bash # Интерактивный менеджер ролей # Автор: Сергей Антропов # Сайт: https://devops.org.ru set -e # Цвета для вывода 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 "$@"