Reactor

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

Reactor — это компонент мастера, который слушает шину событий и запускает заданные SLS-файлы реакций при совпадении тега. Это исполнительная половина событийной модели: beacons и job'ы поставляют события, а reactor превращает их в действия, такие как перезапуск сервиса, применение highstate к новой машине или вызов runner. Карта реакций описывается в конфиге мастера: шаблону тега (с подстановками glob) сопоставляется список reactor-SLS. Ключевой момент: reactor-SLS не описывает желаемое состояние системы, а указывает вызовы Salt в ответ на событие, рендерясь в момент его прихода с доступом к его содержимому.

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

Реакции объявляются в /etc/salt/master:

reactor:
  - 'salt/minion/*/start':
    - /srv/reactor/highstate.sls
  - 'salt/beacon/*/service/':
    - /srv/reactor/restart.sls

Reactor-SLS — это Jinja-шаблон, которому доступны переменные tag и data (полезная нагрузка события). Результат описывает вызовы четырёх видов: local.<функция> — execution-модуль на миньонах (имя local — потому что используется LocalClient), runner.<функция> — runner на мастере, wheel.<функция> — управление ключами и конфигурацией, caller.<функция> — вызов на миньоне-отправителе (для salt-call окружений):

{% if data['id'].startswith('web-') %}
highstate_new_minion:
  local.state.apply:
    - tgt: {{ data['id'] }}
{% endif %}

Выполнение асинхронное: reactor ставит вызовы в очередь и не ждёт результатов. Активную карту реакций можно посмотреть командой salt-run reactor.list, а связку отлаживать, держа открытым salt-run state.event pretty=True и глядя в лог мастера.

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

Reactor уместен там, где реакция проста и однозначна: перезапуск упавшего сервиса по beacon-событию, применение highstate к миньону по salt/minion/<id>/start (типовая связка для автоскейлинга), отправка уведомления, запись факта во внешнюю систему. Рабочее правило — «thin reactor»: сам reactor-SLS должен быть минимальным диспетчером, а всё многошаговое (проверить, дождаться, сделать, откатить) выносится в оркестрацию — reactor вызывает runner.state.orchestrate, и логика живёт в обычном, тестируемом orchestrate-SLS. Это же правило спасает отладку: оркестрацию можно запустить руками и увидеть вывод, реакцию — нельзя.

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

Первая — сложная логика прямо в reactor-SLS: выполняется асинхронно, вывода нет, ошибки — только в логе мастера; отладка превращается в археологию. Вторая — слепое доверие данным события: содержимое data формирует отправитель, поэтому реакции с высокими правами на его основе опасны; хрестоматийный пример — автопринятие ключей реакцией на salt/auth через wheel.key.accept: без дополнительной проверки это дыра, позволяющая любому желающему зарегистрировать миньона. Третья — циклы: реакция запускает job, job порождает события, события снова матчатся реакцией — мастер начинает молотить сам себя; проверяйте, что теги реакций не пересекаются с тегами порождаемых ими событий. И помните: изменения секции reactor в конфиге требуют перезапуска мастера.

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

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

🔤 Английские термины в этой теме

Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.

Весь словарь терминов →