在使用 SaltStack 对主机进行批量管理的时候,因为不同的服务器组所做的业务功能不同,因此为了更加方便的管理,势必要对主机进行分组管理。

因此就自己在分组使用的过程中有以下一点记录下。

参考 SaltStack 的官方文档 4.4 Compound matchers 和 4.3. Node groups 知道,对目标服务器分组有以下七种方式,这七种方式的标示符分别为:

  1. G -- 针对 Grains 做单个匹配,例如:G@os:Ubuntu

  2. E -- 针对 minion 针对正则表达式做匹配,例如:E@web\d+.(dev|qa|prod).loc

  3. P -- 针对 Grains 做正则表达式匹配,例如:P@os:(RedHat|Fedora|CentOS)

  4. L -- 针对 minion 做列表匹配,例如:[email protected],minion3.domain.com or bl*.domain.com

  5. I -- 针对 Pillar 做单个匹配,例如:I@pdata:foobar

  6. S -- 针对子网或是 IP 做匹配,例如:[email protected]/24 or [email protected]

  7. R -- 针对客户端范围做匹配,例如: R@%foo.bar

然后我自己在做分组的时候,尝试了下 L 是否可以使用正则表达式

尝试一:

   nodegroups:
    #  group1: '[email protected],bar.domain.com,baz.domain.com and bl*.domain.com'
    #  group2: 'G@os:Debian and foo.domain.com'
       TEST1: 'L@JF1-TEST1-001,JF1-TEST1-002,JF-TEST1-0[0-9][0-9]'

执行命令 sudo salt -N TEST1 test.ping结果为:

JF1-TEST1-002:    TrueJF1-TEST1-001:    True

只会出现两台服务器,后面的不能匹配。

尝试二:

nodegroups:
    #  group1: '[email protected],bar.domain.com,baz.domain.com and bl*.domain.com'
    #  group2: 'G@os:Debian and foo.domain.com'
       TEST1: 'L@JF1-TEST1-001,JF1-TEST1-002 or JF-TEST1-0[0-9][0-9]'

执行命令 sudo salt -N TEST1 test.ping结果为:

JF1-TEST1-002:    TrueJF1-TEST1-001:    TrueJF1-TEST1-003:    TrueJF1-TEST1-004:    TrueJF1-TEST1-006:    TrueJF1-TEST1-005:    True

结果是所有的都匹配成功了

尝试三

nodegroups:
    #  group1: '[email protected],bar.domain.com,baz.domain.com and bl*.domain.com'
    #  group2: 'G@os:Debian and foo.domain.com'
       TEST1: 'L@JF-TEST1-0[0-9][0-9]'

执行结果为:

No minions matched the target. No command was sent, no jid was assigned.

表示没有匹配到任何一个

结论

使用 L 列表的方式,必须把 minion 列出来,或者是列出几台后,在后面接 or 或者 and 表达式, or 或者 and 后面接的表达式后面可以使用正则表达式。

注:想使用正则表达式,最好的方式就是使用 E