Targeting

Targeting

通过客户端的hostname,系统信息,预定义的分组或复合条件来选择执行命令或配置状态的目标机器。

比如说命令

salt web1 apache.signal restart        #只会重启web1上的apache服务

在State系统也类似,以下的top file只让客户端web1执行webserver.sls

base:  'web1':    - webserver

Salt目前有5种方式来选择目标机器,灵活而强大。

  1. 匹配minion id

      *使用shell通配符

      *正则(Perl风格)

      *minion列表

  2. Grains

      *可用的Grains

      *在客户端配置文件中定义Grains

      *编写Grains

  3. 节点分组

  4. 复合匹配

  5. 批量执行

匹配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

匹配web1web5

salt 'web[1-5]' test.ping

匹配web1和web3

salt 'web[1,3]' test.ping

匹配web-xweb-yweb-z

salt 'web-[x-z]' test.ping
  • 正则表达式 Regular Expressions

Salt可以使用Perl风格的正则表达式来匹配minion id,使用选项-E

匹配web1-prodweb1-devel

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

Statetop 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启动时收集的关于系统的静态信息。

需要注意的是,grainsminion启动时加载的,在运行过程中不会发生变化,所以是静态数据。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等自定义的grainsgrains数据不仅可以用salt命令查询,还可以在state系统和Targeting中用来匹配目标机器。

  • 编写Grains

minion配置文件中定义的grains是静态的,不能够动态的在minion上生成。可以用Python非常方便的写动态的grainsminion启动时,会执行grains包所带的模块及自定义grains模块中的公开函数,返回的结果就是grainsgrains模块中的函数必须返回一个dict,其中keygrains的名字,value是值。

很明显,自定义的grains并不是直接放在minion上,而是放在master配置文件中定义的file_roots下的_grains目录中。执行state.highstatesaltutil.sync_grainssaltutil.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

masternodegroups用复合条件定义的一组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

复合匹配中也可以使用andornot操作符,比如说,下面的命令匹配主机名以webserv开始且运行Debian系统的minion,还匹配主机名满足正则web-dc1-srv.*minion

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

本例中,G表示用shell通配符匹配grainsE表示用正则匹配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