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:
		
							
								
								
									
										107
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								Makefile
									
									
									
									
									
								
							| @@ -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 | ||||
|  | ||||
| # ============================================================================= | ||||
|   | ||||
| @@ -96,11 +96,12 @@ make preset edit NAME=my-preset | ||||
|  | ||||
| # Управление ролями | ||||
| make role list       # Список ролей | ||||
| make role create NAME=my-role | ||||
| make role test NAME=my-role | ||||
| make role create NAME=my-role  # Создать роль (интерактивно) | ||||
| make role test NAME=my-role    # Тестировать роль | ||||
| make role lint       # Проверка ролей | ||||
| make role deploy     # Развертывание ролей | ||||
| make role info NAME=my-role  # Информация о роли | ||||
| make role info NAME=my-role    # Информация о роли | ||||
| make role playbook NAME=my-role  # Управление playbooks роли | ||||
|  | ||||
| # Проверка всего проекта | ||||
| make lint            # Проверить весь проект на ошибки | ||||
|   | ||||
							
								
								
									
										612
									
								
								docs/roles.md
									
									
									
									
									
								
							
							
						
						
									
										612
									
								
								docs/roles.md
									
									
									
									
									
								
							| @@ -1,420 +1,276 @@ | ||||
| # Ansible Роли | ||||
| # Управление ролями Ansible | ||||
|  | ||||
| ## Автор | ||||
| Сергей Антропов   | ||||
| Сайт: https://devops.org.ru | ||||
|  | ||||
| ## Описание | ||||
|  | ||||
| Этот документ описывает структуру, создание и использование Ansible ролей в универсальной лаборатории. | ||||
|  | ||||
| ## Содержание | ||||
|  | ||||
| - [Структура роли](#структура-роли) | ||||
| - [Создание роли](#создание-роли) | ||||
| - [Использование роли](#использование-роли) | ||||
| - [Тестирование роли](#тестирование-роли) | ||||
| - [Лучшие практики](#лучшие-практики) | ||||
| - [Примеры ролей](#примеры-ролей) | ||||
|  | ||||
| ## Структура роли | ||||
|  | ||||
| ``` | ||||
| roles/ | ||||
| └── your_role/ | ||||
|     ├── tasks/           # Основные задачи | ||||
|     │   └── main.yml | ||||
|     ├── handlers/        # Обработчики событий | ||||
|     │   └── main.yml | ||||
|     ├── templates/       # Jinja2 шаблоны | ||||
|     │   └── config.j2 | ||||
|     ├── files/           # Статические файлы | ||||
|     │   └── config.conf | ||||
|     ├── vars/            # Переменные роли | ||||
|     │   └── main.yml | ||||
|     ├── defaults/        # Переменные по умолчанию | ||||
|     │   └── main.yml | ||||
|     ├── meta/            # Метаданные роли | ||||
|     │   └── main.yml | ||||
|     └── tests/           # Тесты роли | ||||
|         ├── inventory | ||||
|         └── test.yml | ||||
| ``` | ||||
|  | ||||
| ### Описание директорий | ||||
|  | ||||
| | Директория | Описание | Обязательная | | ||||
| |------------|----------|--------------| | ||||
| | `tasks/` | Основные задачи роли | Да | | ||||
| | `handlers/` | Обработчики событий | Нет | | ||||
| | `templates/` | Jinja2 шаблоны | Нет | | ||||
| | `files/` | Статические файлы | Нет | | ||||
| | `vars/` | Переменные роли | Нет | | ||||
| | `defaults/` | Переменные по умолчанию | Нет | | ||||
| | `meta/` | Метаданные роли | Нет | | ||||
| | `tests/` | Тесты роли | Нет | | ||||
| Полное руководство по созданию, управлению и использованию ролей в универсальной лаборатории. | ||||
|  | ||||
| ## Создание роли | ||||
|  | ||||
| ### Автоматическое создание | ||||
| ### Интерактивное создание | ||||
|  | ||||
| ```bash | ||||
| # Создать роль с помощью ansible-galaxy | ||||
| ansible-galaxy init your_role | ||||
|  | ||||
| # Создать роль в определенной директории | ||||
| ansible-galaxy init your_role --init-path roles/ | ||||
| make role create NAME=my-role | ||||
| ``` | ||||
|  | ||||
| ### Ручное создание | ||||
| **Что происходит:** | ||||
| 1. **Запрашивается описание роли** - краткое описание функциональности | ||||
| 2. **Настраивается основной пакет** - имя пакета для установки | ||||
| 3. **Настраивается сервис** - имя сервиса для управления | ||||
| 4. **Выбираются платформы** - поддерживаемые ОС (ubuntu, centos, rhel) | ||||
| 5. **Указываются теги** - теги для Ansible Galaxy | ||||
| 6. **Создается структура роли** с папкой `playbooks/` | ||||
|  | ||||
| ### Структура созданной роли | ||||
|  | ||||
| ``` | ||||
| roles/my-role/ | ||||
| ├── tasks/ | ||||
| │   └── main.yml          # Основные задачи | ||||
| ├── handlers/ | ||||
| │   └── main.yml          # Обработчики | ||||
| ├── templates/             # Шаблоны Jinja2 | ||||
| ├── files/                 # Статические файлы | ||||
| ├── vars/ | ||||
| │   └── main.yml          # Переменные роли | ||||
| ├── defaults/ | ||||
| │   └── main.yml          # Переменные по умолчанию | ||||
| ├── meta/ | ||||
| │   └── main.yml          # Метаданные роли | ||||
| ├── tests/                 # Тесты роли | ||||
| └── playbooks/            # Playbooks роли | ||||
|     └── (создаются через make role playbook) | ||||
| ``` | ||||
|  | ||||
| ## Управление playbooks роли | ||||
|  | ||||
| ### Создание playbook | ||||
|  | ||||
| ```bash | ||||
| # Создать структуру роли | ||||
| mkdir -p roles/your_role/{tasks,handlers,templates,files,vars,defaults,meta,tests} | ||||
|  | ||||
| # Создать основной task | ||||
| cat > roles/your_role/tasks/main.yml << EOF | ||||
| --- | ||||
| - name: Install package | ||||
|   package: | ||||
|     name: "{{ package_name }}" | ||||
|     state: present | ||||
|  | ||||
| - name: Start service | ||||
|   service: | ||||
|     name: "{{ service_name }}" | ||||
|     state: started | ||||
|     enabled: true | ||||
| EOF | ||||
|  | ||||
| # Создать переменные по умолчанию | ||||
| cat > roles/your_role/defaults/main.yml << EOF | ||||
| --- | ||||
| package_name: nginx | ||||
| service_name: nginx | ||||
| EOF | ||||
| make role playbook NAME=my-role | ||||
| # Выберите: create | ||||
| # Введите имя: deploy | ||||
| ``` | ||||
|  | ||||
| ## Использование роли | ||||
|  | ||||
| ### В playbook | ||||
| **Создается файл:** `roles/my-role/playbooks/deploy.yml` | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| - name: Deploy web server | ||||
|   hosts: webservers | ||||
|   become: true | ||||
|   roles: | ||||
|     - your_role | ||||
| ``` | ||||
| # Playbook: deploy для роли my-role | ||||
| # Автор: Сергей Антропов | ||||
| # Сайт: https://devops.org.ru | ||||
|  | ||||
| ### С переменными | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| - name: Deploy web server | ||||
|   hosts: webservers | ||||
|   become: true | ||||
|   roles: | ||||
|     - role: your_role | ||||
|       vars: | ||||
|         package_name: apache2 | ||||
|         service_name: apache2 | ||||
| ``` | ||||
|  | ||||
| ### С условиями | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| - name: Deploy web server | ||||
|   hosts: webservers | ||||
|   become: true | ||||
|   roles: | ||||
|     - role: your_role | ||||
|       when: ansible_os_family == "Debian" | ||||
| ``` | ||||
|  | ||||
| ## Тестирование роли | ||||
|  | ||||
| ### Создание тестов | ||||
|  | ||||
| ```bash | ||||
| # Создать тестовый playbook | ||||
| cat > roles/your_role/tests/test.yml << EOF | ||||
| --- | ||||
| - name: Test role | ||||
| - name: deploy | ||||
|   hosts: all | ||||
|   become: true | ||||
|   roles: | ||||
|     - your_role | ||||
| EOF | ||||
|  | ||||
| # Создать инвентарь для тестов | ||||
| cat > roles/your_role/tests/inventory << EOF | ||||
| [webservers] | ||||
| localhost ansible_connection=local | ||||
| EOF | ||||
|     - role: my-role | ||||
| ``` | ||||
|  | ||||
| ### Запуск тестов | ||||
| ### Список playbooks | ||||
|  | ||||
| ```bash | ||||
| # Запустить тест роли | ||||
| ansible-playbook -i roles/your_role/tests/inventory roles/your_role/tests/test.yml | ||||
| make role playbook NAME=my-role | ||||
| # Выберите: list | ||||
| ``` | ||||
|  | ||||
| # Запустить тест с Molecule | ||||
| molecule test | ||||
| ### Редактирование playbook | ||||
|  | ||||
| ```bash | ||||
| make role playbook NAME=my-role | ||||
| # Выберите: edit | ||||
| # Введите имя: deploy | ||||
| ``` | ||||
|  | ||||
| ### Запуск playbook | ||||
|  | ||||
| ```bash | ||||
| make role playbook NAME=my-role | ||||
| # Выберите: run | ||||
| # Введите имя: deploy | ||||
| ``` | ||||
|  | ||||
| ## Команды управления ролями | ||||
|  | ||||
| ### Основные команды | ||||
|  | ||||
| ```bash | ||||
| # Список ролей | ||||
| make role list | ||||
|  | ||||
| # Создать роль (интерактивно) | ||||
| make role create NAME=my-role | ||||
|  | ||||
| # Редактировать роль | ||||
| make role edit NAME=my-role | ||||
|  | ||||
| # Тестировать роль | ||||
| make role test NAME=my-role | ||||
|  | ||||
| # Проверить синтаксис | ||||
| make role lint | ||||
|  | ||||
| # Развернуть роли | ||||
| make role deploy | ||||
|  | ||||
| # Информация о роли | ||||
| make role info NAME=my-role | ||||
|  | ||||
| # Управление playbooks | ||||
| make role playbook NAME=my-role | ||||
| ``` | ||||
|  | ||||
| ### Интерактивные возможности | ||||
|  | ||||
| #### При создании роли: | ||||
| - **Описание роли** - автоматически добавляется в README.md | ||||
| - **Основной пакет** - настраивается в defaults/main.yml | ||||
| - **Сервис** - настраивается в defaults/main.yml | ||||
| - **Платформы** - добавляются в meta/main.yml | ||||
| - **Теги** - добавляются в meta/main.yml | ||||
|  | ||||
| #### При работе с playbooks: | ||||
| - **Создание** - интерактивный ввод имени | ||||
| - **Редактирование** - выбор из списка существующих | ||||
| - **Запуск** - выбор playbook для выполнения | ||||
|  | ||||
| ## Примеры использования | ||||
|  | ||||
| ### Создание роли nginx | ||||
|  | ||||
| ```bash | ||||
| make role create NAME=nginx | ||||
| # Описание: Nginx web server role | ||||
| # Пакет: nginx | ||||
| # Сервис: nginx | ||||
| # Платформы: ubuntu,centos | ||||
| # Теги: web,nginx,server | ||||
| ``` | ||||
|  | ||||
| ### Создание playbook для nginx | ||||
|  | ||||
| ```bash | ||||
| make role playbook NAME=nginx | ||||
| # Выберите: create | ||||
| # Имя: install | ||||
| ``` | ||||
|  | ||||
| **Результат:** `roles/nginx/playbooks/install.yml` | ||||
|  | ||||
| ### Запуск playbook | ||||
|  | ||||
| ```bash | ||||
| make role playbook NAME=nginx | ||||
| # Выберите: run | ||||
| # Имя: install | ||||
| ``` | ||||
|  | ||||
| ## Структура файлов роли | ||||
|  | ||||
| ### tasks/main.yml | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # Основные задачи роли nginx | ||||
| # Автор: Сергей Антропов | ||||
| # Сайт: https://devops.org.ru | ||||
|  | ||||
| - name: nginx placeholder | ||||
|   debug: | ||||
|     msg: "Роль nginx готова для настройки" | ||||
|  | ||||
| - name: Install nginx package | ||||
|   package: | ||||
|     name: "{{ nginx_package | default('nginx') }}" | ||||
|     state: present | ||||
|  | ||||
| - name: Start nginx service | ||||
|   systemd: | ||||
|     name: "{{ nginx_service | default('nginx') }}" | ||||
|     state: started | ||||
|     enabled: true | ||||
|   when: nginx_service is defined | ||||
| ``` | ||||
|  | ||||
| ### defaults/main.yml | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # Переменные по умолчанию для роли nginx | ||||
| # Автор: Сергей Антропов | ||||
| # Сайт: https://devops.org.ru | ||||
|  | ||||
| nginx_enabled: true | ||||
| nginx_package: nginx | ||||
| nginx_service: nginx | ||||
| ``` | ||||
|  | ||||
| ### meta/main.yml | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| galaxy_info: | ||||
|   author: Сергей Антропов | ||||
|   description: Nginx web server role | ||||
|   company: https://devops.org.ru | ||||
|   license: MIT | ||||
|   min_ansible_version: 2.9 | ||||
|   platforms: | ||||
|     - name: Ubuntu | ||||
|       versions: [focal, jammy] | ||||
|     - name: CentOS | ||||
|       versions: [7, 8, 9] | ||||
|     - name: RHEL | ||||
|       versions: [7, 8, 9] | ||||
|   galaxy_tags: [web,nginx,server] | ||||
| dependencies: [] | ||||
| ``` | ||||
|  | ||||
| ## Лучшие практики | ||||
|  | ||||
| ### Структура задач | ||||
| ### 1. Структура роли | ||||
| - Используйте **tasks/main.yml** для основных задач | ||||
| - Создавайте **отдельные файлы** для сложных задач | ||||
| - Используйте **handlers** для перезапуска сервисов | ||||
| - Храните **шаблоны** в templates/ | ||||
| - Храните **статические файлы** в files/ | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # tasks/main.yml | ||||
| - name: Install package | ||||
|   package: | ||||
|     name: "{{ package_name }}" | ||||
|     state: present | ||||
|   notify: restart service | ||||
| ### 2. Переменные | ||||
| - **defaults/main.yml** - значения по умолчанию | ||||
| - **vars/main.yml** - внутренние переменные роли | ||||
| - Используйте **префиксы** для переменных роли | ||||
|  | ||||
| - name: Configure service | ||||
|   template: | ||||
|     src: config.j2 | ||||
|     dest: /etc/service/config.conf | ||||
|   notify: restart service | ||||
| ### 3. Playbooks | ||||
| - Создавайте **отдельные playbooks** для разных сценариев | ||||
| - Используйте **переменные** для настройки | ||||
| - Добавляйте **проверки** и **валидацию** | ||||
|  | ||||
| - name: Start service | ||||
|   service: | ||||
|     name: "{{ service_name }}" | ||||
|     state: started | ||||
|     enabled: true | ||||
| ``` | ||||
|  | ||||
| ### Обработчики | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # handlers/main.yml | ||||
| - name: restart service | ||||
|   service: | ||||
|     name: "{{ service_name }}" | ||||
|     state: restarted | ||||
| ``` | ||||
|  | ||||
| ### Переменные | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # defaults/main.yml | ||||
| package_name: nginx | ||||
| service_name: nginx | ||||
| config_file: /etc/nginx/nginx.conf | ||||
| port: 80 | ||||
|  | ||||
| # vars/main.yml | ||||
| service_user: nginx | ||||
| service_group: nginx | ||||
| ``` | ||||
|  | ||||
| ### Метаданные | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # meta/main.yml | ||||
| galaxy_info: | ||||
|   author: Your Name | ||||
|   description: Your role description | ||||
|   company: Your Company | ||||
|   license: MIT | ||||
|   min_ansible_version: "2.9" | ||||
|   platforms: | ||||
|     - name: Ubuntu | ||||
|       versions: | ||||
|         - focal | ||||
|         - jammy | ||||
|     - name: CentOS | ||||
|       versions: | ||||
|         - 8 | ||||
|         - 9 | ||||
|   galaxy_tags: | ||||
|     - web | ||||
|     - nginx | ||||
| dependencies: [] | ||||
| ``` | ||||
|  | ||||
| ## Примеры ролей | ||||
|  | ||||
| ### Роль для веб-сервера | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # tasks/main.yml | ||||
| - name: Install nginx | ||||
|   package: | ||||
|     name: nginx | ||||
|     state: present | ||||
|  | ||||
| - name: Configure nginx | ||||
|   template: | ||||
|     src: nginx.conf.j2 | ||||
|     dest: /etc/nginx/nginx.conf | ||||
|   notify: restart nginx | ||||
|  | ||||
| - name: Start nginx | ||||
|   service: | ||||
|     name: nginx | ||||
|     state: started | ||||
|     enabled: true | ||||
| ``` | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # defaults/main.yml | ||||
| nginx_port: 80 | ||||
| nginx_ssl_port: 443 | ||||
| nginx_user: www-data | ||||
| nginx_worker_processes: auto | ||||
| ``` | ||||
|  | ||||
| ### Роль для базы данных | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # tasks/main.yml | ||||
| - name: Install PostgreSQL | ||||
|   package: | ||||
|     name: postgresql | ||||
|     state: present | ||||
|  | ||||
| - name: Start PostgreSQL | ||||
|   service: | ||||
|     name: postgresql | ||||
|     state: started | ||||
|     enabled: true | ||||
|  | ||||
| - name: Create database | ||||
|   postgresql_db: | ||||
|     name: "{{ db_name }}" | ||||
|     state: present | ||||
|  | ||||
| - name: Create user | ||||
|   postgresql_user: | ||||
|     name: "{{ db_user }}" | ||||
|     password: "{{ db_password }}" | ||||
|     state: present | ||||
| ``` | ||||
|  | ||||
| ### Роль для мониторинга | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # tasks/main.yml | ||||
| - name: Install Prometheus | ||||
|   package: | ||||
|     name: prometheus | ||||
|     state: present | ||||
|  | ||||
| - name: Configure Prometheus | ||||
|   template: | ||||
|     src: prometheus.yml.j2 | ||||
|     dest: /etc/prometheus/prometheus.yml | ||||
|   notify: restart prometheus | ||||
|  | ||||
| - name: Start Prometheus | ||||
|   service: | ||||
|     name: prometheus | ||||
|     state: started | ||||
|     enabled: true | ||||
| ``` | ||||
| ### 4. Тестирование | ||||
| - Используйте **make role test** для проверки | ||||
| - Создавайте **тесты** в папке tests/ | ||||
| - Проверяйте **разные платформы** | ||||
|  | ||||
| ## Интеграция с лабораторией | ||||
|  | ||||
| ### Использование в пресетах | ||||
| ### Автоматическое добавление в систему | ||||
|  | ||||
| При создании роли через `make role create`: | ||||
| 1. Роль автоматически добавляется в `deploy/tasks/main.yml` | ||||
| 2. Создается переменная `{role_name}_enabled: true` | ||||
| 3. Обновляется `site.yml` с новой ролью | ||||
|  | ||||
| ### Использование в playbooks | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # molecule/presets/webapp.yml | ||||
| hosts: | ||||
|   - name: web1 | ||||
|     group: webservers | ||||
|     family: debian | ||||
|     publish: | ||||
|       - "8080:80" | ||||
|    | ||||
|   - name: db1 | ||||
|     group: databases | ||||
|     family: rhel | ||||
|     publish: | ||||
|       - "5432:5432" | ||||
| ``` | ||||
|  | ||||
| ### Playbook для ролей | ||||
|  | ||||
| ```yaml | ||||
| --- | ||||
| # files/playbooks/site.yml | ||||
| - name: Deploy web servers | ||||
|   hosts: webservers | ||||
| - name: Deploy my-role | ||||
|   hosts: all | ||||
|   become: true | ||||
|   roles: | ||||
|     - nginx | ||||
|     - ssl | ||||
|  | ||||
| - name: Deploy databases | ||||
|   hosts: databases | ||||
|   become: true | ||||
|   roles: | ||||
|     - postgresql | ||||
|     - backup | ||||
|  | ||||
| - name: Deploy monitoring | ||||
|   hosts: monitoring | ||||
|   become: true | ||||
|   roles: | ||||
|     - prometheus | ||||
|     - grafana | ||||
|     - role: my-role | ||||
|       vars: | ||||
|         my_role_enabled: true | ||||
|         my_role_package: custom-package | ||||
| ``` | ||||
|  | ||||
| ### Тестирование с различными пресетами | ||||
| ## Автор | ||||
|  | ||||
| ```bash | ||||
| # Тестирование с минимальным пресетом | ||||
| make lab-test LAB_SPEC=molecule/presets/minimal.yml | ||||
|  | ||||
| # Тестирование с веб-приложением | ||||
| make lab-test LAB_SPEC=molecule/presets/webapp.yml | ||||
|  | ||||
| # Тестирование с микросервисами | ||||
| make lab-test LAB_SPEC=molecule/presets/microservices.yml | ||||
| ``` | ||||
|  | ||||
| ## Публикация роли | ||||
|  | ||||
| ### В Ansible Galaxy | ||||
|  | ||||
| ```bash | ||||
| # Установить ansible-galaxy | ||||
| pip install ansible-galaxy | ||||
|  | ||||
| # Публиковать роль | ||||
| ansible-galaxy import your-username your-role | ||||
|  | ||||
| # Или через GitHub | ||||
| ansible-galaxy import your-username your-role --github-user your-username | ||||
| ``` | ||||
|  | ||||
| ### В приватном репозитории | ||||
|  | ||||
| ```bash | ||||
| # Установить роль из Git | ||||
| ansible-galaxy install git+https://github.com/your-username/your-role.git | ||||
|  | ||||
| # Установить роль из файла | ||||
| ansible-galaxy install your-role.tar.gz | ||||
| ``` | ||||
|  | ||||
| ## Заключение | ||||
|  | ||||
| Этот документ описывает основные принципы создания и использования Ansible ролей в универсальной лаборатории. Для получения дополнительной информации обратитесь к [основной документации](universal-lab.md) и [примерам использования](examples.md). | ||||
| Сергей Антропов   | ||||
| Сайт: https://devops.org.ru | ||||
		Reference in New Issue
	
	Block a user