saltstack实现远程配置管理功能首先是要先匹配到对应的target minion,然后才会将命令发送到匹配到的minion上去执行。这里介绍两种比较强大的匹配方法,一是创建节点组;二是使用复合匹配器。
节点组将不同的主机分配到不同的组中去,便于实现主机的集中化管理,接下来首先看salt分组功能的实现。
要使用salt的分组功能,需要在master节点上进行配置,配置的方式有两种:
(1)、将分组的信息写在master的主配置文件
(2)、将分组的信息写在一个单独的配置文件中,然后主配置文件来include分组配置文件
这里我们选择第二种方式来降低耦合性。
1、master的配置
[root@controller1 ~]# vim /etc/salt/master
default_include: master.d/*.confdefault_include: master.d/*.conf
[root@controller1 ~]# mkdir /etc/salt/master.d/
[root@controller1 ~]# cat /etc/salt/master.d/group.conf
nodegroups:
group1: 'L@computer3,computer4'
group2: 'G@os:RedHat'
## L@表示匹配的是一个minions列表,列表成员为每个minion的id,这个id在minion配置文件中声明
## G@表示匹配的是grains的属性
## 分组的意图:将computer3,computer4 加入到group1中,将系统为RedHat的主机加入到group2(所有的都是RedHat系统)
## 接着重启master服务
[root@hadoop0 salt]# /etc/init.d/salt-master restart
Stopping salt-master daemon: [ OK ]
Starting salt-master daemon: [ OK ]
验证是否成功
[root@controller1 ~]# salt -N group1 test.ping
computer4:
True
computer3:
True
[root@controller1 ~]# salt -N group2 test.ping
computer5:
True
computer7:
True
computer6:
True
computer3:
True
computer8:
True
computer4:
True
我们可以看到,实现salt的分组就是这么的简单,那么在top.sls中如何匹配你所创建的组呢?
##在这里试用pillar 为group1的成员创建一个属性operation,值为nova computer
[root@controller1 pillar]# pwd
/srv/pillar
[root@controller1 pillar]# cat top.sls
base:
group1:
- match: nodegroup
- operation
[root@controller1 pillar]# cat operation.sls
operation: nova-computer
[root@controller1 pillar]# salt '*' pillar.items //将状态同步到minions上
[root@controller1 pillar]# salt '*' pillar.item operation
computer5:
----------
computer3:
----------
operation:
nova-computer
computer7:
----------
computer6:
----------
computer4:
----------
operation:
nova-computer
computer8:
----------
//由于computer5、computer6、computer7、computer8不属于group1 所以该minion没有peration属性,而group1中的computer3、computer4已经有该属性了。
接下来我们来看Compound matchers(复合匹配器),复合匹配器能够提供灵活的匹配方式,常用的如下表:
Letter | Match Type | Example |
G | Grains glob | G@os:CentOS |
E | PCRE Minion ID | E@uadoop\d+ |
P | Grains PCRE | P@os:(RedHat|CentOS|Ubuntu) |
L | List of minions | L@uadoop1,uadoop2,uadoop3 |
I | Pillar glob | I@users:kora:1000 |
S | Subnet/IP address | S@192.168.0.0/24 |
直接看例子
//
//先进行单个Letter测试
//
//使用grains属性的os属性匹配
[root@controller1 ~]# salt -C 'G@os:RedHat' test.ping
computer5:
True
computer6:
True
computer7:
True
computer4:
True
computer3:
True
computer8:
True
//
//使用Minion ID的正则表达式来匹配
[root@controller1 ~]# salt -C 'E@computer\d+' test.ping
computer5:
True
computer7:
True
computer6:
True
computer4:
True
computer3:
True
computer8:
True
//
//使用grains属性的正则表达式匹配
[root@controller1 ~]# salt -C 'P@os:(RedHat|Ubuntu|CentOS)' test.ping
computer5:
True
computer6:
True
computer7:
True
computer3:
True
computer8:
True
computer4:
True
//
//使用Minion ID属性匹配
[root@controller1 ~]# salt -C 'L@computer3,computer4' test.ping
computer4:
True
computer3:
True
//
//使用pillar定义的属性来匹配
[root@controller1 ~]# salt -C 'I@operation:nova-computer' test.ping
computer4:
True
computer3:
True
//
//使用IP段进行匹配
[root@controller1 ~]# salt -C 'S@192.168.100.0/24' test.ping
computer5:
True
computer6:
True
computer7:
True
computer8:
True
computer4:
True
computer3:
True
## 接着看多个Letter复合后的测试
//
//匹配grains中的os属性不是Ubuntu的(我的测试环境都是RedHat,所以都匹配上了。)
[root@controller1 ~]# salt -C '* and not G@os:Ubuntu' test.ping
computer5:
True
computer8:
True
computer7:
True
computer6:
True
computer3:
True
computer4:
True
//
//匹配Minion ID 为computer3或者nodename为computer4的
[root@controller1 ~]# salt -C 'computer3 or G@nodename:computer4' test.ping
computer4:
True
computer3:
True
//
//匹配除computer7、computer8之外的所有以computer开头后面跟数字1以上的数字的Minion
[root@controller1 ~]# salt -C 'E@computer\d+ and not computer[7-8]' test.ping
computer5:
True
computer6:
True
computer4:
True
computer3:
True
//
// 有点编程基础的朋友都知道and、or、not
// and 和的意思,必须匹配左右两边都成功
// or 或的意思,匹配左右两边任意一个
// not 是除了的意思,就是匹配除了剩下的项。
// 三个优先级高低排序:not、and、or
//
认识了Compound matchers后,那么在top.sls中如何匹配你所创建的组呢?
//
//这里使用pillar为复合匹配到的主机创建一个属性webserver,值为nginx
[root@controller1 pillar]# cat top.sls
base:
group1:
- match: nodegroup
- operation
'E@computer\d+ and not computer[5-8]': //最终会匹配到computer3-4
- match: compound //这行是必须的,表示使用复合匹配
- webserver //调用同一目录下的webserver.sls文件
[root@controller1 pillar]# cat webserver.sls
webserver: nginx
[root@controller1 pillar]# salt '*' pillar.item webserver
computer5:
----------
computer6:
----------
computer7:
----------
computer3:
----------
webserver:
nginx
computer8:
----------
computer4:
----------
webserver:
nginx
//最终匹配到了computer3、computer4,所以返回结果如上,表示正确匹配并创建属性。
通过上面的测试我们可以发现,salt提供了比较强大的minion匹配功能,但salt所提供的又不止于此,最后我们来看salt的batch size功能,选项为-b(--batch-size),值只能为百分比和有限大小的正数
首先看如下的例子
//不使用batch size
//
[root@controller1 pillar]# salt '*' -b 1 test.ping
computer5 Detected for this batch run
computer8 Detected for this batch run
computer6 Detected for this batch run
computer7 Detected for this batch run
computer3 Detected for this batch run
computer4 Detected for this batch run
Executing run on ['computer8']
computer8:
True
Executing run on ['computer7']
computer7:
True
Executing run on ['computer6']
computer6:
True
Executing run on ['computer5']
computer5:
True
Executing run on ['computer4']
computer4:
True
Executing run on ['computer3']
computer3:
True
根据官方文档的解释,使用batch size(这里设置的是1),所以同一时间远程执行命令会只在一个minion上执行直到这个minion完成相应的操作后,执行命令会发送到下一个minion,执行同样的操作,最终完成所有的minion上的命令执行。从上面的对比结果也可以看出不同。到这您不禁要问,这种方式的结果是一批接一批的minions分批执行,效率肯定不如所有的minion同时执行高,为什么还要用呢?
假设这样一种场景,你有一个100个节点的web服务器集群,集群的前端是一个反向代理来实现负载均衡,您已经对web站点进行了升级,现在需要重启后端的web服务,由于已经做了负载均衡,那么你肯定也不想一次性重启所有的web服务,因为这样会造成应用在瞬间是不可用的,理想的做法是重启集群中的部分节点上的服务,这样就保证了这部分节点重启服务时,仍有部分节点对外提供服务,待刚才重启的那部分节点成功启动完毕后,再来重启剩余的部分节点,最终就能实现web站点的平滑升级。这个时候就是salt batch size大展身手的时候了,看下面的例子
salt -G ’os:RedHat’ --batch-size 25% apache.signal restart
这条命令就能实现每次只重启总minions数的25%,等这25%的节点重启完成后,再重启下一个25%,就这样分批次的重启完所有节点的httpd服务。
大隐隐于市。虽然saltstack这个工具很小巧,但是提供给我们的功能是如此的惊艳,甚至是powerful!哈哈,所以我们要多花点时间来拜访这位大隐,不为别的,就为生活变得更美好。
未完待续……
转载于:https://blog.51cto.com/conny/1612118