Grains в таргетинге
Тема дорожной карты · SaltStack
Таргетинг по grains — это отбор миньонов по свойствам системы, а не по именам: «все Ubuntu», «всё семейство RedHat», «все машины с ролью web». Флаг -G переключает первый аргумент salt с глоба на выражение grain:значение: salt -G 'os:Ubuntu' pkg.install nginx установит пакет ровно на Ubuntu-машины, сколько бы их ни было и как бы они ни назывались. Это основной механизм работы с гетерогенным парком: схема имён хостов может быть любой (или отсутствовать), а свойства системы Salt знает всегда. В сочетании с кастомными grains (role, datacenter) таргетинг по grains превращается в полноценную систему групп машин.
Как это работает
Выражение -G имеет вид путь:значение, где путь может быть вложенным через двоеточие: salt -G 'ec2_tags:environment:prod' test.ping. Значение поддерживает глобы: salt -G 'osrelease:24*' test.ping. Для регулярных выражений по значению grain есть отдельный флаг -P. Механика та же, что и у всего таргетинга Salt: мастер публикует задание с выражением, а каждый миньон сверяет его со своим локальным словарём grains и решает, выполнять ли задание. Комбинации записываются compound-синтаксисом через -C, где grain-условие обозначается префиксом G@: salt -C 'G@os:Ubuntu and web* and not G@virtual:physical' state.apply — «Ubuntu, имя на web, но не железные машины». Тот же матчер работает в top.sls: блок с - match: grain и выражением os_family:Debian назначит state всем Debian-подобным миньонам. Проверить, кто попадёт под выражение, безопасно через salt -G '...' test.ping.
Когда применять
Таргетинг по grains — выбор по умолчанию для всего, что зависит от платформы: раскатка пакета только на нужное семейство (salt -G 'os_family:RedHat' pkg.install httpd), проверка версий ядра, миграция машин конкретного релиза ОС. Второй большой сценарий — группировка через кастомные grains: назначили role: web — и дальше вся эксплуатация группы идёт через salt -G 'role:web' ..., без ведения списков хостов. Если группа определяется сложным правилом, комбинируйте с глобами и pillar в compound-выражении. Когда одно и то же выражение повторяется постоянно, оформите его nodegroup'ом в конфиге мастера. Для security-чувствительного отбора (раздача секретов через pillar) grains не подходят — там таргетируйте по id или по pillar-данным, которые назначает мастер.
Типичные ошибки
Первая и главная — таргетировать pillar с секретами по grain: миньон сам управляет своими grains, и взломанная машина, выставив role: db, получит секреты чужой группы. Вторая — путать os и os_family: salt -G 'os:Debian' не выберет Ubuntu, хотя Ubuntu входит в семейство Debian; для «всех деб-подобных» нужно os_family:Debian. Третья — устаревший кэш grains: после смены атрибута машина продолжает не попадать в выборку, пока не выполнен saltutil.refresh_grains. Четвёртая — экранирование в compound: выражение с @, пробелами и глобами обязано быть в одинарных кавычках, иначе его разберёт ваш shell, а не Salt.
Связанные понятия
Полезные ресурсы
Проверить знания (2)
Загрузка вопросов…