diff --git a/Makefile b/Makefile index 011dbc6..ecf2254 100644 --- a/Makefile +++ b/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 # ============================================================================= diff --git a/README.md b/README.md index 6bca317..178ac4c 100644 --- a/README.md +++ b/README.md @@ -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 # Проверить весь проект на ошибки diff --git a/docs/roles.md b/docs/roles.md index 274debc..af8fc0b 100644 --- a/docs/roles.md +++ b/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). \ No newline at end of file +Сергей Антропов +Сайт: https://devops.org.ru \ No newline at end of file