Pillar

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

Pillar — подсистема Salt для передачи данных с мастера на миньоны: параметров конфигурации, переменных окружений, паролей и ключей. Главное отличие от файлового сервера и grains — модель доступа: pillar рендерится на мастере и раздаётся адресно, каждый миньон получает только тот срез данных, который назначен ему в pillar top file, и физически не может увидеть чужие значения. Именно поэтому pillar считается штатным местом для секретов и любых данных, которые нельзя показывать всем машинам инфраструктуры. Второй важный тезис: pillar — это данные, а states — логика. Хорошо написанный SLS-файл не содержит паролей и номеров портов в теле, он читает их из pillar через pillar.get, и одна и та же формула обслуживает dev, stage и prod без правки кода.

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

Дерево pillar живёт на мастере в каталогах из опции pillar_roots (по умолчанию /srv/pillar) и устроено как обычные SLS-файлы: YAML плюс Jinja. Файл top.sls в корне сопоставляет миньоны и pillar-файлы. Когда миньон запрашивает данные, мастер рендерит назначенные ему SLS, собирает результат в один словарь и отправляет по шифрованному каналу — рендеринг происходит на мастере, поэтому Jinja в pillar может обращаться к grains миньона, но не к его файловой системе. Миньон держит полученный словарь в памяти; посмотреть его целиком можно командой salt '*' pillar.items, отдельный ключ — salt '*' pillar.get nginx:worker_processes. Правки в файлах на мастере не прилетают на миньоны сами: нужно либо выполнить salt '*' saltutil.refresh_pillar, либо дождаться ближайшего state.apply, который компилирует свежий pillar перед запуском состояний.

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

Выносите в pillar всё, что меняется от машины к машине или от окружения к окружению: версии пакетов, адреса бэкендов, списки пользователей, TLS-сертификаты, учётные данные. Практический критерий: если значение хочется захардкодить в SLS с комментарием «на проде поменять» — ему место в pillar. Для секретов это единственный корректный механизм в Salt: файлы из file_roots доступны каждому принятому миньону через salt://, а pillar-данные — только адресату. Когда источником данных должен быть не файл на мастере, а внешняя система (Vault, база, git-репозиторий), та же модель доступа сохраняется через external pillar. Не стоит тащить в pillar большие бинарные блобы и данные, которые описывают саму машину, — для второго уже есть grains.

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

Самая частая — забыть про saltutil.refresh_pillar и полчаса отлаживать «не применяющееся» значение, которое просто не доехало до миньона. Вторая — держать секреты в pillar открытым текстом в git-репозитории: pillar защищает данные при передаче на миньоны, но не в истории коммитов, поэтому секретные значения шифруют GPG-renderer'ом или выносят во внешний pillar. Третья — обращаться к ключам напрямую ({{ pillar['a']['b'] }}): при отсутствии ключа рендер падает, тогда как salt['pillar.get']('a:b', default) переживает недостающие данные. Наконец, ошибка YAML в одном pillar-файле ломает компиляцию всего pillar для затронутых миньонов — проверяйте изменения на стенде.

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

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

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

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