В типичной конфигурации 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. Практические рекомендации для больших инфраструктур

  1. Для временных сервисов (/tmp, maintenance) используйте serial: 1 + run_once на задачах остановки/запуска.
  2. Для массового распространения конфигураций задайте serial: 10 + throttle только на критических шагах (база данных, миграции).
  3. При ограниченных ресурсах контроллера уменьшайте forks до 2-3, иначе процесс может "загрязниться" ошибками из‑за конкуренции за CPU.
  4. Для сценариев, где порядок важен (получение сертификатов, обновление DNS) применяйте order: sorted и run_once с delegate_to.

Кратко

  • serial - управляет количеством хостов в партии.
  • throttle - ограничивает параллелизм отдельного таска.
  • forks - число потоков Ansible‑контроллера (cfg или‑CLI).
  • run_once - выполняет задачу только один раз в партии.
  • order / strategy - настраивают порядок и модель ожидания между задачами.

Эти инструменты позволяют гибко адаптировать Ansible под любые размеры инфраструктуры и требования к простой работе сервисов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *