设为首页 收藏本站
查看: 1451|回复: 0

[经验分享] 自动化运维神器之saltstack (三)节点组及复合匹配器

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-11-17 14:02:35 | 显示全部楼层 |阅读模式
  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的内容,指定辅助配置文件的目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[iyunv@hadoop0 salt]# pwd
/etc/salt
## 在master文件最后添加一行内容,如下
[iyunv@hadoop0 salt]# tail -1 master
default_include: master.d/*.conf
## 创建辅助配置文件的目录及分组配置文件
[iyunv@hadoop0 salt]# mkdir master.d/
[iyunv@hadoop0 salt]# vi master.d/group.conf
nodegroups:
  group1: 'L@uadoop2,uadoop3'   
  group2: 'G@os:Ubuntu'
  ## L@表示匹配的是一个minions列表,列表成员为每个minion的id,这个id在minion配置文件中声明
  ## G@表示匹配的是grains的属性
  ## 分组的意图:将uadoop2、uadoop3加入到group1中,将系统为Ubuntu的主机加入到group2中

## 接着重启master服务
[iyunv@hadoop0 salt]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [  OK  ]
Starting salt-master daemon:                               [  OK  ]

## 验证分组是否成功
[iyunv@hadoop0 salt]# salt -N group1 test.ping
uadoop3:
    True
uadoop2:
    True
[iyunv@hadoop0 salt]# salt -N group2 test.ping
uadoop1:
    True



    我们可以看到,实现salt的分组就是这么的简单,那么在top.sls中如何匹配你所创建的组呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
## 这里使用pillar为group1的成员创建一个属性operation,值为CentOS
[iyunv@hadoop0 pillar]# pwd
/srv/pillar
[iyunv@hadoop0 pillar]# tree -f
.
├── ./operation.sls
└── ./top.sls

0 directories, 2 files
[iyunv@hadoop0 pillar]# cat top.sls
base:
  group1:                ## 匹配组名
    - match: nodegroup   ## 这行必须要有,表示使用分组匹配
    - operation          ## 引用同目录下的operation.sls
[iyunv@hadoop0 pillar]# cat operation.sls
operation: CentOS
## 将状态同步到minions
[iyunv@hadoop0 pillar]# salt '*' pillar.items
## 验证属性是否正确创建
[iyunv@hadoop0 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
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
    直接看例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
##
## 首先看单个Letter的测试
##

## 使用grains属性来匹配
[iyunv@hadoop0 pillar]# salt -C 'G@os:Ubuntu' test.ping
uadoop1:
    True
## 使用Minion ID的正则表达式来匹配   
[iyunv@hadoop0 pillar]# salt -C 'E@uadoop\d+' test.ping           
uadoop2:
    True
uadoop3:
    True
uadoop1:
    True
## 使用grains属性的正则表达式来匹配   
[iyunv@hadoop0 pillar]# salt -C 'P@os:(RedHat|Ubuntu|CentOS)' test.ping            
uadoop2:
    True
uadoop3:
    True
uadoop1:
    True
## 使用Minion ID来匹配   
[iyunv@hadoop0 pillar]# salt -C 'L@uadoop2,uadoop3' test.ping                           
uadoop2:
    True
uadoop3:
    True
## 使用pillar定义的属性来匹配   
[iyunv@hadoop0 pillar]# salt -C 'I@users:foway:1200' test.ping
uadoop2:
    True
uadoop1:
    True
uadoop3:
    True
## 使用IP段匹配   
[iyunv@hadoop0 pillar]# salt -C 'S@192.168.0.0/24' test.ping                  
uadoop3:
    True
uadoop2:
    True
uadoop1:
    True
     
##
## 接着看多个Letter复合后的测试
##            

## 匹配除grains中os的值为Ubuntu的主机之外的所有主机
[iyunv@hadoop0 pillar]# salt -C '* and not G@os:Ubuntu' test.ping        
uadoop3:
    True
uadoop2:
    True
## 匹配Minion ID为uadoop2或者grains中os的值为Ubuntu的主机
[iyunv@hadoop0 pillar]# salt -C 'uadoop2 or G@os:Ubuntu' test.ping        
uadoop2:
    True
uadoop1:
    True
## 匹配除uadoop2、uadoop3之外所有的以uadoop开头后边跟1位以上的数字的minion
[iyunv@hadoop0 pillar]# salt -C 'E@uadoop\d+ and not uadoop[2,3]' test.ping              
uadoop1:
    True
## 发现结合and、or、not后,复合匹配器变得更加的灵活



    同样的,认识了Compound matchers后,那么在top.sls中如何匹配你所创建的组呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
## 这里使用pillar为复合匹配到的主机创建一个属性webserver,值为httpd
[iyunv@hadoop0 pillar]# tree -f
.
├── ./operation.sls
├── ./top.sls
└── ./webserver.sls

0 directories, 3 files
[iyunv@hadoop0 pillar]# cat top.sls
base:
  group1:
    - match: nodegroup
    - operation  
   
  'E@uadoop\d+ and not uadoop[2,3]':    ## 最终会匹配到uadoop1
    - match: compound                   ## 这行必须要有,表示使用复合匹配
    - webserver                         ## 引用同目录下的webserver.sls文件
[iyunv@hadoop0 pillar]# cat webserver.sls
webserver: httpd

## 将状态同步到minions
[iyunv@hadoop0 pillar]# salt '*' pillar.items
## 验证属性是否正确创建
[iyunv@hadoop0 pillar]# salt 'uadoop[1-3]' pillar.item webserver
uadoop1:
    ----------
    webserver:
        httpd
uadoop3:
    ----------
uadoop2:
    ----------
## 由于匹配条件最终只会匹配到uadoop1,所以返回的结果如上,表示已经正确匹配并创建属性



    通过上面的测试我们可以发现,salt提供了比较强大的minion匹配功能,但salt所提供的又不止于此,最后我们来看salt的batch size功能,选项为-b(--batch-size),值只能为百分比和有限大小的正数
    首先看如下的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
## 不使用batch size
[iyunv@hadoop0 pillar]# salt '*' test.ping     
uadoop2:
    True
uadoop1:
    True
uadoop3:
    True
## 使用batch size
[iyunv@hadoop0 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大展身手的时候了,看下面的例子
1
salt -G ’os:RedHat’ --batch-size 25% apache.signal restart



    这条命令就能实现每次只重启总minions数的25%,等这25%的节点重启完成后,再重启下一个25%,就这样分批次的重启完所有节点的httpd服务。
    大隐隐于市。虽然saltstack这个工具很小巧,但是提供给我们的功能是如此的惊艳,甚至是powerful!哈哈,所以我们要多花点时间来拜访这位大隐,不为别的,就为生活变得更美好。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-30456-1-1.html 上篇帖子: 自动化运维神器之saltstack (二)文件服务器 下篇帖子: 自动化运维神器之saltstack (四)用户管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表