TARGETING MINIONS
定位minions,指定哪些minions应该执行管理命令或通过匹配主机名、系统信息、定义的组,甚至以上条件的组合来执行states状态。
例如,命令salt web1 apache.signal restart
,可以重新启动机器web1上的Apache httpd服务,并且该命令将仅在该这一个minion上运行。
类似地,当使用States时,以下top file文件指定了只有web1
minion应该执行webserver.sls
的内容:
base:
'web1':
- webserver
简单的目标直接匹配、glob通配符匹配、regex正则表达式以及列表,将可以涵盖许多的使用用例,其中有些甚至可以涵盖所有用例,但除此之外还有更灵活并强大的选项。
大家也可以查看github上的这份资料:Targeting Minions
TARGETING WITH GRAINS
Grains接口内置于Salt中,以允许通过系统属性来定位目标的minions。 因此,可以调用运行特定操作系统或特定内核的minions执行功能函数。
通过将-G选项传递给salt,指定一个grain和一个glob表达式以匹配grain的值来完成对minions的调用。 定义目标的语法是grain key,后跟一个glob表达式:“os:Arch*”。
salt -G 'os:Fedora' test.version
所有那些运行Fedora系统的minions会返回真。
可以执行grains.items
salt函数查看有哪些可用的grains:
salt '*' grains.items
了解更多使用grains进行目标minions定位的知识,可以参阅这个资料。
COMPOUND TARGETING
New in version 0.9.5.
可以结合使用多个目标接口来确定最终执行命令的目标minions。 可以使用and或or组合这些目标。 下面是一个很好的例子:
salt -C 'G@os:Debian and webser* or E@db.*' test.version
在这个例子中,id是以webser开头并且正在运行Debian系统的任何minions,或者任何以db开头的minions将被匹配。
匹配器的类型默认为glob,但可以使用相应的字母后跟@
符号指定使用其它的类型。 在上面的例子中,G@
一起使用表示匹配grain,与E@
一起表示使用正则表达式。 webser*
中没有使用表示目标类型的符号,因为它是一个glob。
有关使用复合定位的更多信息,请点击此处。
NODE GROUP TARGETING
New in version 0.9.5.
对于某些场景下,使用预定义的minions分组来执行命令会更加方便。 这可以使用nodegroups分组来完成。 节点组允许在master配置文件中声明预定义的复合目标,作为一种复杂复合表达式的简写。下面是一个例子。
nodegroups:
group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com and bl*.domain.com'
group2: 'G@os:Debian and foo.domain.com'
group3: 'G@os:Debian and N@group1'
ADVANCED TARGETING METHODS
在Salt中有很多方法可以实现定位一个minion或一组minions 。
Matching the minion id
每个minion都需要一个唯一的标识符。 默认情况下,当minion第一次启动时,它会选择其FQDN作为该标识符。 可以通过minion的id配置项指定minion id。
Tip:minion id和minion keys ,由于minion id被用于生成minion的公钥/私钥,如果它发生更改,则master必须重新接受新密钥,就像minion是个新主机一样。
GLOBBING
Salt使用的默认匹配类型是围绕minion id的shell样式的globbing。 这也适用于top file文件中的states状态。
注意:必须在单引号中包含使用globbing的salt调用,以防止shell在调用Salt之前扩展globs。
匹配所有的minions:
salt '*' test.version
匹配那些在example.net
域中的,或者任何在example
域的minions:
salt '*.example.net' test.version
salt '*.example.*' test.version
匹配所有在example.net
域中且名称符合webN
规则的minions (web1.example.net, web2.example.net … webN.example.net):
salt 'web?.example.net' test.version
匹配web1
到 web5
的minions:
salt 'web[1-5]' test.version
匹配 web1
和 web3
minions:
salt 'web[1,3]' test.version
匹配 web-x
, web-y
, 和 web-z
minions:
salt 'web-[x-z]' test.version
注:有关其他定位方法,请查看前文关于复合匹配器的介绍文档。
REGULAR EXPRESSIONS
可以使用与Perl兼容的正则表达式来匹配Minions。
匹配web1-prod
和web1-devel
minions:
salt -E 'web1-(prod|devel)' test.version
在State的top文件中使用正则表达式时,必须在第一个选项指定匹配器的类型。 以下示例在上述minions中执行webserver.sls
的内容。
base:
'web1-(prod|devel)':
- match: pcre
- webserver
LISTS
在最基础的级别,还可以简单地直接指定一个minion IDs的列表:
salt -L 'web1,web2,web3' test.version
Targeting using Grains
可以通过grains数据来定位minions。
例如,下面的命令中将匹配所有运行CentOS
系统的 minions:
salt -G 'os:CentOS' test.version
匹配所有运行64-bit CPUs
的minions, 匹配上的minion将返回一个num_cpus
的grain的值:
salt -G 'cpuarch:x86_64' grains.item num_cpus
此外,globs可以用于grains匹配,嵌套在字典中的grains可以通过为遍历的每个级别添加冒号来匹配。 例如,以下内容将匹配具有名称为ec2_tags
的grain的主机,该grain的值是一个名为environment
的键的字典,键值中包含单词production
的值:
salt -G 'ec2_tags:environment:*production*'
重要:查看文章Is Targeting using Grain Data Secure? 以了解使用grains数据进行目标定位的安全相关信息。
Targeting using Pillar
可以使用pillar数据辅助定位minions。 这可以帮助在定位目标minions时实现更大的控制和灵活性。
注:开始使用Pillar定位minions,需要通过以下命令在Salt Master上为每个Minion创建一个Pillar数据缓存:
salt'*'saltutil.refresh_pillar
或salt'*'saltutil.sync_all
。 此外,Pillar数据缓存也会在运行highstate期间被填充。 Pillar数据更改后,均需要通过运行上述命令来刷新缓存,以使此定位方法正常工作。
例如:
salt -I 'somekey:specialvalue' test.version
与Grains一样,可以使用globbing匹配Pillar中的嵌套值,方法是为每个要遍历的级别添加冒号。 下面的示例将匹配具有名为foo
的pillar的minions,pillar的值是一个dict,该dict具有名为bar
的key,其值以baz
开头:
salt -I 'foo:bar:baz*' test.version
注:
-I
,等同于--pillar
参数,用于在命令行中指定pillar数据。
Subnet/IP Address Matching
我们可以很容易的使用IP地址或子网地址来匹配minions:
salt -S 192.168.40.20 test.version
salt -S 2001:db8::/64 test.version
注:
-S
,等同于--ipcidr
参数,表示使用Subnet或IP地址的匹配类型。
下面是一个在复合匹配规则中使用CIDR ip进行匹配的例子:
salt -C 'S@10.0.0.0/24 and G@os:Debian' test.version
甚至可以把Subnet/IP匹配规则用在states top file中:
'172.16.0.0/12':
- match: ipcidr
- internal
Compound matchers
复合匹配器允许使用Salt的任何匹配器进行非常精细的微小目标定位。 默认匹配器是一个glob匹配,就像CLI和top file文件匹配一样。 要使用除glob之外的任何内容进行匹配,请在匹配字符串前加上下表中的相应字母,后跟@
符号。
Letter | Match Type | Example | Alt Delimiter? |
---|---|---|---|
G | Grains glob | G@os:Ubuntu | Yes |
L | List of minions | L@minion1.example.com,minion3.domain.com or bl*.domain.com | No |
I | Pillar glob | I@pdata:foobar | Yes |
S | Subnet/IP address | S@192.168.1.0/24 or S@192.168.1.100 | No |
R | Range cluster | R@%foo.bar | No |
N | Nodegroups | N@group1 | No |
以及下面三个与使用正则有关的符号:
E
,PCRE Minion ID,例如:E@web\d+\.(dev|qa|prod)\.loc
P
,Grains PCRE,例如:P@os:(RedHat|Fedora|CentOS)
J
,Pillar PCRE,例如:J@pdata:^(foo|bar)$
可以使用布尔函数的and
,or
和not
语法连接多个匹配器。
例如,以下字符串匹配所有Debian minions,并且其主机名以webserv
开头,或者是任何具有与正则表达式web-dc1-srv.*
匹配的主机名的minions:
salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.version
把上面的匹配方法继续使用到一个 top file文件中时:
base:
'webserv* and G@os:Debian or E@web-dc1-srv.*':
- match: compound
- webserver
New in version 2015.8.0.
根据其ID排除minion也是可能的:
salt -C 'not web-dc1-srv' test.version
复合匹配功能不支持2015.8.0之前的版本中将not
放在规则开头的地方。 相反,需要按以下方法做个变通:
salt -C '* and not G@kernel:Darwin' test.version
salt -C '* and not web-dc1-srv' test.version
PRECEDENCE MATCHING
可以将匹配器与括号组合在一起,以明确声明组之间的优先级。
salt -C '( ms-1 or G@id:ms-3 ) and G@id:ms-3' test.version
注:请务必注意,括号和目标之间需要空格。 不遵守此规则可能导致不正确的定位结果!
ALTERNATE DELIMITERS
New in version 2015.8.0.
基于键值对的匹配器使用冒号(:)作为分隔符。 在上表的Alt Delimiters列中带有Yes的匹配器表示支持指定备用分隔符。
这是通过在前导匹配器字符和@模式分隔符之间指定备用分隔符来完成的。 这避免了在以下情况下对模式的错误解释:
salt -C 'J|@foo|bar|^foo:bar$ or J!@gitrepo!https://github.com:example/project.git' test.ping
Node groups
使用复合目标匹配规范声明节点分组。 参照上一章节以了解复合目标匹配的使用方法。
Master配置文件参数nodegroups用于定义节点分组。 下面是一份/etc/salt/master
中的示例节点组配置:
nodegroups:
group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com'
group2: 'G@os:Debian and foo.domain.com'
group3: 'G@os:Debian and N@group1'
group4:
- 'G@foo:bar'
- 'or'
- 'G@foo:baz'
注:group1中的
L
匹配一个minions列表,而group2中的G
匹配特定的grain。 有关更多详细信息,请参阅复合匹配器文档。从Salt的2017.7.0版本开始,组名也可以加上破折号。 这使得该用法与Salt的许多其他领域一致。 例如:
nodegroups:
- group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com'
New in version 2015.8.0.
注:节点分组可以引用其他节点组,如group3中所示。 确保不要出现循环引用,否则会导致错误消息。
New in version 2015.8.0.
复合节点分组可以是字符串值或字符串值的列表。 如果需要空格作为模式的一部分,这可能会是一个问题。 要匹配CLI上的节点组,请使用-N
命令行选项:
salt -N group1 test.version
New in version 2019.2.0.
注:历史上,
N@
分类器不能用于CLI或top file文件中的复合匹配,它只能在nodegroups
master配置文件参数中识别。 截至2019.2.0版本,此限制已不再存在。
要匹配top file文件中的节点组,请确保在节点组名称后面的行上放置- match:nodegroup
。
base:
group1:
- match: nodegroup
- webserver
注:将节点组添加到或修改master配置文件时,必须重新启动master节点才能完全识别这些更改。可以在不重新启动的情况下使用有限数量的功能,例如从命令行使用-N进行目标定位。
DEFINING NODEGROUPS AS LISTS OF MINION IDS
一个简单的minion IDs列表传统上是这样定义的:
nodegroups:
group1: L@host1,host2,host3
还可以使用下面的方式定义列表:
nodegroups:
group1:
- host1
- host2
- host3
New in version 2016.11.0.
Batch Size
-b
(或--batch-size
)选项允许一次仅在指定数量的minions上执行命令。 支持使用百分比和有限数字。
salt '*' -b 10 test.version
salt -G 'os:RedHat' --batch-size 25% apache.signal restart
这只会一次在10个目标minions上运行test.version,然后在25%的匹配os:RedHat
的minions上重启apache并一直持续到任务全部完成。 这使得像滚动重启Web服务器这样的工作,或者salt使用carp对BSD防火墙进行维护等工作都变得更容易。
批处理系统维护一个运行minions的窗口,因此,如果目标总共有150个minions并且批量大小为10,则命令被发送到10个minions,当一个minion返回时,命令被发送到另外一个minion。 因此,这项工作一直在10个minions上运行。
New in version 2016.3.
--batch-wait
参数可用于指定minion返回后等待的秒数,然后再将命令发送给新的minion。
SECO Range
SECO range是由Yahoo!开发和维护的基于集群的元数据存储。
Range project
的项目地址是: https://github.com/ytoolshed/range
更多关于range的资料: https://github.com/ytoolshed/range/wiki/
PREREQUISITES
要在Salt中使用range支持,需要一个range服务器。 设置range服务器超出了本文档的范围。 Apache模块包含在range发行版本中。
使用一个range服务器,必须定义集群文件。 这些文件是用YAML编写的,用于定义集群中包含的主机。 有关编写YAML范围文件的完整文档如下:
https://github.com/ytoolshed/range/wiki/"yamlfile"-module-file-spec
此外,必须在salt master上安装Python seco range库。 可以通过以下命令验证它们是否已正确安装:
python -c 'import seco.range'
如果未返回任何错误,则表明在salt master服务器上成功安装range。
PREPARING SALT
必须通过在master配置文件中设置range服务器的主机名和端口,在salt master上启用range支持:
range_server: my.range.server.com:80
在此之后,必须重新启动master服务器才能使更改生效。
TARGETING WITH RANGE
定义集群后,可以使用-R
或--range
标志使用salt命令对其进行定位。
例如,给定以下范围的YAML文件从range服务器提供:
$ cat /etc/range/test.yaml
CLUSTER: host1..100.test.com
APPS:
- frontend
- backend
- mysql
有人可能会使用Salt定位test.com域中host1到host100,如下所示:
salt --range %test:CLUSTER test.version
下面的命令中将匹配到三个主机: frontend
, backend
, 和 mysql
:
salt --range %test:APPS test.version
LOADABLE MATCHERS
New in version 2019.2.0.
内部定位是通过名为Matchers
的代码块实现的。 从2019.2.0版本开始,可以动态加载匹配器。 目前无法创建新匹配器,但现有匹配器可以更改或扩展其功能函数。 有关Matchers的更多信息,请参阅Loadable Matchers 。