Что такое pillar

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

Pillar — защищённое хранилище «ключ–значение», где мастер хранит данные для миньонов: конфигурационные параметры, различия между окружениями, учётные данные. В отличие от файлов состояний, доступ к pillar ограничен: миньон получает только те данные, которые ему предназначены, и не может запросить чужие ключи. Это позволяет писать универсальные состояния и раздавать секреты только тем хостам, которым они нужны.

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

Каталоги дерева pillar задаются опцией pillar_roots в конфигурации мастера, по умолчанию это /srv/pillar. Внутри — обычные SLS-файлы: YAML, при необходимости с Jinja. Когда миньон запрашивает pillar (при старте, по команде или перед прогоном состояний), мастер берёт top.sls, определяет список SLS-файлов для этого миньона, рендерит их и сливает результат в единый словарь. Рендеринг выполняется процессом мастера, поэтому в Jinja доступны grains конкретного миньона — можно, например, подставлять разные значения по grains['os_family']. Готовый словарь уезжает миньону по шифрованному ZeroMQ-каналу и хранится у него в памяти. Дальше данные читают отовсюду: из командной строки — salt '*' pillar.items и salt '*' pillar.get users:deploy, из SLS-файла — {{ salt['pillar.get']('nginx:port', 80) }}, где двоеточие обозначает путь по вложенным ключам, а второй аргумент — значение по умолчанию.

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

Pillar нужен, когда одна и та же формула должна вести себя по-разному на разных машинах. Типовые случаи: пароли БД и API-токены (выдаются только целевым хостам), список SSH-пользователей по ролям серверов, размеры пулов и лимиты, различающиеся между stage и prod, адреса «соседей» кластера. Альтернативы проигрывают по конкретным причинам: хардкод в SLS требует править код при каждом изменении данных; grains не подходят для чувствительного и управляющего — их значения контролирует сам миньон; файлы в file_roots видны всем машинам без разбора. Если данных немного и они не секретны, начать можно с одного common.sls, подключённого всем через '*', и постепенно выделять специфичные файлы по ролям.

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

Частый сюрприз — «pillar не обновился»: миньон держит копию в памяти, и после правки файлов на мастере нужен saltutil.refresh_pillar (или очередной state.apply). Вторая ошибка — прямое обращение pillar['a']['b'] в Jinja: отсутствие ключа валит рендер SLS с малопонятной ошибкой, а pillar.get с default этого лишён. Третья — вера в то, что сам факт нахождения данных в pillar делает их защищёнными: на диске мастера и в git они лежат открытым текстом, для секретов нужен GPG-renderer или внешний источник. И не выводите pillar в логи CI — pillar.items печатает и секреты тоже.

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

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

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

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

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