- Создан файл docs/deploy-yml-customization.md с полным руководством - Добавлены примеры использования become, групп, переменных, тегов - Показаны примеры условного выполнения и параллелизма - Добавлены примеры обработки ошибок и безопасности - Включены примеры использования Vault и отладки - Добавлены лучшие практики и рекомендации - Обновлен roles/deploy.yml с примерами кастомизации - Добавлены ссылки на документацию в Makefile и README.md Документация включает: - 15 разделов с подробными примерами - Команды запуска с различными параметрами - Примеры продакшн развертывания - Настройки безопасности и мониторинга - Обработка ошибок и логирование
521 lines
14 KiB
Markdown
521 lines
14 KiB
Markdown
# Кастомизация deploy.yml - Полное руководство
|
||
|
||
## Описание
|
||
|
||
Файл `roles/deploy.yml` - это основной playbook для развертывания Ansible ролей на продакшн серверах. Этот документ содержит полную сводку по кастомизации и настройке различных сценариев развертывания.
|
||
|
||
## Базовый пример
|
||
|
||
```yaml
|
||
---
|
||
# Playbook для развертывания на продакшн серверах
|
||
# Автор: Сергей Антропов
|
||
# Сайт: https://devops.org.ru
|
||
|
||
- name: Развертывание всех ролей
|
||
hosts: all
|
||
roles:
|
||
- ping
|
||
```
|
||
|
||
## 1. Управление привилегиями (become)
|
||
|
||
### Базовое использование become
|
||
```yaml
|
||
- name: Развертывание с sudo правами
|
||
hosts: all
|
||
become: true
|
||
roles:
|
||
- nginx
|
||
- postgresql
|
||
```
|
||
|
||
### Become с паролем
|
||
```yaml
|
||
- name: Развертывание с sudo паролем
|
||
hosts: all
|
||
become: true
|
||
become_method: sudo
|
||
become_user: root
|
||
vars:
|
||
ansible_become_pass: "{{ vault_sudo_password }}"
|
||
roles:
|
||
- nginx
|
||
```
|
||
|
||
### Become для конкретных ролей
|
||
```yaml
|
||
- name: Развертывание с разными привилегиями
|
||
hosts: all
|
||
roles:
|
||
- role: nginx
|
||
become: true
|
||
- role: app-config
|
||
become: false
|
||
```
|
||
|
||
## 2. Группировка хостов
|
||
|
||
### Развертывание по группам
|
||
```yaml
|
||
- name: Развертывание на веб-серверах
|
||
hosts: webservers
|
||
become: true
|
||
roles:
|
||
- nginx
|
||
- php-fpm
|
||
|
||
- name: Развертывание на БД серверах
|
||
hosts: databases
|
||
become: true
|
||
roles:
|
||
- postgresql
|
||
- redis
|
||
|
||
- name: Развертывание на мониторинг серверах
|
||
hosts: monitoring
|
||
become: true
|
||
roles:
|
||
- prometheus
|
||
- grafana
|
||
```
|
||
|
||
### Условное развертывание
|
||
```yaml
|
||
- name: Развертывание на production
|
||
hosts: production
|
||
become: true
|
||
when: environment == "production"
|
||
roles:
|
||
- nginx
|
||
- ssl-certificates
|
||
|
||
- name: Развертывание на staging
|
||
hosts: staging
|
||
become: false
|
||
when: environment == "staging"
|
||
roles:
|
||
- nginx
|
||
```
|
||
|
||
## 3. Переменные и конфигурация
|
||
|
||
### Глобальные переменные
|
||
```yaml
|
||
- name: Развертывание с переменными
|
||
hosts: all
|
||
become: true
|
||
vars:
|
||
nginx_port: 80
|
||
nginx_ssl_port: 443
|
||
app_name: "my-application"
|
||
app_version: "1.0.0"
|
||
roles:
|
||
- nginx
|
||
- application
|
||
```
|
||
|
||
### Переменные для конкретных ролей
|
||
```yaml
|
||
- name: Развертывание с ролевыми переменными
|
||
hosts: all
|
||
become: true
|
||
roles:
|
||
- role: nginx
|
||
vars:
|
||
nginx_port: 80
|
||
nginx_ssl_enabled: true
|
||
- role: postgresql
|
||
vars:
|
||
postgresql_version: "13"
|
||
postgresql_max_connections: 200
|
||
```
|
||
|
||
### Использование group_vars и host_vars
|
||
```yaml
|
||
# group_vars/webservers.yml
|
||
nginx_worker_processes: 4
|
||
nginx_worker_connections: 1024
|
||
|
||
# group_vars/databases.yml
|
||
postgresql_shared_buffers: "256MB"
|
||
postgresql_effective_cache_size: "1GB"
|
||
|
||
# В deploy.yml
|
||
- name: Развертывание с групповыми переменными
|
||
hosts: webservers:databases
|
||
become: true
|
||
roles:
|
||
- nginx
|
||
- postgresql
|
||
```
|
||
|
||
## 4. Теги (Tags)
|
||
|
||
### Базовое использование тегов
|
||
```yaml
|
||
- name: Развертывание с тегами
|
||
hosts: all
|
||
become: true
|
||
roles:
|
||
- role: nginx
|
||
tags: ['web', 'nginx']
|
||
- role: postgresql
|
||
tags: ['database', 'postgresql']
|
||
- role: monitoring
|
||
tags: ['monitoring', 'prometheus']
|
||
```
|
||
|
||
### Запуск с тегами
|
||
```bash
|
||
# Развертывание только веб-серверов
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web
|
||
|
||
# Развертывание только БД
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags database
|
||
|
||
# Развертывание веб + БД
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web,database
|
||
|
||
# Пропустить мониторинг
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --skip-tags monitoring
|
||
```
|
||
|
||
## 5. Обработчики (Handlers)
|
||
|
||
### Использование обработчиков
|
||
```yaml
|
||
- name: Развертывание с обработчиками
|
||
hosts: all
|
||
become: true
|
||
roles:
|
||
- nginx
|
||
- postgresql
|
||
handlers:
|
||
- name: restart nginx
|
||
service:
|
||
name: nginx
|
||
state: restarted
|
||
listen: "restart nginx"
|
||
|
||
- name: restart postgresql
|
||
service:
|
||
name: postgresql
|
||
state: restarted
|
||
listen: "restart postgresql"
|
||
```
|
||
|
||
## 6. Условное выполнение
|
||
|
||
### Условия на основе переменных
|
||
```yaml
|
||
- name: Развертывание с условиями
|
||
hosts: all
|
||
become: true
|
||
roles:
|
||
- role: nginx
|
||
when: nginx_enabled | default(true)
|
||
- role: postgresql
|
||
when: database_enabled | default(true)
|
||
- role: redis
|
||
when: cache_enabled | default(false)
|
||
```
|
||
|
||
### Условия на основе групп
|
||
```yaml
|
||
- name: Развертывание с групповыми условиями
|
||
hosts: all
|
||
become: true
|
||
roles:
|
||
- role: nginx
|
||
when: "'webservers' in group_names"
|
||
- role: postgresql
|
||
when: "'databases' in group_names"
|
||
- role: monitoring
|
||
when: "'monitoring' in group_names"
|
||
```
|
||
|
||
## 7. Параллельное выполнение
|
||
|
||
### Настройка параллелизма
|
||
```yaml
|
||
- name: Развертывание с параллелизмом
|
||
hosts: all
|
||
become: true
|
||
serial: 2 # Выполнять на 2 хостах одновременно
|
||
roles:
|
||
- nginx
|
||
- postgresql
|
||
```
|
||
|
||
### Каскадное развертывание
|
||
```yaml
|
||
- name: Развертывание БД (первыми)
|
||
hosts: databases
|
||
become: true
|
||
serial: 1
|
||
roles:
|
||
- postgresql
|
||
|
||
- name: Развертывание приложений (после БД)
|
||
hosts: webservers
|
||
become: true
|
||
serial: 2
|
||
roles:
|
||
- nginx
|
||
- application
|
||
```
|
||
|
||
## 8. Обработка ошибок
|
||
|
||
### Игнорирование ошибок
|
||
```yaml
|
||
- name: Развертывание с игнорированием ошибок
|
||
hosts: all
|
||
become: true
|
||
ignore_errors: true
|
||
roles:
|
||
- nginx
|
||
- postgresql
|
||
```
|
||
|
||
### Обработка ошибок на уровне ролей
|
||
```yaml
|
||
- name: Развертывание с обработкой ошибок
|
||
hosts: all
|
||
become: true
|
||
roles:
|
||
- role: nginx
|
||
ignore_errors: true
|
||
- role: postgresql
|
||
ignore_errors: false
|
||
```
|
||
|
||
## 9. Инвентарь и подключение
|
||
|
||
### Различные пользователи
|
||
```yaml
|
||
- name: Развертывание с разными пользователями
|
||
hosts: all
|
||
become: true
|
||
remote_user: "{{ ansible_user | default('ubuntu') }}"
|
||
roles:
|
||
- nginx
|
||
- postgresql
|
||
```
|
||
|
||
### SSH настройки
|
||
```yaml
|
||
- name: Развертывание с SSH настройками
|
||
hosts: all
|
||
become: true
|
||
gather_facts: true
|
||
roles:
|
||
- nginx
|
||
- postgresql
|
||
vars:
|
||
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
|
||
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
|
||
```
|
||
|
||
## 10. Полный пример продакшн развертывания
|
||
|
||
```yaml
|
||
---
|
||
# Полный пример продакшн развертывания
|
||
# Автор: Сергей Антропов
|
||
# Сайт: https://devops.org.ru
|
||
|
||
# 1. Развертывание инфраструктуры
|
||
- name: Развертывание инфраструктуры
|
||
hosts: infrastructure
|
||
become: true
|
||
serial: 1
|
||
roles:
|
||
- role: nginx
|
||
vars:
|
||
nginx_ssl_enabled: true
|
||
nginx_ssl_cert: "{{ ssl_cert_path }}"
|
||
nginx_ssl_key: "{{ ssl_key_path }}"
|
||
tags: ['infrastructure', 'nginx']
|
||
|
||
# 2. Развертывание БД
|
||
- name: Развертывание базы данных
|
||
hosts: databases
|
||
become: true
|
||
serial: 1
|
||
roles:
|
||
- role: postgresql
|
||
vars:
|
||
postgresql_version: "13"
|
||
postgresql_max_connections: 200
|
||
postgresql_shared_buffers: "256MB"
|
||
tags: ['database', 'postgresql']
|
||
|
||
# 3. Развертывание приложений
|
||
- name: Развертывание приложений
|
||
hosts: webservers
|
||
become: true
|
||
serial: 2
|
||
roles:
|
||
- role: nginx
|
||
vars:
|
||
nginx_upstream_servers: "{{ app_servers }}"
|
||
tags: ['application', 'nginx']
|
||
- role: application
|
||
vars:
|
||
app_version: "{{ app_version }}"
|
||
app_environment: "{{ environment }}"
|
||
tags: ['application']
|
||
|
||
# 4. Развертывание мониторинга
|
||
- name: Развертывание мониторинга
|
||
hosts: monitoring
|
||
become: true
|
||
when: monitoring_enabled | default(true)
|
||
roles:
|
||
- role: prometheus
|
||
tags: ['monitoring', 'prometheus']
|
||
- role: grafana
|
||
tags: ['monitoring', 'grafana']
|
||
```
|
||
|
||
## 11. Команды запуска
|
||
|
||
### Базовые команды
|
||
```bash
|
||
# Развертывание всех ролей
|
||
make role deploy
|
||
|
||
# Развертывание с проверкой (dry-run)
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check
|
||
|
||
# Развертывание с тегами
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web,database
|
||
|
||
# Развертывание с переменными
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -e "app_version=1.0.0"
|
||
|
||
# Развертывание с лимитом хостов
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --limit webservers
|
||
```
|
||
|
||
### Продвинутые команды
|
||
```bash
|
||
# Развертывание с параллелизмом
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --forks 5
|
||
|
||
# Развертывание с детальным выводом
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -vvv
|
||
|
||
# Развертывание с обработкой ошибок
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --force-handlers
|
||
|
||
# Развертывание с тестированием
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check --diff
|
||
```
|
||
|
||
## 12. Переменные окружения
|
||
|
||
### Использование переменных окружения
|
||
```bash
|
||
# Установка переменных окружения
|
||
export ANSIBLE_HOST_KEY_CHECKING=False
|
||
export ANSIBLE_SSH_RETRIES=3
|
||
export ANSIBLE_TIMEOUT=30
|
||
|
||
# Развертывание
|
||
make role deploy
|
||
```
|
||
|
||
### Файл переменных
|
||
```yaml
|
||
# group_vars/all.yml
|
||
ansible_user: ubuntu
|
||
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
|
||
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
|
||
|
||
# Переменные приложения
|
||
app_name: "my-application"
|
||
app_version: "1.0.0"
|
||
environment: "production"
|
||
|
||
# Переменные БД
|
||
postgresql_version: "13"
|
||
postgresql_max_connections: 200
|
||
```
|
||
|
||
## 13. Безопасность
|
||
|
||
### Использование Vault
|
||
```yaml
|
||
# В deploy.yml
|
||
- name: Развертывание с секретами
|
||
hosts: all
|
||
become: true
|
||
vars:
|
||
db_password: "{{ vault_db_password }}"
|
||
ssl_cert: "{{ vault_ssl_cert }}"
|
||
roles:
|
||
- postgresql
|
||
- nginx
|
||
```
|
||
|
||
### Запуск с Vault
|
||
```bash
|
||
# Развертывание с паролем Vault
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --ask-vault-pass
|
||
|
||
# Развертывание с файлом пароля
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file .vault_pass
|
||
```
|
||
|
||
## 14. Отладка и логирование
|
||
|
||
### Включение отладки
|
||
```yaml
|
||
- name: Развертывание с отладкой
|
||
hosts: all
|
||
become: true
|
||
debug: true
|
||
roles:
|
||
- nginx
|
||
- postgresql
|
||
```
|
||
|
||
### Логирование
|
||
```bash
|
||
# Развертывание с логированием
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --log-path /var/log/ansible.log
|
||
|
||
# Развертывание с детальным выводом
|
||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -vvv
|
||
```
|
||
|
||
## 15. Лучшие практики
|
||
|
||
### Структура файла
|
||
1. **Комментарии** - описывайте каждый блок
|
||
2. **Группировка** - логически группируйте роли
|
||
3. **Переменные** - выносите переменные в отдельные файлы
|
||
4. **Теги** - используйте теги для гибкости
|
||
5. **Условия** - добавляйте условия для безопасности
|
||
|
||
### Рекомендации
|
||
- Используйте `become: true` для системных ролей
|
||
- Группируйте хосты по функциональности
|
||
- Применяйте теги для модульности
|
||
- Используйте переменные для конфигурации
|
||
- Добавляйте условия для безопасности
|
||
- Логируйте все операции
|
||
- Тестируйте с `--check` перед развертыванием
|
||
|
||
## Заключение
|
||
|
||
Файл `roles/deploy.yml` - это центральный элемент развертывания. Правильная его настройка обеспечивает гибкость, безопасность и надежность развертывания Ansible ролей на продакшн серверах.
|
||
|
||
Для получения дополнительной информации см.:
|
||
- [Создание ролей](creating-roles.md)
|
||
- [Настройка CI/CD](cicd-setup.md)
|
||
- [Мониторинг](monitoring.md)
|