Salt Mine

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

Salt Mine — механизм обмена данными между миньонами через мастера. Миньоны не видят друг друга, поэтому шаблон конфигурации балансировщика не может перечислить IP-адреса всех бэкендов. Grains и pillar доступны только самому миньону, но Mine закрывает этот разрыв: каждый миньон периодически выполняет заранее объявленные функции, такие как network.ip_addrs, и отправляет результат в кэш на мастере. Другие миньоны могут извлекать эти данные с помощью функции mine.get, обычно прямо в Jinja-шаблоне SLS-файла или конфига.

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

Настройка состоит из двух частей: объявления того, что миньон публикует, и чтения данных. В конфигурации миньона или в pillar задаётся mine_functions — словарь функций с аргументами, например network.ip_addrs: [interface: eth0]. Интервал обновления задаёт опция mine_interval (по умолчанию 60 минут). Обновить данные принудительно можно командой salt '*' mine.update. Чтение данных происходит с помощью salt['mine.get']('roles:backend', 'network.ip_addrs', tgt_type='grain') в Jinja, что вернёт словарь «идентификатор миньона → результат». Таргет в mine.get поддерживает те же типы, что и обычный таргетинг: glob, grains, compound. Данные приходят из кэша мастера, а не запрашиваются с живых миньонов в момент вызова, поэтому mine.get быстрый и работает даже когда часть источников выключена, но данные настолько свежи, насколько давно было последнее обновление.

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

Канонический случай — автосборка конфигурации балансировщика: миньоны с grain roles: backend публикуют свои адреса, а состояние на балансировщике рендерит upstream-блок через mine.get и пересобирает конфиг при появлении нового бэкенда. Тот же паттерн работает для кластеров (список пиров для распределённых систем), для генерации /etc/hosts или списков мониторинга. Правило выбора такое: grains — факты миньона о себе, pillar — данные мастера для миньона, mine — данные миньонов друг о друге. Если значение статично и известно заранее — кладите его в pillar, mine оправдан, когда данные динамические и их источник — сами машины. Для реакции на события в реальном времени mine не подходит — это ниша beacons и Reactor.

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

Главный источник недоумения — устаревший кэш: новый бэкенд уже поднялся, а балансировщик его «не видит», потому что mine обновится только через mine_interval. В автоматизации ввода узлов добавляйте явный mine.update. Вторая ошибка — забыть, что mine.get таргетирует по данным кэша: миньон, ни разу не отправивший mine-данные, в выборку не попадёт, и ошибки не будет — просто молчаливо неполный список. Третья — публиковать в mine чувствительные данные: их сможет прочитать любой миньон, которому доступен mine.get; секретам место в pillar с его адресной доставкой. Наконец, не превращайте mine в свалку: каждая функция выполняется на каждом миньоне регулярно, и тяжёлые вызовы умножаются на размер парка.

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

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

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

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

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