继上篇多服务器自动化部署介绍后,本次将就三个我在实际工作中常用高级功能作简单介绍,让大家更能理解salt-stack,并将其运用到实际工作中。
salt的分组
当salt minion服务器非常多时,各服务器的minion id可能毫无规律,也可能需要仅对部分minion下发配置,如果每次输写salt命令时,都需要重新想下正则表达式怎么写,就显得易用性极差,可复用性不高。
为便于更好的管理,按各维度对minion id进行分组就显得更清晰易用了。nodegroup即用于对minion进行分组。
- 分组的类型
类型 | 说明 | 举例 |
-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 | minions列表 | L@minion1.example.com,minion3.domain.com or bl*.domain.com |
-I | Pillar glob匹配 | I@pdata:foobar |
-S | 子网/IP地址匹配 | S@192.168.1.0/24 or S@192.168.1.100 |
-R | Range cluster匹配 | R@%foo.bar |
-D | Minion Data匹配 | D@key:value |
其中E和L是最常用的(注意or代表和的意思。。。。与常规语法不同-_-d)
- 分组的配置
在/etc/salt/master配置文件里进行配置,找到nodegroups这个关键字就能看到示例了
nodegroups:
test1: ‘E@^.*saltstack.*$’
这里正则表达式的意思是匹配包含字符串saltstack的minion id,通常在实际应用中,可以通过这种方式匹配不同应用的minion
- 测试分组
salt -N test1 test.ping
如果出现正常返回值则表示分组配置成功
[root@Admin1-saltstack src]# salt -N test1 test.ping
Admin2-saltstack.littlebee.com:
True
Admin3-saltstack.littlebee.com:
True
如何建立多Master的SaltStack环境
0.16.0版本的发布,带来了minion可以连接多Master的特性。这种方式称为多master( multi-master )配置,使环境中的SaltStack冗余。在这种配置下,Salt Minions将连接所有配置的Salt Master。
在建立多Master的配置中,主要的一点就是所有的Master使用同样的private key。这些key将在Master第一次启动时自动生成。 因此在多Master环境建立时,需要从原始的(original) Master上拷贝其private key至第二个Master以提供它启动时自动生成的那个, 以此类推。
Master的private key存储在Master本地的 pki_dir 目录下。默认的目录是 /etc/salt/pki/master/master.pem,将该key拷贝到新增的master上。需要注意的是,在拷贝的时候,需要确保新增的master上并没有minion连接进来。
在已有一台master,多台minion的情况下,增加一台master服务器,操作步骤:
1) apt-get -y -q install salt-master # 在新增服务器安装服务器端
2) 将已有的一台master上的两个文件复制到新增master的同样目录下
/etc/salt/pki/master/master.pem
/etc/salt/pki/master/master.pub
3)vi /etc/salt/master # 设置监听IP及打开自动通过验证
interface: 0.0.0.0
auto_accept: True
4)service salt-master restart
5)修改每台minion的/etc/salt/minion文件,修改方法如下:
master:
– master1.example.tld
– master2.example.tld
6) service salt-minion restart
此时所有的Master均可以控制你的minions。
python环境下如何使用salt
一、Python安装saltstack
pip install salt
二、接口调用实例 (仅限在salt master服务器上执行)
1、test.ping
import salt.client
client = salt.client.LocalClient()
ret = client.cmd(‘*’,’test.ping’)
print ret
2、cmd模块
1)功能:实现远程命令的调用执行
2)实例:
获取所有主机的内存使用情况 salt ‘*’ cmd.run “free -m”
client.cmd(‘SN2016-02-04′,’cmd.run’,[‘free -m’])
3、cp模块
1)功能:实现远程文件复制、目录复制、以及下载URL文件等操作
2)实例:
将制定被控主机的/etc/hosts文件复制到被控主机的本地的salt cache目录(/var/cache/salt/minion/localfiles)
salt ‘*’ cp.cache_local_file /etc/hosts
将主服务器file_roots指定位置下的目录复制到被控主机
salt ‘*’ cp.get_dir salt://path/to/dir /minion/dest
将主服务器file_roots指定位置下的文件复制到被控主机
salt ‘*’ vcp.get_file salt://path/to/file /minion/dest
下载URL内容到被控主机指定位置
salt ‘*’ cp.get_url http://www.saltshdot.org /tmp/index.html
client.cmd(‘XN2016-02-04′,’cp.get_file’,[‘salt://path/to/file’,’/minion/dest’])
4、file 模块
1)功能:被控主机文件常见操作
2)实例
校验所有被控主机的/etc/paddwd文件的MD5是否为99819b452d28c933d52f44ce5eb707ad,一致则返回True
salt ‘*’ file.check_hash /etc/passwd md5= 99819b452d28c933d52f44ce5eb707ad
在所有被控主机创建目录
salt ‘*’ file.mkdir /opt/test
将所有被控主机的/etc/httpd/httpd.conf文件的LogLevel参数的warn修改成info
salt ‘*’ file.sed /etc/httpd/httpd.conf ‘LogLevel warn’ ‘LogLevel info’
给所有被控主机的/tmp/test/test.conf 文件追加内容’maxclient 1000′
salt ‘*’ file.append /tmp/test/test.conf ‘maxclient 1000’
删除所有被控主机的/etc/foo文件
salt ‘*’ file.remove /etc/foo
client.cmd(‘*’,’file.remove’,[‘/etc/foo’])
5、根据namenode来确定目标主机
对应的shell命令: salt -N act_server cmd.run ‘df-lh’
最后
在实际运维的过程中,经常会出现很多重复的工作,工具的出现和灵活使用就是提高工作效率不可或缺的法宝。希望本文有起到抛砖引玉的作用,让大家有兴趣去挖掘salt-stack及其它自动化运维/部署更多更高级更有意思的功能。