- Создан новый README.md с полной документацией проекта - Перемещены все MD файлы в папку /docs - Создана структура документации: - docs/universal-lab.md - руководство по лаборатории - docs/presets.md - описание всех 21 пресета - docs/roles.md - структура и создание Ansible ролей - docs/examples.md - практические примеры использования - docs/troubleshooting.md - решение проблем - docs/api.md - справочник по API Основные возможности документации: - Полное описание всех возможностей лаборатории - 21 готовый пресет для различных сценариев - Подробные инструкции по использованию - Примеры создания собственных пресетов - Руководство по созданию Ansible ролей - Troubleshooting для решения проблем - API Reference для всех команд и параметров Структура проекта: - README.md - основная документация с ссылками - docs/ - централизованное хранение документации - molecule/presets/ - 21 готовый пресет - files/ - файлы для ролей и playbooks - scripts/ - скрипты для управления лабораторией Автор: Сергей Антропов Сайт: https://devops.org.ru
		
			
				
	
	
		
			420 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			420 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # 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/
 | ||
| ```
 | ||
| 
 | ||
| ### Ручное создание
 | ||
| 
 | ||
| ```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
 | ||
| ```
 | ||
| 
 | ||
| ## Использование роли
 | ||
| 
 | ||
| ### В playbook
 | ||
| 
 | ||
| ```yaml
 | ||
| ---
 | ||
| - name: Deploy web server
 | ||
|   hosts: webservers
 | ||
|   become: true
 | ||
|   roles:
 | ||
|     - your_role
 | ||
| ```
 | ||
| 
 | ||
| ### С переменными
 | ||
| 
 | ||
| ```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
 | ||
|   hosts: all
 | ||
|   become: true
 | ||
|   roles:
 | ||
|     - your_role
 | ||
| EOF
 | ||
| 
 | ||
| # Создать инвентарь для тестов
 | ||
| cat > roles/your_role/tests/inventory << EOF
 | ||
| [webservers]
 | ||
| localhost ansible_connection=local
 | ||
| EOF
 | ||
| ```
 | ||
| 
 | ||
| ### Запуск тестов
 | ||
| 
 | ||
| ```bash
 | ||
| # Запустить тест роли
 | ||
| ansible-playbook -i roles/your_role/tests/inventory roles/your_role/tests/test.yml
 | ||
| 
 | ||
| # Запустить тест с Molecule
 | ||
| molecule test
 | ||
| ```
 | ||
| 
 | ||
| ## Лучшие практики
 | ||
| 
 | ||
| ### Структура задач
 | ||
| 
 | ||
| ```yaml
 | ||
| ---
 | ||
| # tasks/main.yml
 | ||
| - name: Install package
 | ||
|   package:
 | ||
|     name: "{{ package_name }}"
 | ||
|     state: present
 | ||
|   notify: restart service
 | ||
| 
 | ||
| - name: Configure service
 | ||
|   template:
 | ||
|     src: config.j2
 | ||
|     dest: /etc/service/config.conf
 | ||
|   notify: restart service
 | ||
| 
 | ||
| - 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
 | ||
| ```
 | ||
| 
 | ||
| ## Интеграция с лабораторией
 | ||
| 
 | ||
| ### Использование в пресетах
 | ||
| 
 | ||
| ```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
 | ||
|   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
 | ||
| ```
 | ||
| 
 | ||
| ### Тестирование с различными пресетами
 | ||
| 
 | ||
| ```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). |