一、正则语法
语法 | 说明 | 表达式实例 | 完整匹配的字符串 |
---|---|---|---|
. | 匹配任意除换行字符"\n"外的字符,在DOTALL模式中也能匹配换行符 | a.c | abc |
\ | 转移字符,使后一个字符改变原来的意思,如果字符串中有*需要匹配,可使用\*或者字符集[*] | a\.c | a.c |
[...] | 字符集,对应的位置可以是字符集中任意字符。 | a[bcd]e | abe、ace、ade |
\d | 数字:0~9 | a\dc | a1c |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 空白字符:[ \t\r\n\f\v] | a\sc | a c |
\S | 非空白字符:[^\s] | a\Sc | abc |
\w | 字符[A-Za-z0-9] | a\wc | abc |
\W | [^\w] | a\Wc | ac |
* | 匹配前一个字符0次或无限次 | abc* | abcc |
+ | 匹配前一个字符1次或无限次 | abc* | abcc |
? | 匹配前一个字符0次或1次 | abc? | ab、abc |
{m} | 匹配前一个字符m次 | ab{2}c | abbc |
{m,n} | 匹配前一个字符m次,m和n可以省略,若省略m,则匹配0至n次,若省略n,则匹配m至无限次 | ab{1,2}c | abc、abbc |
^ | 匹配字符串开头,在多行模式中匹配每一行的开头 | ^abc | abc |
$ | 匹配字符串末尾,在多行模式中匹配每一行的末尾 | abc$ | abc |
\A | 进匹配字符串开头 | \Aabc | abc |
\Z | 仅匹配字符串结尾 | abc\Z | abc |
以特定字符开头或结尾的匹配方式:
[root@29-server ~]# salt -E "^minion-.*" test.ping
minion-one:
True
[root@29-server ~]# salt -E ".*-one$" test.ping
minion-one:
True
[root@29-server ~]# salt -E 'm{0, 1} inio[m, n]-one$' test.ping
minion-one:
True
分组匹配的方式:
[root@29-server ~]# salt -E 'minion-((one)|(other))' test.ping
minion-one:
True
[root@29-server ~]# salt -E 'minion-(one)?' test.ping
minion-one:
True
二、列表匹配
有时候,我们只想匹配一个指定列表里面的主机并进行远程执行操作,这时可能全局匹配方式和正则表达式方式都无法很好地完成任务,这种情况下我们可以直接使用-L选项进行列表匹配。
[root@29-server ~]# salt -L "minion-one, minion-two, minion-three" test.ping
minion-one:
True
minion-two:
True
minion-three:
True
通常列表匹配的主机都写在master的配置文件中,/etc/salt/master中以nodegroups形式出现,包括正则匹配全局匹配等方式都可以写在配置文件中,然后通过分组匹配选项-N加上nodegroups名称进行匹配。
[root@29-server ~]# cat /etc/salt/master |grep -vE "^$|#"
nodegroups:
testgroup: "minion-one"
[root@29-server ~]# salt -N "testgroup" test.ping
minion-one:
True
三、grains匹配
我们可以使用Grains定位主机:利用-G或—grain:对只是CentOS的机器进行定位。
[root@29-server ~]# salt -G "os:CentOS" test.ping
minion-one:
True
定位系统版本是7.6的主机,如下所示。
[root@29-server ~]# salt "minion-one" grains.item osrelease
minion-one:
----------
osrelease:
7.6.1810
[root@29-server ~]# salt -G "osrelease:7.6.1810" test.ping
minion-one:
True
四、pillars匹配
创建两个自定义的pillar数据
[root@29-server]# tree /srv/pillar/
/srv/pillar/
├── test.sls
└── top.sls
[root@29-server ~]# cat /srv/pillar/top.sls
base:
'*':
- test
[root@29-server ~]# cat /srv/pillar/test.sls
name: wang
role: aaa
[root@29-server ~]# salt '*' pillar.items
minion-one:
----------
name:
wang
role:
aaa
匹配role值是Web的主机并执行远程命令:
[root@29-server ~]# salt -I "name:wang" test.ping
minion-one:
True
五、复合匹配
复合匹配如下所示,这些匹配方式之间用逻辑运算符进行组合,同时用@符号来规定每部分匹配的类型。这段匹配的含义是匹配所有minion-开头的并且操作系统是CentOS且不能以two结尾的主机。
[root@29-server ~]# salt -C 'minion-* and G@os:CentOS not E@.*-two$' test.ping
minion-one:
True
复合匹配可以混合所有的Salt匹配主机方法,以下为官方文档的所有匹配方式。
字母 | 匹配类型 | 示例 |
---|---|---|
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@agent1,agent2,agent3 |
I | Pillar glob | I@pdata:foobar |
S | Subnet/ IP address | [email protected]/24 or [email protected]/24 |
R | Range cluster | R@%foo.bar |