В типичной конфигурации Ansible запускает каждый таск одновременно на всех целевых хостах, используя 5 fork'ов. Если в начале плейбука необходимо отключить сервис на всех машинах, а включить его только в конце, такой подход приведёт к простоям на каждом сервере одновременно и к удлинённому времени выполнения. Решение - ограничить количество одновременно обрабатываемых хостов.
1. Запуск всего плейбука последовательно (serial)
Что делает serial
Параметр serial задаёт размер партии хостов, на которых будет выполнен текущий набор задач. После завершения партии Ansible переходит к следующей.
Пример - один хост за раз
---- name: Обновление конфигурации на всех серверах hosts: all serial: 1 # только один хост в текущей партии tasks: - name: Остановить сервис service: name: myapp state: stopped
- name: Применить изменения command: /usr/local/bin/apply_changes.sh
- name: Запустить сервис service: name: myapp state: started
Гибкость serial
| Значение | Как работает |
|---|---|
2 |
Два хоста одновременно; следующая партия стартует после их завершения. |
30% |
Плейбук выполняется на 30 % имеющихся хостов, затем на оставшейся части. |
- 1<br>- 10 |
Сначала один хост (для проверки), затем десять одновременно. |
Это удобно, когда нужно быстро отловить ошибку на первом узле, а потом масштабировать процесс.
2. Ограничение параллелизма на уровне задачи (throttle)
Если важен только отдельный таск, а остальные должны работать в обычном режиме, используйте throttle.
- name: Параллельный и последовательный запуск задач hosts: all tasks: - name: Скачивание артефакта (по одному хосту) get_url: url: http://repo/app.tar.gz dest: /tmp/app.tar.gz throttle: 1 # только один хост одновременно
- name: Распаковка на всех хостах unarchive: src: /tmp/app.tar.gz dest: /opt/app remote_src: yes
Таск 1 будет выполняться последовательно, остальные - параллельно, как обычно.
3. Управление числом fork‑ов из конфигурации и командной строки
В ansible.cfg
[defaults]forks = 2 # количество параллельных потоков
По умолчанию - 5 fork'ов; увеличение ускорит выполнение на мощных контроллерах, уменьшение - замедлит, позволяя использовать меньше ресурсов.
На уровне запуска
ansible-playbook -f 1 site.yml # ровно один forkansible-playbook --forks 10 site.yml
4. Одноразовый запуск задачи (run_once)
Иногда необходимо выполнить действие только один раз - например, добавить запись DNS или собрать статистику.
- name: Инициализация окружения hosts: webservers tasks: - name: Создать запись в DNS command: nsupdate -k /etc/keyfile -v run_once: true # выполнится только на первом хосте delegate_to: dns.example.com # можно делегировать другому узлу
- name: Обновить конфигурацию на всех серверах template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf
run_once работает в рамках текущей партии, определяемой serial.
5. Управление порядком обхода хостов
Ключевое слово order
order: shuffle # перемешать порядок при каждом запускеorder: reverse_sorted # обратный алфавитный порядок
Стратегии выполнения (strategy)
| Стратегия | Поведение |
|---|---|
| linear (по‑умолчанию) | Ждёт окончания задачи на всех хостах текущей партии. |
| free | Не ждёт, сразу ставит следующую задачу в очередь. |
| debug | Позволяет интерактивно контролировать процесс. |
| host_pinned | Не стартует задачу на хосте, пока остальные не смогут завершить без него. |
6. Практические рекомендации для больших инфраструктур
- Для временных сервисов (
/tmp,maintenance) используйтеserial: 1+run_onceна задачах остановки/запуска. - Для массового распространения конфигураций задайте
serial: 10+throttleтолько на критических шагах (база данных, миграции). - При ограниченных ресурсах контроллера уменьшайте
forksдо 2-3, иначе процесс может "загрязниться" ошибками из‑за конкуренции за CPU. - Для сценариев, где порядок важен (получение сертификатов, обновление DNS) применяйте
order: sortedиrun_onceсdelegate_to.
Кратко
- serial - управляет количеством хостов в партии.
- throttle - ограничивает параллелизм отдельного таска.
- forks - число потоков Ansible‑контроллера (cfg или‑CLI).
- run_once - выполняет задачу только один раз в партии.
- order / strategy - настраивают порядок и модель ожидания между задачами.
Эти инструменты позволяют гибко адаптировать Ansible под любые размеры инфраструктуры и требования к простой работе сервисов.
