自动化运维神器之saltstack (三)节点组及复合匹配器

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!哈哈,所以我们要多花点时间来拜访这位大隐,不为别的,就为生活变得更美好。

时间: 2024-11-07 19:33:54

自动化运维神器之saltstack (三)节点组及复合匹配器的相关文章

自动化运维神器之saltstack (五)salt-ssh的应用场景

satlstack号称自动化运维的利器,那么saltstack能不能实现自身的批量部署呢?如果你也有这样的疑问,那么就更要看这篇文章了.答案当然是肯定的啦!saltstack可以利用salt-ssh来实现自身的批量部署.首先看待salt-ssh,很容易想到它是一个依赖 ssh 来进行远程命令执行的工具,这样做的好处是你不必在客户端安装minion程序,就可以实现远程命令的执行,而且salt-ssh支持salt的绝大部分功能. 既然不安装minion端,那么master怎样识别到客户端并与客户端进

saltstack 自动化运维神器(三)节点组及复合匹配器

saltstack实现远程配置管理功能首先是要先匹配到对应的target minion,然后才会将命令发送到匹配到的minion上去执行.这里介绍两种比较强大的匹配方法,一是创建节点组:二是使用复合匹配器. 节点组将不同的主机分配到不同的组中去,便于实现主机的集中化管理,接下来首先看salt分组功能的实现. 要使用salt的分组功能,需要在master节点上进行配置,配置的方式有两种: (1).将分组的信息写在master的主配置文件 (2).将分组的信息写在一个单独的配置文件中,然后主配置文件

自动化运维系列之SaltStack批量部署Apache服务

自动化运维系列之SaltStack批量部署Apache服务 saltstack原理 SalStack由master和minion构成,master是服务端,表示一台服务器:minion是客户端,表示多台服务器.在Master上发送命令给符合条件的minion,Minion就会执行相应的命令.Master和Minion之间是通过ZeroMQ(消息队列)进行通信的. SaltStack的Master端的监听端口是4505和4506,4505端口是Master和Minion认证通信端口:4506端口是

自动化运维工具之saltstack

今天试着在centos7上安装了saltstack自动化运维工具,以下是安装步骤: 首先,我们安装bash-completion包,它可以补全centos7的命令. yum install -y bash-completion 关于服务的启动问题: 首先,设置服务开机自动启动: systemctl enable salt-master 查看是否设置好开机启动: systemctl is-enabled salt-master 启动服务: systemctl restart salt-master

Spring Cloud微服务运维神器之Consul Template?

Spring Cloud微服务架构浅析 这篇文章中要和大家分享下的就是在Spring Cloud微服务架构模式中被运维小哥用的很爽的一个工具Consul Template? 在具体介绍Consul Template是个什么东西之前,我们先来整体看一张微服务模式下的系统架构图,如下图所示: 在上图中,我们看到在基于Spring Cloud的微服务体系中,所有的微服务都会被注册到统一服务注册中心进行服务管理,这里使用的服务注册中心是Consul.假设在正常情况下,我们面向C端用户设计了一套微服务逻辑

自动化运维工具-saltstack

Saltstack(中国用户组www.saltstack.cn)基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能. 三种工作方式:  本地, c/s, 基于ssh(不用安装agent)三大功能: 远程命令执行,配置管理(服务,文件,cron,用户,组),云管理支持系统:大多数都支持,windows上不支持安装master 1. saltstack安装前期准备:准备两台机器,写hostname

自动化运维Python系列(三)之基础函数和文件操作

函数作用 增强代码的重用性和可读性 在没有使用函数编程之前,我们可能一直遵循的都是面向过程编程,即根据业务逻辑从上到下实现各个功能,这样的做的坏处是代码可读性不强,大量冗余代码,而且执行效率不高:有了函数后,我们就可以将多次使用到的相同代码模块放在单独的函数定义中,在任何想要调用它的地方随时调用,这就叫做函数式编程. 面向对象编程其实就是对函数进行再分类和封装,让开发"更快更好更强..." 函数的定义 def 函数名(参数): ... 函数体 ... 返回值 函数的定义主要有如下要点:

Python自动化运维 - day17 - Django(三)CSRF

CSRF跨站请求伪造 CSRF跨站点请求伪造(Cross-Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件.发消息,盗取你的账号,添加系统管理员,甚至于购买商品.虚拟货币转账等. CSRF攻击介绍及防御 人设:Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合

Python_oldboy_自动化运维之路(三)

本节内容 列表,元组,字典 1.列表,元组,字典 [列表] 1.定义列表 1 names = ['Alex',"Tenglan",'Eric'] 2.通过下标访问列表中的元素,下标从0开始计数 1 >>> names[0] 2 'Alex' 3 >>> names[2] 4 'Eric' 5 >>> names[-1] 6 'Eric' 7 >>> names[-2] #还可以倒着取 8 'Tenglan' 切片: