Кастомные grains

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

Автоматические grains содержат информацию о машине: ОС, ядро, железо. Кастомные grains добавляют пользовательские атрибуты, такие как роль сервера (role: web), датацентр, стойка, команда-владелец, номер окружения. Эти данные можно использовать для таргетинга (salt -G 'role:web' state.apply nginx), создания условий в Jinja и распределения states через top file. Кастомные grains делятся на статичные и динамические. Статичные — это значения, заданные вручную, а динамические — вычисляемые с помощью Python-кода при каждом обновлении grains.

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

Статичные grains задаются двумя способами. Первый — файл /etc/salt/grains на миньоне, обычный YAML: role: web, datacenter: msk-1; можно использовать и списки. Второй — секция grains: в конфиге миньона /etc/salt/minion — результат тот же, но данные смешиваются с настройками процесса, поэтому отдельный файл считается более чистым вариантом. Удалённо можно задать значения командой salt 'web-01' grains.setval role web, что запишет grain в /etc/salt/grains без захода на машину. Динамические grains — это Python-модули в каталоге _grains/ внутри file_roots на мастере (то есть salt://_grains/): каждая функция модуля возвращает словарь, который добавляется к набору grains. Раскатка динамических grains выполняется командой salt '*' saltutil.sync_grains (или saltutil.sync_all), после которой миньоны скачивают код и пересчитывают grains. Так создаются grains вида «есть ли GPU», «какой SSD-контроллер», «внутренний инвентарный номер из DMI» — всё, что можно вычислить кодом на самой машине.

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

Статичный grain используется, когда атрибут назначается человеком и редко меняется: роль, окружение, датацентр. Он живёт на машине и переживает переустановку мастера. Динамический grain применяется, когда значение выводится из самой системы: наличие устройства, версия внутреннего агента, признак «машина в облаке X». Практический критерий выбора между grain и pillar: если атрибут описывает машину и по нему нужно таргетировать — grain; если это конфигурационные данные или секреты, которые машина не должна определять сама, — pillar. Роли часто держат именно в grains ради удобного таргетинга, но помните ограничение доверия: миньон может выставить себе любую роль, поэтому раздача секретов должна опираться на pillar с таргетингом по id, а не на самопровозглашённый grain.

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

Главная ошибка — использование кастомных grains для секретов или security-критичных признаков: значение контролирует миньон, и компрометация машины позволяет «примерить» чужую роль. Вторая ошибка — забыть saltutil.sync_grains после правки модуля в _grains/ и недоумевать, почему значения старые; после синхронизации иногда нужен ещё saltutil.refresh_grains. Третья ошибка — дорогой код в динамическом grain: функции выполняются при каждом пересчёте grains, и обращение к внешнему API на 10 секунд затормозит старт миньона. Четвёртая ошибка — дублирование одного атрибута в /etc/salt/grains и в конфиге миньона, а потом искать, откуда берётся «не то» значение.

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

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

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

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

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