Оркестрация

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

Оркестрация в Salt — это координация действий на нескольких миньонах в заданном порядке из одной точки, с мастера. Обычный state.apply смотрит на мир глазами одного миньона: он приводит конкретную машину к нужному состоянию и ничего не знает о соседях. Но реальные развёртывания редко укладываются в один хост: сначала накатить миграции на сервере БД, потом обновить приложение на десяти бэкендах и только затем вернуть их в балансировщик. Именно такие многошаговые сценарии решает оркестрация — через runner state.orchestrate, который запускается на мастере командой salt-run state.orchestrate orch.deploy.

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

Сценарий оркестрации — это обычный SLS-файл, но исполняет его не миньон, а мастер. По конвенции такие файлы кладут в каталог orch/ внутри file_roots (например, /srv/salt/orch/deploy.sls) и запускают по точечной нотации: salt-run state.orchestrate orch.deploy. Внутри файла вместо привычных state-модулей используются специальные функции: salt.state — применить состояние на группе миньонов, salt.function — выполнить execution-модуль (например, service.restart) на нужном таргете, salt.runner — вызвать другой runner, salt.wait_for_event — дождаться события на шине. Порядок шагов задаётся теми же requisites, что и в обычных состояниях: require, onchanges, onfail. Мастер публикует задания миньонам шаг за шагом, собирает возвраты и переходит дальше только после завершения предыдущего шага. Если критичный шаг помечен failhard и упал — сценарий останавливается, и полусломанный деплой не расползается по всему парку.

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

Оркестрация нужна там, где важен порядок между хостами: rolling-обновление приложения с выводом узлов из балансировщика, развёртывание кластера, где главный узел должен подняться раньше реплик, первичная раскатка окружения по цепочке «БД → бэкенд → фронтенд». Хорошее эмпирическое правило: если вы запускаете salt вручную несколько раз подряд в строго определённой последовательности — это готовый кандидат на orchestration-SLS. Для независимой настройки отдельных машин оркестрация избыточна: там достаточно highstate по расписанию. В связке с Reactor оркестрация закрывает и событийные сценарии: реактор ловит событие (например, salt/minion/*/start от новой машины) и запускает сценарий, который сам включает её в кластер — так получается автоматизация уровня всей инфраструктуры, а не отдельного сервера.

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

Самая частая ошибка — пытаться выполнить orchestration-SLS через salt '*' state.apply: файл написан для мастера, и на миньоне функций salt.state и salt.function просто нет. Вторая — не проставить requisites между шагами и удивляться, что порядок «не соблюдается»: без явных зависимостей Salt не обязан ждать. Третья — не продумать поведение при частичных отказах: если из двадцати миньонов два недоступны, шаг salt.state завершится ошибкой целиком — решите заранее, что для вас провал, а что допустимо. Наконец, не превращайте оркестрацию в императивный скрипт из сплошных salt.function с cmd.run: теряется идемпотентность, ради которой Salt и выбирают.

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

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

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

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