SaltStack Targeting Minions - 目标Minions定位方法指南

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.netwebN.example.net):

salt 'web?.example.net' test.version

匹配web1web5 的minions:

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

匹配 web1web3 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-prodweb1-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_pillarsalt'*'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之外的任何内容进行匹配,请在匹配字符串前加上下表中的相应字母,后跟@符号。

LetterMatch TypeExampleAlt Delimiter?
GGrains globG@os:UbuntuYes
LList of minionsL@minion1.example.com,minion3.domain.com or bl*.domain.comNo
IPillar globI@pdata:foobarYes
SSubnet/IP addressS@192.168.1.0/24 or S@192.168.1.100No
RRange clusterR@%foo.barNo
NNodegroupsN@group1No

以及下面三个与使用正则有关的符号:

  • 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)$

可以使用布尔函数的andornot语法连接多个匹配器。

例如,以下字符串匹配所有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值