自动化运维工具--Saltstack安装部署配置使用

Posted by Yancy on 2015-10-10

自动化运维工具–Saltstack安装部署配置使用

前言:

开始学saltstack的时候是在现在一家做CDN云加速的那是在2014年,salt刚刚出来所以我觉得我接触应该也算早的。 使用最多的同步下发的用到这个工具,下面我简单介绍和操作给大家看下。
Salt 和 Puppet Chef 一样可以让你同时在多台服务器上执行命令也包括安装和配置软件。

Salt 有两个主要的功能:配置管理和远程执行。 Saltstack是一个大型分布式的配置管理系统(安装升级卸载软件,检测环境),也是一个远程命令执行系统。通过c/s的模型实现。服务器端对远程客户机的操作:

###(一)部署虚拟化环境

(1)两组服务器进行,操作系统版本为Centos release 6.4 RHEL 也可以。 (2)安装这个先安装下epel 由于现在网络RHEL官网yum源还没有 saltstack的安装包支持。因此先安装epel作为部署saltstack的默认yum源。

(1) 主服务器 (主控端) IP:192.168.23.21

1
2
3
4
#rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
#yum install salt-master -y (安装salt-master)
#chkconfig salt-master on
#service salt-master start

(2)从服务器安装 (被控端)IP:192.168.23.24

1
2
3
#yum install salt-minion -y (安装salt-minion)
#chkconfig salt-master on
#service salt-master start

到这里已经安装完成。

Saltstack 防火墙配置

在主控端添加TCP 4505,TCP 4506 的规则,而在被控端无须配置防火墙,原理是被控端直接与主控端的zeromp建立链接。 接收 广播道任务信息并执行,具体操作是添加两条iptables规则:

1
2
-A INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT
-A INPUT -m state --state new -m tcp -p tcp --dport 4506 -j ACCEPT

默认配置文件位于/etc/salt/master ,默认不需要更改该配置文件。master端有两个端口需要在iptables上放行.

部署要求:两台机器网络互通,最好关闭防火墙。关闭selinux. 在启动下服务。

更新Saltstack 配置及安装效验。

Saltsatack 分两种,一种为master (主控制),另一端为minion (被控端),安装完毕后需要对两种角色的配置文件进行修改。 具体说明如下:

(1) master 主控端配置

1
2
3
4
5
6
7
8
9
vim /etc/salt/master
# 绑定Master 通信IP
interface :192.168.23.21
#自动认证,避免手动运行salt-key 来确认证书信任;
auto-accept:True
修改/etc/hosts
主机要添加被控机器的IP 和主机名
192.168.23.24 xx.rix.com

服务端配置

主控端基本设置 编辑配置文件 /etc/salt/master,修改如下所示配置项,去掉前面的注释符

1
2
3
interface: 192.168.23.21
log_file: /var/log/salt/master # 记录主控端运行日志
key_logfile: /var/log/salt/key # 记录认证证书日志

客户端配置

修改/etc/hosts

主机要添加服务端机器的IP 和主机名

1
192.168.23.21 salt

受控端基本设置 编辑配置文件 /etc/salt/minion,修改如下所示配置项,去掉前面的注释符#

1
2
3
4
master: 192.168.23.21 # 设置主控端
这里master设置主控端可以hosts名称:
#master: salt
前提是要设置hosts.

我这里直接配置的是主机名,也可以配置成IP地址,如果配置成主机名的话,就需要在/etc/hosts文件中master主机对应的IP ,如果使用内部DNS的例外,可以在内部DNS上的统一配置。

在其下增加一行内容为:

1
- id: tomcatA1

这里是指定当前主机的id号,这在后面master认证和master调用命令执行时显示的名称,可以根据实际识别需要填写。另外需要注意的是,以上两处配置冒号后面都需要有一个空格,不然会报如下错误:

1
2
log_file: /var/log/salt/minion # 记录受控端运行日志
key_logfile: /var/log/salt/key # 记录认证证书日志

主控端和受控端

启动各自的服务,确保服务启动后没有任何报错信息,如果异常请检查相应日志文件处理

1
2
主控端: service salt-master restart
受控端: service salt-minion restart

saltstack 主控端是依靠openssl证书来与受控端主机认证通讯的,受控端启动后会发送给主控端一个公钥证书文件,在主控端用 salt-key 命令来管理证书。

1
2
3
salt-key -L # 用来查看证书情况
salt-key -a 服务端名称或IP # 用来管理接受证书
salt-key -A # 用来管理接受所有认证主机的认证

主控端和被控端的证书默认都存放在/etc/salt/pki/ 中,如果遇到证书不生效的情况下,可在主控端证书存放目录删除受控端证书,重新认证一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ny-cloud-pagespeed00 ~]# salt-key -a 192.168.23.24
The following keys are going to be accepted:
Unaccepted Keys:
192.168.23.24
Proceed? [n/Y] y #这里输入y 代表同意加入证书。
[root@ny-cloud-pagespeed00 minions]# salt -v "xx.rix.com" test.ping #这里的.com是受控机的hostname 认证名称。
Executing job with jid 20151004162442004183
-------------------------------------------
xx.rix.com:
True

这里可以获取到认证,那么我们把认证加进去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@salt ~]# salt-key -L
Accepted Keys:
Gateway1
Gateway2
ihaozhuo1
ihaozhuo2
node
openapi
report1
report2
tomcat_A1
tomcat_A2
tomcat_B1
tomcat_B2
tomcat_bmw
tomcat_C1
tomcat_C2
weixin
Denied Keys:
Unaccepted Keys:
Rejected Keys:

我上面用的-A参数,该参数意思是接受所有认证主机的认证,也可以使用 -a id名 只认证单独的主机。默认认证完成后会在/etc/salt/pki/master/minions目录找到以ID名命令的文件,里面存放的是密钥文件。

如果对客户端信任,可以让master自动接受请求,在master端/etc/salt/master配置。

(二)命令执行

True代表正常,*代表所有主机,也可以选择单台或者按组及正则进行匹配等,这个可以参看下官方相关文档 。其默认执行的正则是shell正则,也可以使用其他正则或组等,如下:

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
[root@salt ~]# salt '*' test.ping
[root@salt ~]# salt '*' test.ping
tomcat_C2:
True
tomcat_B2:
True
ihaozhuo1:
True
ihaozhuo2:
True
openapi:
True
tomcat_B1:
True
tomcat_C1:
True
weixin:
True
tomcat_A1:
True
tomcat_A2:
True
node:
True
Gateway2:
True
report1:
True
report2:
True
tomcat_bmw:
True
Gateway1:
Minion did not return. [Not connected]

这里可以看到有一台ping不通,就应该上去查看下。

1
2
3
4
5
6
7
8
[root@Gateway1 ~]# ps -ef | grep minion
root 15343 15168 0 11:22 pts/0 00:00:00 grep --color=auto minion
[root@Gateway1 ~]# service salt-minion start
Redirecting to /bin/systemctl start salt-minion.service
[root@Gateway1 ~]# ps -ef | grep minion
root 15422 1 7 11:22 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 15431 15422 46 11:22 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 15494 15168 0 11:22 pts/0 00:00:00 grep --color=auto minion

原来是进程挂了,所有这也是salt什么都好唯一一点缺点就是需要配置客户端启动服务,这样对网络传输等等都有要求比较高。一旦进程死了,几百台以上可能就比较费力。

1
2
3
4
- salt 'shell正则' 命令
- salt -E 'prel 正则'
- salt -N $group 命令
- salt -L 'server_id1,server_id2,server_id3' 命令
1
2
3
4
5
6
常用的操作类似如下
- salt '*' cmd.run "ab -n 10 -c 2 http://www.google.com/"
- salt '*' grains.ls 查看grains分类
- salt '*' grains.items 查看grains所有信息
- salt '*' grains.item osrelease 查看grains某个信息
- salt '*' cmd.run "/App/nginx/sbin/nginx -v"