salt-ssh
salt-ssh可以独立运行的,不需要minion端。
salt-ssh 用的是sshpass进行密码交互的。
以串行模式工作,性能下降。
安装
[root@server1 ~]# yum install -y salt-ssh
salt-ssh 安装完成后配置roster文件在:/etc/salt/roster
[root@server1 ~]# vim /etc/salt/roster
server2:
host: 172.25.254.2
user:root
password: redhat
server3:
host: 172.25.254.3
user: root
password: redhat
测试
因为salt-ssh是不需要minion节点的,所以可以关闭server2、server3上的salt-minion
[root@server2 ~]# systemctl stop salt-minion.service
[root@server3 ~]# systemctl stop salt-minion.service
然后就可以直接使用salt-ssh去连接,第一连接会有密码验证
[root@server1 ~]# salt-ssh '*' test.ping
Permission denied for host server3, do you want to deploy the salt-ssh key? (password required):
[Y/n] y
Password for root@server3:
server3:
True
Permission denied for host server2, do you want to deploy the salt-ssh key? (password required):
[Y/n] y
Password for root@server2:
server2:
True
这样的方式可以执行远程操作,相对于之前的salt执行方式都是一样的
[root@server1 ~]# salt-ssh server2 cmd.run hostname
server2:
server2
salt-syndic
syndic其实就是个代理,类似zabbix proxy,隔离master与minion。
Syndic必须要运行在master上,再连接到另一个topmaster上。
Topmaster 下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster。
syndic与topmaster的file_roots和pillar_roots的目录要保持一致。
简单来说就是在执行操作命令时,由topmaster去下发指令给下面的sydic节点,而syndic节点就是在普通的master主机上,控制master节点再去下发指令给minion节点最后执行。
安装配置Top master
这里需要配置另一台主机作为topmaster节点server4,同样配置yum源,安装salt-master
[root@server4 ~]# yum install -y salt-master
[root@server4 ~]# systemctl enable --now salt-master
编辑配置文件,开启顶级master的选项
[root@server4 ~]# vim /etc/salt/master
order_masters: True
[root@server4 ~]# systemctl restart salt-master
在下级的master里需要安装salt-syndic
[root@server1 ~]# yum install -y salt-syndic
修改配置,在syndic_master指向top master
[root@server1 ~]# vim /etc/salt/master
syndic_master: 172.25.254.4
[root@server1 ~]# systemctl restart salt-master.service #重启master服务
[root@server1 ~]# systemctl start salt-syndic.service #开启syndic
server1上的salt-syndic启动后就会去主动向top master发送请求,需要在server4上允许它的连接
[root@server4 ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server1
Rejected Keys:
[root@server4 ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
server1
Proceed? [n/Y] y
Key for minion server1 accepted.
测试
当在top master上去发送执行命令,还是去下发给下级的master后,下级master让它下面的minion去执行命令
[root@server4 ~]# salt '*' test.ping
server2:
True
server3:
True
salt-api
SaltStack 官方提供有REST API格式的 salt-api 项目,使用 CherryPy 来实现 restful 的 api,将使Salt与第三方系统集成变得尤为简单。
官方提供了三种api模块:
rest_cherrypy
rest_tornado
rest_wsgi
在master节点或top master上安装salt-api
[root@server1 ~]# yum install -y salt-api #会自动安装python-cherrypy依赖性
然后需要生成CA证书
[root@server1 ~]# cd /etc/pki/tls/private/ #在此目录下生成私钥
[root@server1 private]# openssl genrsa 2048 > localhost.key #生成一个2048位的加密钥
[root@server1 private]# cd /etc/pki/tls/certs/
[root@server1 certs]# make testcert #创建证书
创建认证用户和认证文件
[root@server1 certs]# useradd -s /sbin/nologin saltapi
[root@server1 certs]# echo saltapi | passwd --stdin saltapi
[root@server1 certs]# vim /etc/salt/master.d/aush.conf
external_auth:
pam:
saltapi:
- .* #这里写的是允许的权限,“.*”表示所有
- '@wheel'
- '@runner'
- '@jobs'
还需配置证书,还是在master.d 目录下,创建的文件名字随意,必须后缀是.conf
[root@server1 certs]# vim /etc/salt/master.d/api.conf
rest_cherrypy:
port: 8000 #监听端口
ssl_crt: /etc/pki/tls/certs/localhost.crt #指定刚才生的证书路径
ssl_key: /etc/pki/tls/private/localhost.key #指定刚才生成的key路径
[root@server1 certs]# systemctl restart salt-master.service #重启master服务
[root@server1 certs]# systemctl start salt-api #启动api
开启后就会开启8000端口,用来作为远程访问端口
测试获取认证token:
[root@server1 certs]# curl -sSk https://172.25.254.1:8000/login \ #指定端口登陆
> -H 'Accept: application/x-yaml' \
> -d username=saltapi \ #指定登陆用户
> -d password=saltapi \ #密码
> -d eauth=pam #指定认证方式,上面编写认证文件是指定的
return: #执行成功后的返回值
- eauth: pam
expire: 1591757830.849775
perms:
- .*
- '@wheel'
- '@runner'
- '@jobs'
start: 1591714630.849774
token: 15e36adb5b4e0c41f7f511aeee749074ef814e1a
user: saltapi
获取到token后就可以使用它直接去连接api执行推送任务
[root@server1 certs]# curl -sSk https://172.25.254.1:8000 \
> -H 'Accept: application/x-yaml' \
> -H 'X-Auth-Token: 15e36adb5b4e0c41f7f511aeee749074ef814e1a' \ #使用上面获取到的token值
> -d client=local \ #指定客户端是本机
> -d tgt='*' \ #指定操作对象
> -d fun=test.ping #操作命令
return: #获取到的值
- server2: true
server3: true