在生产环境中,服务器往往不止一台,有可能是成千上万台。对于运维人员来说,如果单独对每台服务器进行管理,工作难度实在是太大了。SaltStack是一个服务器基础设施管理工具,它具有配置管理、远程执行、监控等功能。SaltStack由Python语言编写,是非常简单易用和轻量级的管理工具。
通过部署SaltStack环境,可以在成千上万台服务器上批量执行命令。对于不同的业务进行集中管理、分发文件、采集数据、软件包管理等,有利于运维人员提高工作效率,规范业务配置和操作。
SaltStack原理
SaltStack由Master和Minion构成,Master是服务端,表示一台服务器;Minion是客户服务端,表示多台服务器。在Master上发送命令给符合条件的Minion,Minion就会执行相应的命令,Master和Minion之间是通过ZeroMQ(消息队列)进行通信的。
SaltStack的Master端监听4505与4506端口,4505为MAster和Minion认证通信端口,4506为Master用来发送命令或者接收Minion的命令执行返回信息。
当客户端启动后,会主动连接Master端注册,然后一直保持该TCP连接,而Master通过这条TCP连接对客户端进行控制。如果连接断开,Master对客户端将不能进行控制。但是,当客户端检查到连接断开后,会定期向Master端请求注册连接。
SaltStack常用模块
SaltStack提供了非常多的功能模块,以便于对操作系统的基础功能和常用工具的操作。
- (1)pkg模块
pkg模块的作用是包管理,包括增删更新。 - (2)file模块
file模块的作用是管理文件操作,包括同步文件、设置文件权限和所属用户组、删除文件等操作。 - (3)cmd模块
cmd模块的作用是在Minion上执行命令或者脚本。 - (4)user模块
user模块的作用是管理系统账户操作。 - (5)service模块
service模块的作用是管理系统服务操作。 - (6)cron模块
cron模块的作用是管理cron服务操作。
案例:SaltStack批量部署并配置Apache
需求分析
1.案例目的
在生产环境中,经常需要根据不同的业务需求来分组部署和配置Nginx服务器。本案例使用了三台服务器,均采用CentOS7.4系统版本,要求能连接互联网,SELinux和防火墙均已关闭。
需要注意的是,三台服务器一定要设置完整的FQDN,和域名一样的形式,不然在主控端执行远程执行命令或者配置的时候,等待的时间会非常长,甚至还会出现其他不可控的问题。
2.部署环境
角色 | 主机名 | IP地址 | 组名 |
---|---|---|---|
master | master.saltstack.com | 192.168.88.13 | —— |
minion | web01.saltstack.com | 192.168.88.14 | group1 |
minion | web02.saltstack.com | 192.168.88.15 | group2 |
操作步骤
1.SaltStack安装
1.1首先安装epel源,因为后面需要安装SaltStack服务端和客户端,也包括后面的Apache
yum install epel-release -y //三台都执行此操作
1.2主控端(master)安装salt-master,被控端(minion)安装salt-minion
[root@master ~]# yum install salt-master -y
[root@web01 ~]# yum install salt-minion -y
[root@web02 ~]# yum install salt-minion -y
1.3配置主控端配置文件/etc/salt/master,注意默认master文件全部是注释的。主控端修改内容如下:
[root@master ~]# cat /etc/salt/master | grep -v ^$ | grep -v ^#
interface: 192.168.88.13 //修改15行监听地址
auto_accept: True //修改215行的主控端会自动认证被控端的认证
file_roots: //修改416行saltstack文件根目录位置,需要修改后创建
base:
- /srv/salt
pillar_roots: //修改529行的主目录,需要修改后创建
base:
- /srv/pillar
pillar_opts: True //修改552行的pillar开启功能
nodegroups: //修改710行的组分类
group1: 'web01.saltstack.com'
group2: 'web02.saltstack.com'
1.4创建salt文件根目录及pillar目录
[root@master ~]# mkdir /srv/salt
[root@master ~]# mkdir /srv/pillar
1.5启动salt-master服务并检查端口
[root@master ~]# systemctl start salt-master.service
[root@master ~]# netstat -natp | egrep '4505|4506'
tcp 0 0 192.168.88.13:4505 0.0.0.0:* LISTEN 3316/python
tcp 0 0 192.168.88.13:4506 0.0.0.0:* LISTEN 3338/python
1.6配置两台被监控端配置文件/etc/salt/minion(注意默认的minion文件全部也是注释的)
master:192.168.88.13 //16行,指定主控端IP
id:web01.saltstack.com //72行,指定被控主机名,另一台是web02.saltstack.com
1.7分别启动两台被控端服务,并在主控端上简单测试一下主控端和被控端的通信状态,如果返回都是True,则说明正常。
[root@web01 salt]# systemctl start salt-minion.service
[root@web02 ~]# systemctl start salt-minion.service
[root@master ~]# salt '*' test.ping
web02.saltstack.com:
True
web01.saltstack.com:
True
2.SaltStack批量部署Apache
2.1 在主控端上创建入口文件top.sls
[root@master salt]# vim top.sls
base:
'*':
- apache
2.2定义被控机执行状态,安装apache软件,配置文件并启动
[root@master salt]# vim apache.sls
apache-service:
pkg.installed:
- names:
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
2.3重启服务后,在主控端执行刷新state命令,让两台被控端去执行安装apache并配置
[root@master salt]# systemctl restart salt-master.service
[root@master salt]# salt '*' state.highstate
web02.saltstack.com:
----------
ID: apache-service
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 15:19:03.880968
Duration: 47422.538 ms
Changes:
----------
apr:
----------
new:
1.4.8-3.el7_4.1
old:
apr-util:
----------
new:
1.5.2-6.el7
old:
httpd:
----------
new:
2.4.6-80.el7.centos.1
old:
httpd-tools:
----------
new:
2.4.6-80.el7.centos.1
old:
...省略部分内容
2.4去被控端查看apache是否成功安装,并查看端口
[root@web01 salt]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
[root@web01 salt]# netstat -natp | grep 80
tcp 0 0 192.168.88.14:42808 192.168.88.13:4505 ESTABLISHED 3487/python
tcp6 0 0 :::80 :::* LISTEN 4186/httpd
[root@web02 ~]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
[root@web02 ~]# netstat -natp | grep 80
tcp6 0 0 :::80 :::* LISTEN 4316/httpd
这样就完成了通过SaltStack批量部署配置Apache!