Targeting
Targeting
通过客户端的
hostname
,系统信息,预定义的分组或复合条件来选择执行命令或配置状态的目标机器。
比如说命令
salt web1 apache.signal restart #只会重启web1上的apache服务
在State系统也类似,以下的top file
只让客户端web1
执行webserver.sls
base: 'web1': - webserver
Salt目前有5种方式来选择目标机器,灵活而强大。
匹配minion id
*使用
shell
通配符*正则(
Perl
风格)*minion
列表Grains
*可用的
Grains
*在客户端配置文件中定义
Grains
*编写
Grains
节点分组
复合匹配
批量执行
匹配minion id
minion id
客户端(minion
)的唯一标志符。默认值是主机的FQDN
,也可以在配置文件中修改。
每一个客户端都需要唯一标志符。minion
第一次启动时选择FQDN
作为标志符。默认值可以在minion
配置文件中用id
来覆盖.
tips:minion id和minion keysminion id 是 minion 公/私钥对的名字,如果修改了 minion id ,master 需要重新接受新的key,否则 minion 不能通过 master 的认证。操作和添加新的 minion 一样。
shell通配符Globbing
Salt
默认使用shell
风格通配符('*','?','[]')来匹配minion id
。在State
系统中的top file
也一样。
Note:使用 salt 命令时必须将'*'放在单引号中,或是用'\'转义,不然 shell 会在 salt 之前扩展'*'。
匹配所有客户端:
salt '*' test.ping
匹配所有example.net
域或者example
域的客户端:
salt '*.example.net' test.pingsalt '*.example.*' test.ping
匹配example.net
域中的webN
客户端(web1.example.net, web2.example.net … webN.example.net
):
salt 'web?.example.net' test.ping
匹配web1
到web5
:
salt 'web[1-5]' test.ping
匹配web1和web3
salt 'web[1,3]' test.ping
匹配web-x
,web-y
,web-z
:
salt 'web-[x-z]' test.ping
正则表达式 Regular Expressions
Salt
可以使用Perl
风格的正则表达式来匹配minion id
,使用选项-E
匹配web1-prod
和web1-devel
:
salt -E 'web1-(prod|devel)' test.ping
在State
的top file
,需要将匹配方式作为第一个选项。以下例子在和上面相同的客户端上执行webserver
中的内容
base: 'web1-(prod|devel)': - match: pcre - webserver
minion列表 Lists
最基本的,可以列出每一个minion id
来指定多个目标机器,使用选项'-L'。
[root@localhost ~]# salt -L 'salt_minion_001,salt_minion_002' test.pingsalt_minion_001: Truesalt_minion_002: True
使用 Grains
Grains
minion启动时收集的关于系统的静态信息。
需要注意的是,grains
是minion
启动时加载的,在运行过程中不会发生变化,所以是静态数据。grains
中包含诸如运行的内核版本,操作系统等信息。
grains示例
匹配所有系统是CentOS
的客户端:
salt -G 'os:CentOS' test.ping
匹配所有64位CPU
的机器,并返回CPU
核心数:
salt -G 'cpuarch:x86_64' grains.item num_cpus
grains.item
列出所有grains
的名字及内容。
salt '*' grains.items
有哪些可用的grains?
grains
在客户端上运行,收集客户端的信息,所有不同的客户端可以有不同的grains
。使用grains.ls
模块列出目标机器上所有可用的grains
的名字。
salt '*' grains.ls
grains.item
列出所有grains
的名字及内容。
salt '*' grains.items
在客户端配置文件中定义grains
内置的grains
不一定满足需求,可以在minion
的配置文件中静态定义grains
。
grains: roles: - webserver - memcache deployment: datacenter4 cabinet: 13 cab_u: 14-15
重启minion
服务后,grains.ls
就可以列出roles
等自定义的grains
。grains
数据不仅可以用salt
命令查询,还可以在state
系统和Targeting
中用来匹配目标机器。
编写Grains
在minion
配置文件中定义的grains
是静态的,不能够动态的在minion
上生成。可以用Python
非常方便的写动态的grains
。minion
启动时,会执行grains
包所带的模块及自定义grains
模块中的公开函数,返回的结果就是grains
。grains
模块中的函数必须返回一个dict
,其中key
是grains
的名字,value
是值。
很明显,自定义的grains
并不是直接放在minion
上,而是放在master
配置文件中定义的file_roots
下的_grains
目录中。执行state.highstate
,saltutil.sync_grains
,saltutil.sync_all
时,会将_grains
中的文件分发到客户端上。
假定file_roots
为/srv/salt
,增加自定义grain
的操作如下:
# mkdir /srv/salt/_grains# vim /srv/salt/_grains/custom_grain.py def custom_grains(): ''' only a test grain. you could use any Python code to generate the grains list dynamicly. ''' grains = {'role' : 'LB'} return grains# salt '*' saltutil.sync_grains# salt '*' grains.item role
由于是作为模块导入,custom_grain.py
中不需要#!/usr/bin/env python
行,也不需要有执行权限。
节点组 Node Groups
Node group
在
master
中nodegroups
用复合条件定义的一组minion
。 复合匹配在下面的内容有详细介绍。
nodegroups
配置示例:
nodegroups: group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com' group2: 'G@os:Debian and foo.domain.com
使用-N
选项:
salt -N group1 test.ping
在top file
中用 - match: nodegroup
来指定使用节点组匹配。
base: group1: - match: nodegroup - webserver
复合匹配 Compound matchers
Compound matcher
用布尔操作符连接的多个目标条件。
复合匹配可以用前面讨论的几种方式实现更精确的匹配。复合匹配默认使用
Globbing
,要使用其他匹配方式的话,需要加上类型前缀字母,现在实现的字母
详细列表,请参考。
Letter Match Type 例如:
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 List of minions L@minion(奴才)1.example.com,minion3.domain.com or bl*.domain.com I Pillar glob I@pdata:foobar S Subnet/IP address S@192.168.1.0/24 or S@192.168.1.100 R Range cluster R@%foo.bar 复合匹配中也可以使用
and
,or
,not
操作符,比如说,下面的命令匹配主机名以webserv
开始且运行Debian
系统的minion
,还匹配主机名满足正则web-dc1-srv.*
的minion
。
salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.ping
本例中,G
表示用shell通配符
匹配grains
;E
表示用正则匹配minion id
。 这个例子在top file
中如下
base: 'webserv* and G@os:Debian or E@web-dc1-srv.*': - match: compound - webserver
注意not
不能用于第一个条件,需要用如下命令:
salt -C '* and not G@kernel:Darwin' test.ping
批量执行 Batch Size
在指定数量或百分比的机器上执行命令。
在指定数量或百分比的机器上执行命令。
salt '*' -b 10 test.pingsalt -G 'os:RedHat' --batch-size 25% apache.signal restart
第一条命令在所有的客户端上执行test.ping
,但同一时间只有10台机器运行此命令,当有minion
返回执行结果是,再让下一个minion
执行。 第二条命令在系统是RedHat
的客户端中重启apache
服务,但同一时间只有25%的机器执行重启,直到所有目标机器执行完成。
Batch Size
并不减少总的数量,只是限制同时执行任务的机器数量。这非常有用,比如,在负载均衡web
集群中,可以只用一条命令分批的重启web
服务。
本文转自:
子网/IP地址匹配
salt -S 192.168.40.20 test.pingsalt -S 10.0.0.0/24 test.ping