Что такое 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 печатает и секреты тоже.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- walkthrough /ˈwɔːkθruː/ l немая, с «θ» разбор: Пишем README и документацию на английском
- credentials /krəˈdɛnʃəlz/ «кридЕншелз» разбор: Безопасность: vulnerability, exploit, hardening, least privilege
- result /rɪˈzʌlt/ ударение на второй слог разбор: Behavioral questions и метод STAR
- command /kəˈmɑːnd/ ударение на второй слог разбор: Английский Linux и терминала
- git /ɡɪt/ «гит», твёрдое «г» разбор: Английский Git и code review
- database /ˈdeɪtəbeɪs/ «дЕйтабейс», ударение на первый слог разбор: Английский баз данных и бэкенда