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

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

Ответ

Параметр serial в Ansible задает стратегию выполнения плейбука на группе хостов, ограничивая количество хостов, на которых задачи выполняются параллельно в один момент времени. По умолчанию Ansible выполняет плейбук одновременно на всех хостах из указанной группы (hosts: all). serial критически важен для операций, требующих осторожного, пошагового развертывания, чтобы избежать полного простоя сервиса или перегрузки инфраструктуры.

Основные сценарии использования:

  • Rolling update (постепенное обновление): Обновление приложений на кластере веб-серверов по частям.
  • Контроль нагрузки: Ограничение одновременных подключений к базе данных или внешнему API во время выполнения задач.
  • Минимизация риска: Если задача может потенциально завершиться сбоем, serial ограничивает "зону поражения".

Примеры синтаксиса:

  1. Фиксированное количество хостов:

    - name: Apply security patches to web servers
      hosts: webservers
      serial: 2  # Одновременно обрабатывается только 2 хоста из группы
      tasks:
        - name: Update all packages
          apt:
            update_cache: yes
            upgrade: dist
  2. Процент от группы:

    - name: Restart service with percentage
      hosts: app_servers
      serial: "30%"  # На каждом "шаге" обрабатывается 30% хостов группы
  3. Сложный rolling update (поэтапное увеличение батча):

    - name: Complex rolling deployment
      hosts: production
      serial:
        - 1    # Сначала на одном хосте (например, для smoke-теста)
        - 30%  # Затем на 30% оставшихся
        - 100% # И наконец на всех остальных

Важное замечание по обработке ошибок: Если выполнение задачи завершится с ошибкой на одном из хостов в текущей "партии" (serial batch), выполнение на всех хостах этой партии будет прервано, а на оставшиеся хосты в группе задача не пойдет. Это поведение можно изменить с помощью директив max_fail_percentage или any_errors_fatal.