Нацеливание на миньоны

Сайт: Атом.Порт: портал изучения
Курс: Атом.Порт: портал изучения
Книга: Нацеливание на миньоны
Напечатано::
Дата: суббота, 6 декабря 2025, 08:22

1. Простые цели

Нацеливание на миньоны – это указание, на каких миньонах следует запустить команду или применить состояние. Нацеливание на миньоны осуществляется путём сопоставления с заданными шаблонами:

  • сетевые имена
  • IP-адреса и подсети миньонов
  • системная информация, получаемая от миньонов
  • элементы информации из встроенного хранилища SaltStack
  • наименования групп миньонов
  • комбинации указанных выше данных

Пример:
Команда для перезапуска сервера Apache httpd

salt web1 apache.signal restart

определяет в качестве цели миньон web1. Команда перезапуска будет выполнена только на этом миньоне.

Каждый миньон имеет уникальный идентификатор. По умолчанию, когда миньон запускается первый раз, в качестве идентификатора ему присваивается его FQDN. Идентификатор миньона можно переопределить с помощью настройки параметра id в файле конфигурации миньона.

Внимание!
Параметр minion id используется для создания ключевой пары (публичного и приватного ключей), в случае изменения minion id мастер должен принять новый ключ от миньона как от нового хоста.

1.1. Подстановки (GLOBBING)

Тип сопоставления, используемый в Salt по умолчанию – подстановочные (glob-) выражения (shell-style globbing). Glob-выражения интерпретируются так же, как в командной оболочке Linux (bash).

Внимание!
В вызовах Salt подстановки необходимо заключать в одинарные кавычки, чтобы командная оболочка не выполняла разбор подстановки до вызова Salt.
Символ * можно просто экранировать (комбинация \* корректно сработает).

В таблице 1 приведены наиболее часто применяемые подстановочные выражения.

Таблица 1 – Подстановочные символы в glob-выражениях

Выражение Значение
*  Соответствует любой строке, включая пустую строку
?  Соответствует любому ОДНОМУ символу
[A-Z]
[1-20]
[A-Fa-f0-9]
 [ . - . ] - символ ’-‘ объявляет диапазон возможных значений. 
 Примеры:
 [A-Z] - любой символ в верхнем регистре от A до Z включительно.
 [A-Fa-f0-9] – под данное выражение попадают следующие значения   “ABCDEFabcdef0123456789”
[!][!W]in10  ! - совпадает с любым одиночным символом, не входящим в строку, входящую в   диапазон [! … ]
 Примеры:
 [!W]in10 – любой символ кроме W.

 

Важно!
В SaltStack символ ‘.’ не является glob-выражением. Он вычисляется не как выражение, а как просто часть имени хоста.

Примеры:

1. Проверка доступности миньонов:

salt '*' test.ping

Указанная команда выведет следующую информацию:

salt '*' test.ping

 

 

 

 

 

 

 

 

В данном примере мастером приняты публичные ключи миньонов altos , win10 и ключ миньона, работающего непосредственно на мастере – server-atomport .
Команда test.ping выполнилась на всех миньонах, публичные ключи которых приняты мастером.

2.    Выбрать все миньоны в домене example.net:

salt '*.example.net' test.ping 


3.    Выбрать все миньоны в доменах example.*

 salt '*.example.*' test.ping
 4.    Выбрать все миньоны по маске ’web?’ в домене example.net
( web1.example.net , web2.example.net … webN.example.net): 
salt 'web?.example.net' test.ping 

5.    Выбрать все миньоны с web1 по web5 :
salt 'web[1-5]' test.ping 

6.    Выбрать миньоны web1 и web3 :
salt 'web[1,3]' test.ping 

7.    Выбрать миньоны web-x , web-y и web-z :
salt 'web-[x-z]' test.ping 

 

 

 

1.2. Регулярные выражения

Миньоны могут быть выбраны с использованием регулярных выражений, совместимых с Perl (стандарт PCRE).
Выбрать миньоны web1-prod и web1-devel :

salt -E  'web1-(prod|devel)' test.ping 

 

1.3. Списки

В самом простом случае можно указать список идентификаторов целевых миньонов, разделённый запятыми:

salt -L 'altos,win10' test.ping 

Указанная команда выведет следующую информацию:

salt -L 'altos,win10' test.ping
Указанная команда выведет следующую информацию:

 

1.4. Нацеливание по подсети / IP-адресу

Миньоны могут быть выбраны по IP-адресу или подсети (с использованием нотации CIDR).
Пример:
Пусть миньоны имеют следующие IP-адреса:

Пусть миньоны имеют следующие IP-адреса:

При выполнении команд

salt -S 10.32.10.227 test.ping
salt -S 10.32.10.0/24 test.ping


будет выведена следующая информация:

При выполнении команд
salt -S 10.32.10.227 test.ping
salt -S 10.32.10.0/24 test.ping
будет выведена следующая информация:

 

Внимание!
Сопоставление по шаблону ’10.32.10.227/24’ будет работать некорректно. Нельзя комбинировать поиск по IP-адресу и поиск по подсети (CIDR).

 

Тип сопоставления по подсети/IP-адресу может использоваться в составных сопоставлениях, например:

salt -C 'S@10.0.0.0/24 and G@os:Debian'
  test.ping 


Возможно также использование сопоставления по подсети/IP-адресу в State-файлах:

'172.16.0.0/12':
   - match: ipcidr
   - internal

 

1.5. Нацеливание с помощью интерфейса Grains

Интерфейс Grains был встроен в Salt для того, чтобы обеспечить возможность нацеливания на миньоны, основываясь на их системной информации. На миньонах, работающих в определенной операционной системе или с определённым ядром операционной системы, могут запускаться совместимые функции интерфейса Grains.

Для вызова функции с помощью интерфейса Grains указывается опция -G , элемент grain и glob-выражение, которому должно соответствовать значение grain. Синтаксис строки нацеливания включает в себя ключ grain и следующее за ним glob-выражение, например: os:Arch* .

Например, в следующем вызове будут выбраны миньоны, работающие на операционной системе CentOS:

salt -G 'os:CentOS' test.ping 


В следующем вызове выводится количество процессорных ядер на каждом миньоне с 64-битным процессором:

salt -G 'cpuarch:x86_64' grains.item num_cpus 


При нацеливании с помощью Grains можно использовать подстановочные glob-выражения, а вложенные значения словаря можно сопоставлять путём добавления двоеточия для каждого уровня словаря.
Например, в следующем вызове будут выбраны хосты, имеющие элемент grain с именем ec2_tags , который, в свою очередь, является словарём с ключом ’environment’ и значением, содержащим подстроку ’production’ :

salt -G
  'ec2_tags:environment:*production*' 


Примеры:
1.    Для вывода доступных элементов grain и их значений на миньоне altos необходимо выполнить команду grains.items (вывод показан не полностью):

salt 'altos' grains.items 


salt 'altos' grains.items

Команда

salt -G 'shell:/bin/bash' test.ping 

выполнит команду test.ping на всех миньонах, у которых grain ’shell’ содержит значение ’/bin/bash’ :

salt -G 'shell:/bin/bash' test.ping

К серверу подключено три клиента, но ответило только два, т. к. только у них элемент grain ’shell’ имеет значение ’/bin/sh’ .

2.    Давайте создадим выражение которое использует 2 grains’а для определения миньона. Возьмем os и ipv4.

2 grains’а для определения миньона. Возьмем os и ipv4

3.    В данном примере команда test.ping выполняется на всех миньонах, которые:
имеют элемент grain ’os’ со значением, не равным ‘Windows’
И
имеют элемент grain ‘ipv4’, соответствующий шаблону ‘10.32.10.2*’ , т. е., ‘10.32.10.2’, ‘10.32.10.20’, ‘10.32.10.21’, ‘10.32.10.200’ и т. д.

test.ping выполняется на всех миньонах, которые:
	имеют элемент grain ’os’ со значением, не равным ‘Windows’
И
	имеют элеме

1.6. Нацеливание с помощью Pillar

При нацеливании на миньоны можно использовать данные Pillar. Это обеспечивает максимальный контроль и гибкость при нацеливании на миньоны.

Внимание!
Для использования нацеливания с помощью Pillar необходимо создать кеш данных Pillar в Salt Master для каждого миньона с помощью одной из следующих команд:
salt '*' saltutil.refresh_pillar
или
salt '*' saltutil.sync_all
Кроме того, кэш данных Pillar будет заполняться во время выполнения highstate.
Для корректной работы данного метода нацеливания после изменения данных Pillar следует обновить кеш, выполнив приведенные выше команды.

Пример:

salt -I 'somekey:specialvalue' test.version 

Как и в случае с Grains, в при нацеливании с помощью Pillar можно использовать подстановочные glob-выражения, а также сопоставлять вложенные значения словаря, добавляя двоеточие для каждого уровня словаря.
В приведенном ниже примере будут выбраны миньоны, имеющие pillar с именем atom, который представляет собой словарь, содержащий ключ port, значение которого начинается с подстроки ’project’

salt -I 'atom:port:project*' test.version 

 

1.7. Нацеливание на группу узлов

В некоторых случаях для выполнения команд и состояний может быть удобно использовать заранее определенную группу миньонов – «группу узлов» (nodegroup). Группы узлов позволяют объявлять предопределенные составные цели в главном файле конфигурации (своего рода сокращения для использования в сложных составных выражениях).

Пример:

nodegroups:
  group1: 'L@atom.domain.ru,port.domain.ru,project.domain.ru and bl*.domain.ru'
  group2: 'G@os:Debian and atom.domain.ru'
  group3: 'G@os:Debian and N@group1'

2. Составные цели

В вызове Salt одновременно могут использоваться различные методы нацеливания, при этом для объединения множеств целей, вычисленных разными методами, используются логические операторы:

  • not;
  • and;
  • or.

Пример:

salt -C 'G@os:Debian and webser* or E@db.*' test.version 


В этом примере целью является любой миньон, имеющий идентификатор, начинающийся с подстроки ’webser’ , и работающий на операционной системе Debian, или миньон идентификатор которого начинается с подстроки ’db’ .
Тип сопоставления по умолчанию – glob, но он может быть изменён непосредственно в логическом выражении с помощью префикса, включающего соответствующую букву и следующий за ней символ @ . В приведённом выше примере элемент grain указан с префиксом G@ , а регулярное выражение – с префиксом E@ . Для цели webser* спецификатор типа цели указывать не требуется, т. к. подстрока является glob-выражением.

Составные сопоставления позволяют очень точно нацеливаться на миньоны, используя любые типы сопоставления Salt. Сопоставление по умолчанию — это сопоставление с использованием подстановок glob. Для выполнения сопоставления любого типа, кроме glob, следует добавить к строке сопоставления префикс, включающий соответствующую букву из таблицы 2 и следующий за ней символ @.

Таблица 2 – Ключи типов сопоставления в синтаксисе утилиты salt

Ключ Тип сопоставления Пример Альтернативные разделители
G Grains glob  G@os:Ubuntu Да
E PCRE Minion ID  E@web\d+\.(dev|qa|prod)\.loc Нет
P Grains PCRE  P@os: (RedHat|Fedora|CentOS) Да
L Список миньонов  L@minion1.example.ru,minion3.domain.ru or  bl*.domain.ru Нет
I Pillar glob  I@pdata:atomport Да
J Pillar PCRE  J@pdata:^(atom|port)$ Да
S Подсеть/ IP-адрес  S@192.168.1.0/24 or S@192.168.1.100 Нет
R Range cluster  R@%atom.port Нет
N Группа узлов  N@group1 Нет


Сопоставления могут быть объединены с помощью логических операторов and, or, not.
Например, в приведённом ниже вызове salt будут выбраны все миньоны, работающие на операционной системе Debian, имя хоста которых начинается с подстроки ’webserv’ , а также все миньоны, имя хоста которых соответствует регулярному pcre-выражению ’web-dc1-srv.*’:

salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.version 


Возможно исключение из результата сопоставления миньона по его идентификатору:

salt -C 'not web-dc1-srv' test.version 

 

2.1. Порядок выполнения сопоставлений

Для явного указания порядка выполнения отдельных сопоставлений в рамках составного сопоставления следует сгруппировать их с помощью круглых скобок:

salt -C '( ms-1 or G@id:ms-3 ) and G@id:ms-3' test.version 

 

Внимание!
Круглые скобки и выражения необходимо отделять пробелами. Несоблюдение этого правила может привести к неправильному нацеливанию!

 

 

2.2. Альтернативные разделители

Сопоставления, которые выполняют нацеливание на основе пары «ключ-значение», в качестве разделителя используют двоеточие ( : ). Типы сопоставления со значением ’Yes’ в столбце «Альтернативные разделители» таблицы 2 поддерживают указание альтернативного символа-разделителя.
Альтернативный символ-разделитель указывается между ведущим символом, обозначающим тип сопоставления, и символом @. Это позволяет избежать неправильной интерпретации шаблона в случае, если двоеточие ( : ) является частью обхода структуры данных элемента grain или pillar.
Пример:

salt -C 'J|@atom|port|^atom:port$ or J!@gitrepo!https:
  //github.com:example/project.git' test.ping 

 

2.3. Группы узлов

Группы узлов объявляются с использованием спецификации составной цели.
Параметр главного файла конфигурации nodegroups используется для определения групп узлов. Ниже приведён пример конфигурации группы узлов в файле /etc/salt/master:

nodegroups:
  group1: 'L@atom.domain.ru,port.domain.ru,project.domain.ru or bl*.domain.ru'
  group2: 'G@os:Debian and atom.domain.ru'
  group3: 'G@os:Debian and N@group1'
  group4:
    - 'G@atom:port'
    - 'or'
    - 'G@atom:project'
Внимание!
Префикс L в группе group1 соответствует списку миньонов, а префикс G в
группе group2 соответствует элементам grain.


Имена групп также можно предварять знаком дефиса, например:

nodegroups:
  - group1: 'L@atom.domain.ru,port.domain.ru,project.domain.ru or bl*.domain.ru'

 

Внимание!
Группы узлов могут ссылаться на другие группы узлов, как показано в group3. При обнаружении циклической ссылки регистрируется сообщение об ошибке.


Для нацеливания на группу узлов в CLI используйте опцию -N:
salt -N group1 test.version

Внимание!
При добавлении или изменении групп узлов в главном файле конфигурации мастер необходимо перезапустить.
Без перезагрузки доступен ограниченный объем функций, таких как нацеливание на группу узлов с помощью опции -N из командной строки.

 

Определение групп узлов в виде списков MINION ID

Список идентификаторов миньонов обычно определяется следующим образом:

nodegroups:
  group1: L@host1,host2,host3


Список идентификаторов миньонов можно также определить как список YAML, например:

nodegroups:
  group1:
    - host1
    - host2
  - host3