- Роли теперь создаются универсальными для RHEL и Debian семейств - Автоматическое создание OS-специфичных задач (debian.yml, redhat.yml) - Универсальные playbooks с поддержкой разных ОС - Обновлена документация с примерами и лучшими практиками Новые возможности: - Автоматическое определение ОС через ansible_os_family - OS-специфичные задачи в отдельных файлах - Универсальные playbooks с pre_tasks и post_tasks - Поддержка apt для Debian/Ubuntu и yum для RHEL/CentOS Структура универсальной роли: - tasks/main.yml - общая логика и включение OS-специфичных задач - tasks/debian.yml - задачи для Debian/Ubuntu (apt, systemd) - tasks/redhat.yml - задачи для RHEL/CentOS (yum, systemd) - playbooks/ - универсальные playbooks с поддержкой разных ОС Универсальные playbooks: - gather_facts: true - сбор информации об ОС - pre_tasks - отображение информации об ОС - post_tasks - проверка успешного развертывания - Переменные роли автоматически добавляются Документация: - Добавлен раздел 'Универсальные роли' в docs/roles.md - Примеры задач для Debian и RHEL семейств - Лучшие практики для универсальных ролей - Рекомендации по тестированию на разных ОС Преимущества: - Автоматическое создание универсальных ролей - Поддержка RHEL и Debian семейств из коробки - Лучшие практики встроены в шаблоны - Подробная документация с примерами - Приучение к написанию универсальных ролей Автор: Сергей Антропов Сайт: https://devops.org.ru
		
			
				
	
	
		
			372 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			372 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Управление ролями Ansible
 | ||
| 
 | ||
| Полное руководство по созданию, управлению и использованию ролей в универсальной лаборатории.
 | ||
| 
 | ||
| ## Создание роли
 | ||
| 
 | ||
| ### Интерактивное создание
 | ||
| 
 | ||
| ```bash
 | ||
| make role create NAME=my-role
 | ||
| ```
 | ||
| 
 | ||
| **Что происходит:**
 | ||
| 1. **Запрашивается описание роли** - краткое описание функциональности
 | ||
| 2. **Настраивается основной пакет** - имя пакета для установки
 | ||
| 3. **Настраивается сервис** - имя сервиса для управления
 | ||
| 4. **Выбираются платформы** - поддерживаемые ОС (ubuntu, centos, rhel)
 | ||
| 5. **Указываются теги** - теги для Ansible Galaxy
 | ||
| 6. **Создается универсальная структура роли** с поддержкой RHEL и Debian семейств
 | ||
| 7. **Создается папка `playbooks/`** для playbooks роли
 | ||
| 
 | ||
| ### Структура созданной роли
 | ||
| 
 | ||
| ```
 | ||
| roles/my-role/
 | ||
| ├── tasks/
 | ||
| │   ├── main.yml          # Основные задачи (универсальные)
 | ||
| │   ├── debian.yml        # Задачи для Debian/Ubuntu
 | ||
| │   └── redhat.yml        # Задачи для RHEL/CentOS
 | ||
| ├── handlers/
 | ||
| │   └── main.yml          # Обработчики
 | ||
| ├── templates/             # Шаблоны Jinja2
 | ||
| ├── files/                 # Статические файлы
 | ||
| ├── vars/
 | ||
| │   └── main.yml          # Переменные роли
 | ||
| ├── defaults/
 | ||
| │   └── main.yml          # Переменные по умолчанию
 | ||
| ├── meta/
 | ||
| │   └── main.yml          # Метаданные роли
 | ||
| ├── tests/                 # Тесты роли
 | ||
| └── playbooks/            # Playbooks роли
 | ||
|     └── (создаются через make role playbook)
 | ||
| ```
 | ||
| 
 | ||
| ## Универсальные роли
 | ||
| 
 | ||
| ### Принцип работы
 | ||
| 
 | ||
| Роли создаются **универсальными** для RHEL и Debian семейств:
 | ||
| 
 | ||
| 1. **`tasks/main.yml`** - содержит общую логику и включает OS-специфичные задачи
 | ||
| 2. **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
 | ||
| 3. **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
 | ||
| 
 | ||
| ### Автоматическое определение ОС
 | ||
| 
 | ||
| ```yaml
 | ||
| # tasks/main.yml
 | ||
| - name: Include OS-specific tasks
 | ||
|   include_tasks: "{{ ansible_os_family | lower }}.yml"
 | ||
| ```
 | ||
| 
 | ||
| **Поддерживаемые ОС:**
 | ||
| - **Debian семейство**: Ubuntu, Debian, Linux Mint
 | ||
| - **RHEL семейство**: CentOS, RHEL, Rocky Linux, AlmaLinux
 | ||
| 
 | ||
| ### Примеры задач
 | ||
| 
 | ||
| #### Debian/Ubuntu (tasks/debian.yml)
 | ||
| ```yaml
 | ||
| ---
 | ||
| # Задачи для Debian/Ubuntu семейства
 | ||
| 
 | ||
| - name: Update apt cache (Debian)
 | ||
|   apt:
 | ||
|     update_cache: true
 | ||
|     cache_valid_time: 3600
 | ||
|   when: ansible_os_family == 'Debian'
 | ||
| 
 | ||
| - name: Install nginx package (Debian)
 | ||
|   apt:
 | ||
|     name: "{{ nginx_package | default('nginx') }}"
 | ||
|     state: present
 | ||
|   when: ansible_os_family == 'Debian'
 | ||
| ```
 | ||
| 
 | ||
| #### RHEL/CentOS (tasks/redhat.yml)
 | ||
| ```yaml
 | ||
| ---
 | ||
| # Задачи для RHEL/CentOS семейства
 | ||
| 
 | ||
| - name: Update yum cache (RHEL)
 | ||
|   yum:
 | ||
|     update_cache: true
 | ||
|   when: ansible_os_family == 'RedHat'
 | ||
| 
 | ||
| - name: Install nginx package (RHEL)
 | ||
|   yum:
 | ||
|     name: "{{ nginx_package | default('nginx') }}"
 | ||
|     state: present
 | ||
|   when: ansible_os_family == 'RedHat'
 | ||
| ```
 | ||
| 
 | ||
| ## Управление playbooks роли
 | ||
| 
 | ||
| ### Создание playbook
 | ||
| 
 | ||
| ```bash
 | ||
| make role playbook NAME=my-role
 | ||
| # Выберите: create
 | ||
| # Введите имя: deploy
 | ||
| ```
 | ||
| 
 | ||
| **Создается файл:** `roles/my-role/playbooks/deploy.yml`
 | ||
| 
 | ||
| ```yaml
 | ||
| ---
 | ||
| # Playbook: deploy для роли my-role
 | ||
| # Автор: Сергей Антропов
 | ||
| # Сайт: https://devops.org.ru
 | ||
| 
 | ||
| - name: deploy
 | ||
|   hosts: all
 | ||
|   become: true
 | ||
|   gather_facts: true
 | ||
|   vars:
 | ||
|     # Переменные для роли my-role
 | ||
|     my_role_enabled: true
 | ||
| 
 | ||
|   pre_tasks:
 | ||
|     - name: Display OS information
 | ||
|       debug:
 | ||
|         msg: "OS Family: {{ ansible_os_family }}, OS: {{ ansible_distribution }} {{ ansible_distribution_version }}"
 | ||
| 
 | ||
|   roles:
 | ||
|     - role: my-role
 | ||
| 
 | ||
|   post_tasks:
 | ||
|     - name: Verify my-role installation
 | ||
|       debug:
 | ||
|         msg: "my-role successfully deployed on {{ inventory_hostname }}"
 | ||
| ```
 | ||
| 
 | ||
| ### Универсальные playbooks
 | ||
| 
 | ||
| Playbooks создаются **универсальными** с поддержкой:
 | ||
| 
 | ||
| 1. **`gather_facts: true`** - сбор информации об ОС
 | ||
| 2. **`pre_tasks`** - отображение информации об ОС
 | ||
| 3. **`post_tasks`** - проверка успешного развертывания
 | ||
| 4. **Переменные роли** - автоматически добавляются в `vars`
 | ||
| 
 | ||
| ### Список playbooks
 | ||
| 
 | ||
| ```bash
 | ||
| make role playbook NAME=my-role
 | ||
| # Выберите: list
 | ||
| ```
 | ||
| 
 | ||
| ### Редактирование 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. Универсальные роли
 | ||
| - **Всегда создавайте OS-специфичные задачи** в `debian.yml` и `redhat.yml`
 | ||
| - **Используйте `ansible_os_family`** для определения ОС
 | ||
| - **Тестируйте на разных платформах** (Ubuntu, CentOS, RHEL)
 | ||
| - **Используйте универсальные модули** когда возможно (package, systemd)
 | ||
| 
 | ||
| ### 2. Структура роли
 | ||
| - **`tasks/main.yml`** - общая логика и включение OS-специфичных задач
 | ||
| - **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
 | ||
| - **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
 | ||
| - **`handlers`** - для перезапуска сервисов
 | ||
| - **`templates`** - для конфигурационных файлов
 | ||
| - **`files`** - для статических файлов
 | ||
| 
 | ||
| ### 3. Переменные
 | ||
| - **`defaults/main.yml`** - значения по умолчанию
 | ||
| - **`vars/main.yml`** - внутренние переменные роли
 | ||
| - **Используйте префиксы** для переменных роли
 | ||
| - **Создавайте OS-специфичные переменные** при необходимости
 | ||
| 
 | ||
| ### 4. Playbooks
 | ||
| - **`gather_facts: true`** - всегда собирайте информацию об ОС
 | ||
| - **`pre_tasks`** - отображайте информацию об ОС
 | ||
| - **`post_tasks`** - проверяйте успешное развертывание
 | ||
| - **Используйте переменные** для настройки
 | ||
| 
 | ||
| ### 5. Тестирование
 | ||
| - **`make role test`** - проверка роли
 | ||
| - **Тестируйте на разных ОС** - Ubuntu, CentOS, RHEL
 | ||
| - **Создавайте тесты** в папке tests/
 | ||
| - **Проверяйте идемпотентность** - повторный запуск не должен изменять систему
 | ||
| 
 | ||
| ## Интеграция с лабораторией
 | ||
| 
 | ||
| ### Автоматическое добавление в систему
 | ||
| 
 | ||
| При создании роли через `make role create`:
 | ||
| 1. Роль автоматически добавляется в `deploy/tasks/main.yml`
 | ||
| 2. Создается переменная `{role_name}_enabled: true`
 | ||
| 3. Обновляется `site.yml` с новой ролью
 | ||
| 
 | ||
| ### Использование в playbooks
 | ||
| 
 | ||
| ```yaml
 | ||
| ---
 | ||
| - name: Deploy my-role
 | ||
|   hosts: all
 | ||
|   become: true
 | ||
|   roles:
 | ||
|     - role: my-role
 | ||
|       vars:
 | ||
|         my_role_enabled: true
 | ||
|         my_role_package: custom-package
 | ||
| ```
 | ||
| 
 | ||
| ## Автор
 | ||
| 
 | ||
| Сергей Антропов  
 | ||
| Сайт: https://devops.org.ru |