feat: Добавлена интерактивность и поддержка playbooks для ролей

- Улучшена команда make role create с интерактивным вводом
- Добавлена команда make role playbook для управления playbooks
- Создана папка playbooks/ в структуре роли
- Обновлена документация по работе с ролями

Новые возможности:
- Интерактивное создание роли с настройкой параметров
- Управление playbooks роли (create|list|edit|run)
- Автоматическое создание структуры с папкой playbooks
- Улучшенные метаданные роли с платформами и тегами

Интерактивные параметры при создании роли:
- Описание роли
- Основной пакет
- Сервис
- Платформы (ubuntu,centos,rhel)
- Теги для Ansible Galaxy

Команды playbooks:
- make role playbook NAME=my-role create - создать playbook
- make role playbook NAME=my-role list - список playbooks
- make role playbook NAME=my-role edit - редактировать playbook
- make role playbook NAME=my-role run - запустить playbook

Документация:
- Создан docs/roles.md с полным руководством
- Обновлен README.md с новыми командами
- Добавлены примеры использования

Преимущества:
- Полная интерактивность при создании ролей
- Удобное управление playbooks роли
- Автоматическая генерация структуры
- Подробная документация
- Интеграция с лабораторией

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
2025-10-22 14:53:35 +03:00
parent 111efd7d92
commit 0eb717ad82
3 changed files with 333 additions and 393 deletions

107
Makefile
View File

@@ -58,7 +58,7 @@ help: ## Показать справку по всем командам
@echo " $(CYAN)make lab <команда>$(RESET) - Управление лабораторией (up|down|test|destroy)"
@echo " $(CYAN)make kube <команда>$(RESET) - Управление Kubernetes (logs|exec|port-forward)"
@echo " $(CYAN)make preset <команда>$(RESET) - Управление пресетами (list|create|test)"
@echo " $(CYAN)make role <команда>$(RESET) - Управление ролями (list|create|test|lint)"
@echo " $(CYAN)make role <команда>$(RESET) - Управление ролями (list|create|test|lint|playbook)"
@echo " $(CYAN)make vault <команда>$(RESET) - Управление vault (view|create|edit|encrypt)"
@echo " $(CYAN)make report$(RESET) - Генерация HTML отчета"
@echo " $(CYAN)make lint$(RESET) - Проверка синтаксиса"
@@ -358,9 +358,23 @@ role: ## Управление ролями (list|create|edit|test|lint|deploy)
exit 1; \
fi; \
echo "$(YELLOW)📝 Создаем роль: $(NAME)$(RESET)"; \
mkdir -p $(ROLES_DIR)/$(NAME)/{tasks,handlers,templates,files,vars,defaults,meta,tests}; \
echo "$(BLUE)🔧 Настройка роли...$(RESET)"; \
read -p "$(YELLOW)📝 Описание роли: $(RESET)" ROLE_DESC; \
read -p "$(YELLOW)📦 Основной пакет (по умолчанию: $(NAME)): $(RESET)" ROLE_PACKAGE; \
ROLE_PACKAGE=$${ROLE_PACKAGE:-$(NAME)}; \
read -p "$(YELLOW)🔧 Сервис (по умолчанию: $(NAME)): $(RESET)" ROLE_SERVICE; \
ROLE_SERVICE=$${ROLE_SERVICE:-$(NAME)}; \
read -p "$(YELLOW)📋 Платформы (ubuntu,centos,rhel) через запятую: $(RESET)" ROLE_PLATFORMS; \
ROLE_PLATFORMS=$${ROLE_PLATFORMS:-ubuntu,centos}; \
read -p "$(YELLOW)🏷️ Теги через запятую: $(RESET)" ROLE_TAGS; \
ROLE_TAGS=$${ROLE_TAGS:-$(NAME)}; \
echo "$(BLUE)📁 Создаем структуру роли...$(RESET)"; \
mkdir -p $(ROLES_DIR)/$(NAME)/{tasks,handlers,templates,files,vars,defaults,meta,tests,playbooks}; \
echo "$(BLUE)📝 Создаем основные файлы...$(RESET)"; \
echo "---" > $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "# Основные задачи роли $(NAME)" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "# Автор: $(AUTHOR)" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "# Сайт: $(SITE)" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "- name: $(NAME) placeholder" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " debug:" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
@@ -368,40 +382,51 @@ role: ## Управление ролями (list|create|edit|test|lint|deploy)
echo "" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "- name: Install $(NAME) package" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " package:" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " name: \"{{ $(NAME)_package | default('$(NAME)') }}\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " name: \"{{ $(NAME)_package | default('$(ROLE_PACKAGE)') }}\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " state: present" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "- name: Start $(NAME) service" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " systemd:" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " name: \"{{ $(NAME)_service | default('$(NAME)') }}\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " name: \"{{ $(NAME)_service | default('$(ROLE_SERVICE)') }}\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " state: started" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " enabled: true" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo " when: $(NAME)_service is defined" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
echo "---" > $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "# Переменные по умолчанию для роли $(NAME)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "# Автор: $(AUTHOR)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "# Сайт: $(SITE)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "$(NAME)_enabled: true" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "$(NAME)_package: $(NAME)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "$(NAME)_service: $(NAME)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "$(NAME)_package: $(ROLE_PACKAGE)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "$(NAME)_service: $(ROLE_SERVICE)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
echo "---" > $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo "galaxy_info:" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " author: $(AUTHOR)" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " description: Роль $(NAME)" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " description: $(ROLE_DESC)" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " company: $(SITE)" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " license: MIT" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " min_ansible_version: 2.9" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " platforms:" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " - name: Ubuntu" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " versions: [focal, jammy]" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " - name: CentOS" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " versions: [7, 8, 9]" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " - name: RHEL" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " versions: [7, 8, 9]" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo " galaxy_tags: [$(ROLE_TAGS)]" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo "dependencies: []" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
echo "---" > $(ROLES_DIR)/$(NAME)/README.md; \
echo "# Роль $(NAME)" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "Описание роли $(NAME)." >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "$(ROLE_DESC)" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "## Переменные" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "| Переменная | По умолчанию | Описание |" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "|------------|--------------|----------|" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "| \`$(NAME)_enabled\` | \`true\` | Включить роль |" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "| \`$(NAME)_package\` | \`$(NAME)\` | Имя пакета |" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "| \`$(NAME)_service\` | \`$(NAME)\` | Имя сервиса |" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "| \`$(NAME)_package\` | \`$(ROLE_PACKAGE)\` | Имя пакета |" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "| \`$(NAME)_service\` | \`$(ROLE_SERVICE)\` | Имя сервиса |" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "## Использование" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
@@ -415,7 +440,10 @@ role: ## Управление ролями (list|create|edit|test|lint|deploy)
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "$(AUTHOR)" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "Сайт: $(SITE)" >> $(ROLES_DIR)/$(NAME)/README.md; \
echo "$(GREEN)✅ Роль $(NAME) создана$(RESET)";; \
echo "$(GREEN)✅ Роль $(NAME) создана$(RESET)"; \
echo "$(BLUE)📁 Структура: $(ROLES_DIR)/$(NAME)/$(RESET)"; \
echo "$(BLUE)📝 Основной файл: $(ROLES_DIR)/$(NAME)/tasks/main.yml$(RESET)"; \
echo "$(BLUE)📋 Playbooks: $(ROLES_DIR)/$(NAME)/playbooks/$(RESET)";; \
edit) \
if [ -z "$(NAME)" ]; then \
echo "$(RED)❌ Использование: make role edit NAME=my-role$(RESET)"; \
@@ -445,8 +473,63 @@ role: ## Управление ролями (list|create|edit|test|lint|deploy)
fi; \
echo "$(BLUE)📋 Информация о роли: $(NAME)$(RESET)"; \
docker exec ansible-controller bash -lc 'cat /ansible/roles/$(NAME)/README.md';; \
playbook) \
if [ -z "$(NAME)" ]; then \
echo "$(RED)❌ Использование: make role playbook NAME=my-role$(RESET)"; \
exit 1; \
fi; \
echo "$(BLUE)📋 Управление playbooks для роли: $(NAME)$(RESET)"; \
echo "$(YELLOW)Доступные команды:$(RESET)"; \
echo " $(CYAN)create$(RESET) - Создать новый playbook"; \
echo " $(CYAN)list$(RESET) - Список playbooks"; \
echo " $(CYAN)edit$(RESET) - Редактировать playbook"; \
echo " $(CYAN)run$(RESET) - Запустить playbook"; \
read -p "$(YELLOW)Выберите команду: $(RESET)" PLAYBOOK_CMD; \
case "$$PLAYBOOK_CMD" in \
create) \
read -p "$(YELLOW)📝 Имя playbook: $(RESET)" PLAYBOOK_NAME; \
if [ -z "$$PLAYBOOK_NAME" ]; then \
echo "$(RED)❌ Имя playbook обязательно$(RESET)"; \
exit 1; \
fi; \
echo "---" > $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo "# Playbook: $$PLAYBOOK_NAME для роли $(NAME)" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo "# Автор: $(AUTHOR)" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo "# Сайт: $(SITE)" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo "" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo "- name: $$PLAYBOOK_NAME" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo " hosts: all" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo " become: true" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo " roles:" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo " - role: $(NAME)" >> $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
echo "$(GREEN)✅ Playbook $$PLAYBOOK_NAME создан$(RESET)";; \
list) \
echo "$(CYAN)📋 Playbooks для роли $(NAME):$(RESET)"; \
if [ -d "$(ROLES_DIR)/$(NAME)/playbooks" ]; then \
ls -la $(ROLES_DIR)/$(NAME)/playbooks/*.yml 2>/dev/null | awk '{print " " $$9}' || echo " $(YELLOW)Нет playbooks$(RESET)"; \
else \
echo " $(YELLOW)Директория playbooks не найдена$(RESET)"; \
fi;; \
edit) \
read -p "$(YELLOW)📝 Имя playbook для редактирования: $(RESET)" PLAYBOOK_NAME; \
if [ -f "$(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml" ]; then \
$${EDITOR:-vim} $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml; \
else \
echo "$(RED)❌ Playbook $$PLAYBOOK_NAME не найден$(RESET)"; \
fi;; \
run) \
read -p "$(YELLOW)📝 Имя playbook для запуска: $(RESET)" PLAYBOOK_NAME; \
if [ -f "$(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml" ]; then \
echo "$(BLUE)🚀 Запускаем playbook: $$PLAYBOOK_NAME$(RESET)"; \
docker exec ansible-controller bash -lc "ansible-playbook -i /tmp/molecule/inventory/hosts.yml $(ROLES_DIR)/$(NAME)/playbooks/$$PLAYBOOK_NAME.yml"; \
else \
echo "$(RED)❌ Playbook $$PLAYBOOK_NAME не найден$(RESET)"; \
fi;; \
*) \
echo "$(RED)❌ Неизвестная команда playbook$(RESET)";; \
esac;; \
*) \
echo "$(RED)❌ Неизвестная команда. Доступные: list, create, edit, test, lint, deploy, info$(RESET)";; \
echo "$(RED)❌ Неизвестная команда. Доступные: list, create, edit, test, lint, deploy, info, playbook$(RESET)";; \
esac
# =============================================================================