Ответ
Параллельное выполнение в Ansible значительно ускоряет развертывание на множестве хостов. Я использую несколько механизмов в зависимости от сценария.
1. Стратегия выполнения free (наиболее агрессивная)
---
- name: Deploy application cluster
hosts: web_servers # Группа из 10+ хостов
strategy: free
tasks:
- name: Update packages
apt:
update_cache: yes
cache_valid_time: 3600
async: 300 # Асинхронное выполнение с таймаутом
poll: 0 # Не ждем завершения, продолжаем
- name: Deploy application code
synchronize:
src: ./app/
dest: /opt/app/
delegate_to: "{{ inventory_hostname }}"
- name: Restart service
systemd:
name: app-service
state: restarted
async: 60
poll: 10 # Проверяем статус каждые 10 секунд
2. Настройка количества форков (параллельных соединений)
# В командной строке
ansible-playbook deploy.yml --forks 20
# Или в ansible.cfg
[defaults]
forks = 20
host_key_checking = False
# Увеличиваем таймауты для параллельного выполнения
timeout = 30
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
3. Параллельное выполнение с ограничениями
- name: Rolling update with batch
hosts: web_servers
serial: 3 # Обрабатываем по 3 хоста одновременно
tasks:
- name: Take host out of load balancer
uri:
url: "http://lb-api/disable/{{ inventory_hostname }}"
method: POST
- name: Apply updates
include_tasks: update_tasks.yml
- name: Return host to load balancer
uri:
url: "http://lb-api/enable/{{ inventory_hostname }}"
method: POST
4. Асинхронные задачи с проверкой статуса
- name: Run long operation
command: /opt/scripts/long-running-process.sh
async: 1800 # 30 минут максимум
poll: 30 # Проверяем каждые 30 секунд
register: long_task
- name: Check async task status
async_status:
jid: "{{ long_task.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: 30
delay: 30
5. Параллельное выполнение разных задач на разных хостах
- name: Database migration (только на master)
hosts: db_master
tasks:
- name: Run migrations
command: /opt/app/migrate.sh
- name: Application deployment (параллельно на всех app servers)
hosts: app_servers
strategy: free
tasks:
- name: Deploy code
synchronize:
src: ./app/
dest: /opt/app/
6. Использование throttle для ограничения нагрузки
- name: CPU-intensive operation
hosts: all
tasks:
- name: Compile software
make:
chdir: /src/
throttle: 2 # Не более 2 хостов одновременно
Ключевые практики:
- Тестирую параллельное выполнение в staging перед production
- Мониторю нагрузку на управляющей машине (CPU, память, сеть)
- Использую
serialдля rolling updates критических сервисов - Настраиваю правильные таймауты в
ansible.cfg - Логирую выполнение с тегами хостов для отладки
- Для очень больших инфраструктур (>1000 хостов) использую Ansible Tower/AWX с разбивкой на job templates