Стратегии (linear, free)

Тема дорожной карты · Ansible

Стратегии выполнения в Ansible управляют тем, как задачи распределяются по хостам в ходе play. Стратегия linear по умолчанию обрабатывает каждую задачу на всех хостах пакета перед переходом к следующей задаче, что удерживает все хосты в одном темпе, но означает, что медленный хост блокирует прогресс для всех. Стратегия free — включается через strategy: free в play — позволяет каждому хосту продвигаться по списку задач самостоятельно так быстро, как может, максимизируя пропускную способность для длительных play ценой недетерминированного порядка. Третий вариант — mitogen — это сторонний плагин стратегии из проекта Mitogen, который резко снижает накладные расходы на соединение, заменяя SSH+Python-bootstrap единым постоянным Python-интерпретатором, что нередко сокращает время выполнения playbook на 50% и более; устанавливается отдельно и включается указанием strategy_plugins на его путь и установкой strategy: mitogen_linear. Для большинства случаев linear является правильным значением по умолчанию, а free применяется для play, где задачи на разных хостах не имеют зависимости по порядку.

Как это работает

Стратегии (linear, free) покрывает условия (when:), циклы (loop:/with_items:), error handling (block/rescue/always, failed_when, changed_when), делегирование (delegate_to: localhost для запуска задачи на контроллере), async-задачи (async: 60 poll: 5 для долгих операций), кеширование facts (fact_caching = redis), разработку filter/lookup/callback-плагинов. Ansible — настоящий DSL с серьёзной программируемостью.

Когда применять

block/rescue/always вместо ignore_errors для нормального error handling. async — для задач дольше SSH-таймаута (миграции БД, сборка образов). delegate_to — для "сделать на load balancer" посреди play. Кеширование facts в Redis — при большом inventory + медленных gather_facts.

Типичные ошибки

Ловушки Стратегии (linear, free): сложный Jinja2 + Ansible-специфика (when: var is defined and var | length > 0 — порядок важен, is defined первым для short-circuit); чрезмерный delegate_to ("магия на расстоянии"); loop с очень большими списками = медленный запуск + рост памяти (используйте batch: или chunked-плейбуки); сбор facts на каждом play в долгом запуске (поставьте gather_facts: false после первого play).

Связанные понятия

Полезные ресурсы