Что такое параметр forks в Ansible?

«Что такое параметр forks в Ansible?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Forks — это параметр в Ansible, который определяет максимальное количество параллельных подключений (и, соответственно, одновременного выполнения задач) к управляемым хостам. По умолчанию это значение равно 5. Увеличение этого параметра — основной способ ускорить выполнение плейбука на большом парке серверов.

Как это работает: Если у вас 100 хостов и forks=10, Ansible будет выполнять задачи сначала на 10 хостах одновременно. Как только задача на одном из них завершится, Ansible подключится к следующему хосту из списка, поддерживая уровень параллелизма в 10 подключений, пока все хосты не будут обработаны.

Где и как задается:

  1. В конфигурационном файле ansible.cfg (постоянная настройка):
    [defaults]
    forks = 20
  2. В командной строке при запуске плейбука (разовая настройка):
    ansible-playbook site.yml --forks=25
  3. Через переменную окружения:
    export ANSIBLE_FORKS=15

Практические соображения и ограничения:

  • Лимит ресурсов управляющей ноды: Каждое соединение (fork) потребляет CPU и память. Слишком высокое значение может привести к исчерпанию ресурсов или файловых дескрипторов на управляющей машине.
  • Сетевая нагрузка и лимиты целевых систем: Параллельное обновление 50 серверов может создать пиковую нагрузку на репозиторий пакетов или сеть. Для таких задач часто используют стратегию serial в плейбуках.
  • Оптимальное значение: Зависит от конкретной инфраструктуры и задач. Для рутинных конфигураций на десятках серверов значение 10-20 обычно безопасно. Для масштабных операций в сотни хостов требуется тестирование и, возможно, увеличение системных лимитов.

Пример из практики: При развертывании конфигурации на 200 веб-серверах я устанавливаю forks=20 в ansible.cfg. Для задач обновления ядер (yum update kernel) использую serial: 10% в плейбуке, чтобы обновлять группы по 20 серверов с перезагрузкой, избегая одновременного вывода из строя всего кластера.