Saltstack简介及部署
一、Saltstack简介
saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
Salt的核心功能:
- 使命令发送到远程系统是并行的而不是串行的
- 使用安全加密的协议
- 使用最小最快的网络载荷
- 提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
二、saltstack通信验证机制
SaltStack 的通讯架构模型
Salt 采用服务端-代理的通讯模型(也可以通过 SSH 方式实现非代理模式)。服务端称为 Salt master,代理端称为 Salt minion。
Salt master 负责发送命令予 Salt minion,随后收集并展示这些命令的执行结果。一台 Salt master 可以管理几千台的系统。
saltstack通信机制
SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口。
Salt minion 验证机制:
(1).当 minion 启动时,其将搜索网络中的 master。当找到时, minion 将发送公钥给 Salt master,从而实现初次握手。其过程如下图所示。
(2).当初次握手后,Salt minion 的公钥将被保存在服务端,此时 master 需要使用过 salt-key 命令接收公钥(也可以采用自动机制)。注意:在 Salt minion 的公钥被接收前,Salt master 是不会将密钥发放给 minion 的,也就是说 minion 在此之前不会执行任何命令。
(3).当 Salt minion 的公钥被接收后,Salt master 就会把公钥连同用于加解密 master 信息的可变动 AES 密钥发送至 Salt minion。其中,返回给 Salt minion 的 AES 密钥由 minion 的公钥加密,可由 Salt minion 解密。
三、saltstack安装与配置
主机准备
主机准备
主机名 | ip | 作用 |
---|---|---|
server1 | 172.25.254.1 | salt-master |
server2 | 172.25.254.2 | salt-minion |
server3 | 172.25.254.3 | salt-minion |
以上主机系统为 rhel7.6,且防火墙和selinux均为关闭状态。
安装可以参考:https://repo.saltstack.com/#rhel
设置YUM仓库(每个主机都要操作):将主机上 的saltstack目录文件挂载到/var/www/html/
[root@server1 ~]# cat /etc/yum.repos.d/salt.repo
[salt]
NAME=SALT 3000
baseurl=http://172.25.254.2/3000
gpgcheck=0
master主机配置
安装master端:
[root@server1 yum.repos.d]# yum install salt-master -y
设置master自启动并启动服务:
[root@server1 ~]# systemctl enable --now salt-master
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
master端的配置文件为/etc/salt/master
。
启动后查看端口可以看出开启了4505和4506两个端口:
[root@server1 ~]# ss -antlup
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=16821,fd=14))
tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=3148,fd=3))
tcp LISTEN 0 128 *:4505 *:* users:(("salt-master",pid=30184,fd=15))
tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=3392,fd=13))
tcp LISTEN 0 128 *:4506 *:* users:(("salt-master",pid=30190,fd=23))
minion端配置
安装minion端:
以下操作以server2为例,server3和server2的操作相同:
[root@server2 ~]# yum install -y salt-minion
minion端的配置文件为/etc/salt/minion
:
[root@server2 ~]# cd /etc/salt/
[root@server2 salt]# vim minion
[root@server2 salt]# cat -n minion | grep 16
第16行设置master主机的ip:
16 master: 172.25.254.1
自启动:
[root@server2 salt]# systemctl enable --now salt-minion
server3与server2操作相同。
配置连接
当打开server2时使用lsof工具查看4506端口情况:
[root@server1 salt]# lsof -i :4506
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/usr/bin/ 4717 root 23u IPv4 33911 0t0 TCP *:4506 (LISTEN)
/usr/bin/ 4717 root 30u IPv4 37251 0t0 TCP server1:4506->server2:40236 (ESTABLISHED)
可以看出4506端口接收到了server2的信息,查看公钥情况:
[root@server1 salt]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server2
Rejected Keys:
可以看出server2正在等待确认,使用以下命令确认:
[root@server1 salt]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
server2
Proceed? [n/Y] y
Key for minion server2 accepted.
-A
表示接受所有,-a
表示指定接受,-d
表示指定删除,-D
表示全部删除。
再次查看公钥情况可以看出server2已经确认:
[root@server1 salt]# salt-key -L
Accepted Keys:
server2
Denied Keys:
Unaccepted Keys:
Rejected Keys:
此时server2已经与server1连接成功:
[root@server1 salt]# lsof -i :4505
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/usr/bin/ 4711 root 15u IPv4 33856 0t0 TCP *:4505 (LISTEN)
/usr/bin/ 4711 root 17u IPv4 38277 0t0 TCP server1:4505->server2:34148 (ESTABLISHED)
他们之间的公钥保存在/etc/salt/pki
目录中。
server3打开salt-minion后接受公钥与server1连接。
连接后Saltstack集群部署完成。
部署完成后可以使用以下命令测试:
[root@server1 minions]# salt '*' test.ping
server2:
True
server3:
True
其中,'*'
代表集群中的所有主机(即server2和server3),test
表示模块,作用与python中的模块类似,ping
表示test
模块中的函数,作用与python中的函数类似。
从返回值可以看出部署没有问题。
[root@server1 minions]# salt server2 test.ping
server2:
True
[root@server1 minions]# salt server3 test.ping
server3:
True
minion端更改主机名后
当minion端更改主机名后我们在master端查看会发现没有改变,此时我们需要将保存minion端主机名的缓存删除,缓存保存在/etc/salt/minion_id
文件中,删除这个文件后重启salt-minion
即可。
[root@server2 minion]# cd /etc/salt/
[root@server2 salt]# ls
cloud cloud.deploy.d cloud.profiles.d master minion minion_id proxy roster
cloud.conf.d cloud.maps.d cloud.providers.d master.d minion.d pki proxy.d
[root@server2 salt]# cat minion_id
server2