delegate_to

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

Директива delegate_to в Ansible перенаправляет выполнение конкретной задачи на другой хост, отличный от итерируемого в play в данный момент, при этом переменные целевого хоста по-прежнему доступны в контексте задачи. Типичные паттерны использования delegate_to: снятие сервера с балансировщика нагрузки (delegate_to: lb01) перед скользящим обновлением, выполнение миграции базы данных на выделенном DB-хосте при итерации по серверам приложений, или сокращённое обозначение local_action (эквивалент delegate_to: localhost) для вызова локального API или обновления DNS-записи с управляющего узла. При сочетании delegate_to с run_once: true задача выполняется ровно один раз на делегированном хосте независимо от количества хостов в текущем пакете play — паттерн, применяемый для инициализации кластера, выбора лидера или одноразовых API-вызовов. Переменные, доступные внутри задачи с delegate_to, принадлежат итерируемому хосту, поэтому {{ inventory_hostname }} по-прежнему ссылается на целевой хост цикла, а не на хост-делегат.

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

delegate_to покрывает условия (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.

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

Ловушки delegate_to: сложный 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).

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

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

Проверить знания (1)

Загрузка вопросов…