Что такое grains
Тема дорожной карты · SaltStack
Grains — это набор пар «ключ–значение» с фактами о конкретном миньоне, который Salt собирает автоматически: от os и osrelease до количества ядер и списка IP-адресов. Принципиально важны три свойства. Во-первых, grains собираются на стороне миньона — машина сама рассказывает о себе. Во-вторых, они статичны: значения вычисляются при старте процесса миньона и кэшируются, а не опрашиваются на каждый запрос. В-третьих, они доступны везде — в таргетинге, в Jinja-шаблонах, в top file, в кастомных модулях. Это делает grains универсальным «паспортом машины», на который опирается вся остальная система.
Как это работает
При запуске процесс миньона выполняет серию Python-функций сбора фактов: парсит /etc/os-release, опрашивает интерфейсы, читает данные о CPU и памяти, определяет виртуализацию. Результат — словарь, который миньон держит в памяти и отдаёт по запросу. Три команды покрывают весь повседневный доступ: 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: формула обрастает перечислением дистрибутивов вместо двух веток по семействам.
Связанные понятия
Полезные ресурсы
Проверить знания (2)
Загрузка вопросов…