Files
DevOpsLab/docs/deploy-yml-customization.md
Сергей Антропов 5c2b63848c docs: Добавлена полная документация по кастомизации deploy.yml
- Создан файл docs/deploy-yml-customization.md с полным руководством
- Добавлены примеры использования become, групп, переменных, тегов
- Показаны примеры условного выполнения и параллелизма
- Добавлены примеры обработки ошибок и безопасности
- Включены примеры использования Vault и отладки
- Добавлены лучшие практики и рекомендации
- Обновлен roles/deploy.yml с примерами кастомизации
- Добавлены ссылки на документацию в Makefile и README.md

Документация включает:
- 15 разделов с подробными примерами
- Команды запуска с различными параметрами
- Примеры продакшн развертывания
- Настройки безопасности и мониторинга
- Обработка ошибок и логирование
2025-10-25 19:21:59 +03:00

14 KiB
Raw Permalink Blame History

Кастомизация deploy.yml - Полное руководство

Описание

Файл roles/deploy.yml - это основной playbook для развертывания Ansible ролей на продакшн серверах. Этот документ содержит полную сводку по кастомизации и настройке различных сценариев развертывания.

Базовый пример

---
# Playbook для развертывания на продакшн серверах
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru

- name: Развертывание всех ролей
  hosts: all
  roles:
    - ping

1. Управление привилегиями (become)

Базовое использование become

- name: Развертывание с sudo правами
  hosts: all
  become: true
  roles:
    - nginx
    - postgresql

Become с паролем

- name: Развертывание с sudo паролем
  hosts: all
  become: true
  become_method: sudo
  become_user: root
  vars:
    ansible_become_pass: "{{ vault_sudo_password }}"
  roles:
    - nginx

Become для конкретных ролей

- name: Развертывание с разными привилегиями
  hosts: all
  roles:
    - role: nginx
      become: true
    - role: app-config
      become: false

2. Группировка хостов

Развертывание по группам

- 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

Условное развертывание

- 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. Переменные и конфигурация

Глобальные переменные

- 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

Переменные для конкретных ролей

- 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

# 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)

Базовое использование тегов

- name: Развертывание с тегами
  hosts: all
  become: true
  roles:
    - role: nginx
      tags: ['web', 'nginx']
    - role: postgresql
      tags: ['database', 'postgresql']
    - role: monitoring
      tags: ['monitoring', 'prometheus']

Запуск с тегами

# Развертывание только веб-серверов
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)

Использование обработчиков

- 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. Условное выполнение

Условия на основе переменных

- 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)

Условия на основе групп

- 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. Параллельное выполнение

Настройка параллелизма

- name: Развертывание с параллелизмом
  hosts: all
  become: true
  serial: 2  # Выполнять на 2 хостах одновременно
  roles:
    - nginx
    - postgresql

Каскадное развертывание

- name: Развертывание БД (первыми)
  hosts: databases
  become: true
  serial: 1
  roles:
    - postgresql

- name: Развертывание приложений (после БД)
  hosts: webservers
  become: true
  serial: 2
  roles:
    - nginx
    - application

8. Обработка ошибок

Игнорирование ошибок

- name: Развертывание с игнорированием ошибок
  hosts: all
  become: true
  ignore_errors: true
  roles:
    - nginx
    - postgresql

Обработка ошибок на уровне ролей

- name: Развертывание с обработкой ошибок
  hosts: all
  become: true
  roles:
    - role: nginx
      ignore_errors: true
    - role: postgresql
      ignore_errors: false

9. Инвентарь и подключение

Различные пользователи

- name: Развертывание с разными пользователями
  hosts: all
  become: true
  remote_user: "{{ ansible_user | default('ubuntu') }}"
  roles:
    - nginx
    - postgresql

SSH настройки

- 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. Полный пример продакшн развертывания

---
# Полный пример продакшн развертывания
# Автор: Сергей Антропов
# Сайт: 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. Команды запуска

Базовые команды

# Развертывание всех ролей
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

Продвинутые команды

# Развертывание с параллелизмом
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. Переменные окружения

Использование переменных окружения

# Установка переменных окружения
export ANSIBLE_HOST_KEY_CHECKING=False
export ANSIBLE_SSH_RETRIES=3
export ANSIBLE_TIMEOUT=30

# Развертывание
make role deploy

Файл переменных

# 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

# В deploy.yml
- name: Развертывание с секретами
  hosts: all
  become: true
  vars:
    db_password: "{{ vault_db_password }}"
    ssl_cert: "{{ vault_ssl_cert }}"
  roles:
    - postgresql
    - nginx

Запуск с Vault

# Развертывание с паролем 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. Отладка и логирование

Включение отладки

- name: Развертывание с отладкой
  hosts: all
  become: true
  debug: true
  roles:
    - nginx
    - postgresql

Логирование

# Развертывание с логированием
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 ролей на продакшн серверах.

Для получения дополнительной информации см.: