Что такое grains

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

Grains — это набор пар «ключ–значение», содержащих информацию о конкретном миньоне, собранную Salt автоматически. Информация включает данные от os и osrelease до количества ядер и списка IP-адресов. Три ключевых свойства grains: они собираются на стороне миньона, статичны и доступны везде в системе Salt. Это делает grains универсальным «паспортом машины», на который опирается вся остальная система.

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

При запуске процесс миньона выполняет серию Python-функций для сбора фактов: парсит /etc/os-release, опрашивает интерфейсы, читает данные о CPU и памяти, определяет виртуализацию. Результат — словарь, который миньон хранит в памяти и отдаёт по запросу. Для доступа к grains используются три команды: salt '*' grains.ls для получения имен всех grains, salt '*' grains.items для получения полного словаря со значениями и salt '*' grains.item os osrelease cpuarch для выборки конкретных ключей. Точечное значение можно получить через grains.get, поддерживающий вложенность через двоеточие: salt '*' grains.get ip_interfaces:eth0. На самой машине то же самое доступно без мастера: salt-call --local grains.items. Пара os / os_family — самая используемая: os — конкретный дистрибутив (Ubuntu, CentOS), os_family — семейство (Debian, RedHat). После изменений на машине кэш обновляется командой salt '*' saltutil.refresh_grains или перезапуском миньона.

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

Grains отвечают на вопросы вида «что это за машина». Их можно применять для выбора поведения по платформе: в Jinja {% if grains['os_family'] == 'Debian' %} подставляет правильное имя пакета. Для отбора машин: salt -G 'os:Ubuntu' pkg.install nginx вместо ведения списков хостов руками. Инвентаризация и аудит: выгрузка grains.items --out=json по парку — фактическая база данных оборудования без отдельного CMDB. Сравнение с pillar задаёт границу: grains генерируются миньоном и описывают его физическую и системную реальность; pillar назначается мастером и описывает намерения администратора (роли с точки зрения доверия, секреты, параметры окружений). Если значение придумали вы, а не «обнаружила» машина, задумайтесь, не место ли ему в pillar.

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

Первая ошибка — воспринимать grains как мониторинг: mem_total не изменится после апгрейда памяти, пока вы не обновите кэш; grains — снимок на момент старта. Вторая — доверие: миньон может объявить любые значения своих grains, поэтому строить на них раздачу секретов нельзя. Третья — обращение к несуществующему ключу в Jinja: grains['datacenter'] на машине без этого grain уронит рендеринг SLS; безопаснее grains.get('datacenter', 'default'). Четвёртая — ветвление по os там, где достаточно os_family: формула обрастает перечислением дистрибутивов вместо двух веток по семействам.

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

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

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

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

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