saltstack实现远程配置管理功能首先是要先匹配到对应的target minion,然后才会将命令发送到匹配到的minion上去执行。这里介绍两种比较强大的匹配方法,一是创建节点组;二是使用复合匹配器。
节点组将不同的主机分配到不同的组中去,便于实现主机的集中化管理,接下来首先看salt分组功能的实现。
看下环境先:
hadoop0.updb.com 192.168.0.100 OS:CentOS 6.5 Role:master
uadoop1.updb.com 192.168.0.201 OS:Ubuntu Role:minion
uadoop2.updb.com 192.168.0.202 OS:CentOS 6.5 Role:minion
uadoop3.updb.com 192.168.0.203 OS:CentOS 6.5 Role:minion
要使用salt的分组功能,需要在master节点上进行配置,配置的方式有两种:
1、将分组的信息写在master的主配置文件
2、将分组的信息写在一个单独的配置文件中,然后主配置文件来include分组配置文件
这里我们选择第二种方式来降低耦合性。
首先我们要在master配置文件中添加一行include的内容,指定辅助配置文件的目录
[[email protected] salt]# pwd /etc/salt ## 在master文件最后添加一行内容,如下 [[email protected] salt]# tail -1 master default_include: master.d/*.conf ## 创建辅助配置文件的目录及分组配置文件 [[email protected] salt]# mkdir master.d/ [[email protected] salt]# vi master.d/group.conf nodegroups: group1: ‘[email protected],uadoop3‘ group2: ‘[email protected]:Ubuntu‘ ## [email protected]表示匹配的是一个minions列表,列表成员为每个minion的id,这个id在minion配置文件中声明 ## [email protected]表示匹配的是grains的属性 ## 分组的意图:将uadoop2、uadoop3加入到group1中,将系统为Ubuntu的主机加入到group2中 ## 接着重启master服务 [[email protected] salt]# /etc/init.d/salt-master restart Stopping salt-master daemon: [ OK ] Starting salt-master daemon: [ OK ] ## 验证分组是否成功 [[email protected] salt]# salt -N group1 test.ping uadoop3: True uadoop2: True [[email protected] salt]# salt -N group2 test.ping uadoop1: True
我们可以看到,实现salt的分组就是这么的简单,那么在top.sls中如何匹配你所创建的组呢?
## 这里使用pillar为group1的成员创建一个属性operation,值为CentOS [[email protected] pillar]# pwd /srv/pillar [[email protected] pillar]# tree -f . ├── ./operation.sls └── ./top.sls 0 directories, 2 files [[email protected] pillar]# cat top.sls base: group1: ## 匹配组名 - match: nodegroup ## 这行必须要有,表示使用分组匹配 - operation ## 引用同目录下的operation.sls [[email protected] pillar]# cat operation.sls operation: CentOS ## 将状态同步到minions [[email protected] pillar]# salt ‘*‘ pillar.items ## 验证属性是否正确创建 [[email protected] pillar]# salt ‘uadoop[1-3]‘ pillar.item operation uadoop1: ---------- uadoop3: ---------- operation: CentOS uadoop2: ---------- operation: CentOS ## uadoop1由于不属于group1组,所以该minion上没有创建operation属性,而group1中的uadoop2、uadoop3 ## 上已经成功创建了operation属性
接下来我们来看Compound matchers(复合匹配器),复合匹配器能够提供灵活的匹配方式,常用的如下表
Letter |
Match Type |
Example |
G |
Grains glob |
[email protected]:CentOS |
E |
PCRE Minion ID |
[email protected]\d+ |
P |
Grains PCRE |
[email protected]:(RedHat|CentOS|Ubuntu) |
L |
List of minions |
[email protected],uadoop2,uadoop3 |
I |
Pillar glob |
[email protected]:kora:1000 |
S |
Subnet/IP address |
[email protected]/24 |
直接看例子
## ## 首先看单个Letter的测试 ## ## 使用grains属性来匹配 [[email protected] pillar]# salt -C ‘[email protected]:Ubuntu‘ test.ping uadoop1: True ## 使用Minion ID的正则表达式来匹配 [[email protected] pillar]# salt -C ‘[email protected]\d+‘ test.ping uadoop2: True uadoop3: True uadoop1: True ## 使用grains属性的正则表达式来匹配 [[email protected] pillar]# salt -C ‘[email protected]:(RedHat|Ubuntu|CentOS)‘ test.ping uadoop2: True uadoop3: True uadoop1: True ## 使用Minion ID来匹配 [[email protected] pillar]# salt -C ‘[email protected],uadoop3‘ test.ping uadoop2: True uadoop3: True ## 使用pillar定义的属性来匹配 [[email protected] pillar]# salt -C ‘[email protected]:foway:1200‘ test.ping uadoop2: True uadoop1: True uadoop3: True ## 使用IP段匹配 [[email protected] pillar]# salt -C ‘[email protected]/24‘ test.ping uadoop3: True uadoop2: True uadoop1: True ## ## 接着看多个Letter复合后的测试 ## ## 匹配除grains中os的值为Ubuntu的主机之外的所有主机 [[email protected] pillar]# salt -C ‘* and not [email protected]:Ubuntu‘ test.ping uadoop3: True uadoop2: True ## 匹配Minion ID为uadoop2或者grains中os的值为Ubuntu的主机 [[email protected] pillar]# salt -C ‘uadoop2 or [email protected]:Ubuntu‘ test.ping uadoop2: True uadoop1: True ## 匹配除uadoop2、uadoop3之外所有的以uadoop开头后边跟1位以上的数字的minion [[email protected] pillar]# salt -C ‘[email protected]\d+ and not uadoop[2,3]‘ test.ping uadoop1: True ## 发现结合and、or、not后,复合匹配器变得更加的灵活
同样的,认识了Compound matchers后,那么在top.sls中如何匹配你所创建的组呢?
## 这里使用pillar为复合匹配到的主机创建一个属性webserver,值为httpd [[email protected] pillar]# tree -f . ├── ./operation.sls ├── ./top.sls └── ./webserver.sls 0 directories, 3 files [[email protected] pillar]# cat top.sls base: group1: - match: nodegroup - operation ‘[email protected]\d+ and not uadoop[2,3]‘: ## 最终会匹配到uadoop1 - match: compound ## 这行必须要有,表示使用复合匹配 - webserver ## 引用同目录下的webserver.sls文件 [[email protected] pillar]# cat webserver.sls webserver: httpd ## 将状态同步到minions [[email protected] pillar]# salt ‘*‘ pillar.items ## 验证属性是否正确创建 [[email protected] pillar]# salt ‘uadoop[1-3]‘ pillar.item webserver uadoop1: ---------- webserver: httpd uadoop3: ---------- uadoop2: ---------- ## 由于匹配条件最终只会匹配到uadoop1,所以返回的结果如上,表示已经正确匹配并创建属性
通过上面的测试我们可以发现,salt提供了比较强大的minion匹配功能,但salt所提供的又不止于此,最后我们来看salt的batch size功能,选项为-b(--batch-size),值只能为百分比和有限大小的正数
首先看如下的例子
## 不使用batch size [[email protected] pillar]# salt ‘*‘ test.ping uadoop2: True uadoop1: True uadoop3: True ## 使用batch size [[email protected] pillar]# salt ‘*‘ -b 1 test.ping uadoop1 Detected for this batch run uadoop2 Detected for this batch run uadoop3 Detected for this batch run Executing run on [‘uadoop3‘] uadoop3: True Executing run on [‘uadoop2‘] uadoop2: True Executing run on [‘uadoop1‘] uadoop1: 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!哈哈,所以我们要多花点时间来拜访这位大隐,不为别的,就为生活变得更美好。