salt-ssh可以独立运行的,不需要minion端。
salt-ssh 用的是sshpass进行密码交互的。
以串行模式工作,性能下降,即类似与ansible的模式。
实验前关闭一个minion端:
[root@server3 ~]# systemctl stop salt-minion
安装salt-ssh:
[root@server1 ~]# yum install -y salt-ssh
配置roster文件,默认的本地路径是 /etc/salt/roster
:
[root@server1 ~]# vim /etc/salt/roster
[root@server1 ~]# cat /etc/salt/roster
server3:
host: 172.25.63.3
user: root
passwd: redhat
这样就配置完成了,接下来进行测试:
[root@server1 ~]# salt-ssh server3 test.ping
server3:
True
可以看出部署成功,但是速度很明显变慢了。
注意当第一次访问的时候可能会由yes或no的选项:
可以加-i
选项直接忽略:
[root@server1 ~]# salt-ssh server3 test.ping -i
server3:
True
也可以配置ssh忽略主机key的检测:
[root@server1 ~]# vim .ssh/config
[root@server1 ~]# cat .ssh/config
StrictHostKeyChecking no
测试其他命令:
[root@server1 ~]# salt-ssh server3 cmd.run df
server3:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 17811456 1419016 16392440 8% /
devtmpfs 495428 0 495428 0% /dev
tmpfs 507512 0 507512 0% /dev/shm
tmpfs 507512 6896 500616 2% /run
tmpfs 507512 0 507512 0% /sys/fs/cgroup
/dev/sda1 1038336 135208 903128 14% /boot
tmpfs 101504 0 101504 0% /run/user/0
可以看出部署成功。
实验结束后打开minion端:
[root@server3 ~]# systemctl start salt-minion
如果大家知道zabbix proxy的话那就很容易理解了,syndic其实就是个代理,隔离master与minion。
Syndic必须要运行在master上,再连接到另一个topmaster上。
Topmaster 下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster。
topmaster并不知道有多少个minion。
syndic与topmaster的file_roots和pillar_roots的目录要保持一致。
主机 | ip | 作用 |
---|---|---|
server4 | 172.25.63.4 | topmaster |
server1 | 172.25.63.1 | salt-master(即syndic节点) |
server2 | 172.25.63.2 | salt-minion |
server3 | 172.25.63.3 | salt-minion |
且各主机selinux与防火墙均关闭。
在server4安装salt-master:
[root@server4 yum.repos.d]# yum install salt-master -y
[root@server4 ~]# cd /etc/salt/
[root@server4 salt]# vim master
[root@server4 salt]# cat -n master | grep 1047
1047 order_masters: True ##作为顶级master
[root@server4 salt]# systemctl enable --now salt-master.service
安装salt-syndic:
[root@server1 ~]# yum install salt-syndic -y
编辑配置文件将其指定为syndic节点:
[root@server1 ~]# vim /etc/salt/master
[root@server1 ~]# cat -n /etc/salt/master | grep 1051
1051 syndic_master: 172.25.63.4 ##指向topmaster
[root@server1 ~]# systemctl restart salt-master.service
[root@server1 ~]# systemctl start salt-syndic.service
接着就可以在topmaster端查看下级master的连接授权:
[root@server4 salt]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server1
Rejected Keys:
可以看到server1等待授权,接受server1:
[root@server4 salt]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
server1
Proceed? [n/Y] Y
Key for minion server1 accepted.
现在salt-syndic集群部署成功。
在topmaster执行:
[root@server4 salt]# salt '*' test.ping
server2:
True
server3:
True
可以看出topmaster可以访问到minion端。
SaltStack 官方提供有REST API格式的 salt-api 项目,将使Salt与第三方系统集成变得尤为简单。
官方提供了三种api模块:
官方链接:https://docs.saltstack.com/en/latest/ref/netapi/all/index.html#all-netapi-modules
安装salt-api:
[root@server1 ~]# yum install salt-api -y
生成证书:
[root@server1 ~]# cd /etc/pki/tls/private
[root@server1 private]# openssl genrsa 2048 > localhost.key
Generating RSA private key, 2048 bit long modulus
.................+++
...............+++
e is 65537 (0x10001)
[root@server1 private]# cd /etc/pki/tls/certs
[root@server1 certs]# make testcert //根据提示填写相关信息即可
这时我们生成了证书(localhost.crt)和key(localhost.key)。
创建用户认证文件:
[root@server1 certs]# cd /etc/salt/master.d/
[root@server1 master.d]# vim tls.conf
[root@server1 master.d]# cat tls.conf
rest_cherrypy:
port: 8000
ssl_crt: /etc/pki/tls/certs/localhost.crt
ssl_key: /etc/pki/tls/private/localhost.key
创建用户授权文件:
[root@server1 master.d]# vim auth.conf
[root@server1 master.d]# cat auth.conf
external_auth:
pam: #热插拔模式
saltapi: #用户
- .*
- '@wheel'
- '@runner'
- '@jobs'
创建用户并配置密码:
[root@server1 master.d]# useradd -s /sbin/nologin saltapi
[root@server1 master.d]# passwd saltapi
重启master服务并启动salt-api服务:
[root@server1 master.d]# systemctl restart salt-master.service
[root@server1 master.d]# systemctl start salt-api.service
启动后8000端口以开启:
[root@server1 master.d]# netstat -antlup | grep 8000
\tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 21157/salt-api
tcp 0 0 127.0.0.1:53016 127.0.0.1:8000 TIME_WAIT -
获取认证token:
[root@server1 master.d]# curl -sSk https://localhost:8000/login -H 'Accept: application/x-yaml' -d username=saltapi -d password=redhat -d eauth=pam
return:
- eauth: pam
expire: 1589864868.838355
perms:
- .*
- '@wheel'
- '@runner'
- '@jobs'
start: 1589821668.838354
token: 738aea2609580fdf80011eaa0794657016a29a4b
user: saltapi
在返回的信息中包含我们需要的token。
测试推送任务:
[root@server1 master.d]# curl -sSk https://localhost:8000 \
> -H 'Accept: application/x-yaml' \
> -H 'X-Auth-Token: 738aea2609580fdf80011eaa0794657016a29a4b'\
> -d client=local \
> -d tgt='*' \
> -d fun=test.ping
return:
- server2: true
server3: true
命令中token为上各命令的返回值,从返回值可以看出salt-api配置成功。
测试其他命令:
[root@server1 master.d]# curl -sSk https://localhost:8000 -H 'Accept: application/x-yaml' -H 'X-Auth-Token: 738aea2609580fdf80011eaa0794657016a29a4b' -d client=local -d tgt='*' -d fun=cmd.run -d arg=hostname
return:
- server2: server2
server3: server3
也可以调用state模块:
[root@server1 master.d]# curl -sSk https://localhost:8000 -H 'Accept: application/x-yaml' -H 'X-Auth-Token: 738aea2609580fdf80011eaa0794657016a29a4b' -d client=local -d tgt='*' -d fun=state.sls -d arg=keepalived
也可以基于这个api开发自动化运维系统(github上有现成的项目,搜索oms)。