在服务器自动化部署方面我们目前主要用cfengine2,期间自己也尝试过折腾puppet、fabric、func之类的工具,包括自己利用python模块写一些自动化工具,前面的blog可以看到,结果总的来说感觉都不是十分满意。最近瞄上了saltstack,该工具由python编写,saltstack即能完成puppet的配置管理工作又能完成fabric的临时批量执行任务。
和主流的配置管理工具一样,saltstack也是C/S模式的,需要你在控制端安装master,在客户端安装minion。控制端下发命令给客户端,然后在客户端上执行该命令。
关于saltstack的信息可以参考:http://docs.saltstack.com/
下面说说实验环境:
10.1.6.36 ubuntu12.04-1 master minion 10.1.6.39 ubuntu12.04-2 minion 10.1.6.50 debian7-1 minion 10.1.6.51 debian7-2 minion1 更新ubuntu12.04和debian7的更新源
#更新ubuntu12.04的/etc/apt/sources.list文件加入下面第一句话 deb http://ppa.launchpad.net/saltstack/salt/ubuntu precise main #更新源数据库 apt-get updaet #更新key认证 wget -q -O- "http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x4759FA960E27C0A6" | sudo apt-key add - #更新debian7的/etc/apt/sources.list文件 deb http://debian.saltstack.com/debian wheezy-saltstack main #更新源数据库 apt-get updaet #更新key认证 wget -q -O- "http://debian.saltstack.com/debian-salt-team-joehealy.gpg.key" | apt-key add -2 在master上安装saltstack
apt-get install -y salt-minion salt-common salt-master在minion上安装saltstack
apt-get install -y salt-minion salt-common
当然除了上面列出的基础包外,你可以根据需求安装salt-doc salt-cloud salt-api salt-syndic等包。
3 配置master和minion
salt的配置文件在/etc/salt/目录下,master对应master文件,minion对应minion文件。默认的配置文件只要修改监听IP即可,其余配置选项则不用改动。在36上面改动master监听本机ip地址,在其余minion上面监听各自的本机ip即可。然后启动master和minion。
关于master和minion的配置可以参考:
http://docs.saltstack.com/ref/configuration/master.html
http://docs.saltstack.com/ref/configuration/minion.html
4 调试master是否可以正常启动
salt-master -l debug 调试 salt-master -d 后台运行 #或者 /etc/init.d/salt-master start
master默认监听两个端口,4505(publish_port)为salt的消息发布系统,4506(ret_port)为salt客户端与服务端通信的端口。
5 在服务端接受客户端的key。
salt-key -L 查看哪些key没有备接收
salt-key -A 接收所有未认证的key,或者salt-key -a keyname 来认证单个key
1 minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key), minion.pub(public key),然后将minion.pub发送给master
2 master在接收到minion的public key后,通过salt-key命令接受minion的public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的public key, 然后master就能对minion发送指令了。
minion id:minion的唯一标示。默认情况minion id是minion的主机名(FQDN),你可以通过id来指定minion的名字。
6 下面简单测试一下所有认证过的minion的连通性:
salt '*' test.ping
简单的很嘛,可以很清楚的反馈出结果。上例中使用的是‘*’来匹配所有的客户端,其实还可以使用正则来匹配minion的ID。执行的结果存放在/var/cache/salt/master/minions/目录下面,每个客户端一个目录。
salt '*' test.ping 所有的minion客户端的连通性,‘*’表示匹配所有的客户端
salt '*.example.*' test.ping
salt -E 'web1-(prod|devel)' test.ping 正则表达式匹配
salt -L 'web1,web2,web3' test.ping 指定具体的匹配
salt -L 'ubuntu12.04-1,ubuntu12.04-2' test.ping
要查看salt命令里的模块用法,可以参考
salt '*' sys.doc下面再测试一个命令,在master上控制在minion上执行一个命令:
这次测试只是针对客户端ID为debian7-*的客户端,分别测试了hostname和uptime,通过cmd.run模块来指定你要运行的命令,其实salt自带了很多集成进系统的命令,真的很值得研究: http://docs.saltstack.com/ref/modules/all/index.html
上面的测试要么完全匹配,要么用正则匹配客户端,如果对自己的正则水平不放心,怕遗漏或者过多匹配客户端,从而导致出现线上事故,也可以预先定义一个node group,把group包含的minion包含进去,然后在执行命令时直接指定group即可。
Node group为预先在master配置文件中的nodegroups参数定义的minion组.用来进行批量对minion进行操作,切记:组名不能顶格写,会无法识别。
Node groups allow for logical groupings of minion nodes,A group consists of a group name and a compound target
36的nodegroups定义如下:表示debian系统一个组,ubuntu系统一个组
nodegroups: debian7: 'E@debian7-*' ubuntu12.04: '[email protected]*'还有更多的参数可以指定匹配方式,如下:
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 List of minions [email protected],minion3.domain.com or bl*.domain.com I Pillar glob I@pdata:foobar S Subnet/IP address [email protected]/24 or [email protected] R Range cluster R@%foo.bar D Minion Data D@key:value
不过有个小问题:在使用node group管理minion时,每次执行完组中的最后一个客户端后,要等待几十秒钟才会完全返回到shell状态下。
7 minion的状态管理,可以自己写命令通过cmd.run来运行,也可以看看自带的模块中有没有相关命令,参考如下:
http://docs.saltstack.com/ref/states/all/index.html
本文中已经两次提到自带的模块了,可见这个很重要啊...