SaltStatic : salt-ssh
salt-ssh
1. salt-ssh 概述
salt在版本0.17.0中,引入了新的传输系统,他支持通过SSH通道来实现salt的通信。通过这种方式,我们可以直接通过SSH在远程主机上执行使用saltsatck,而不需要在远程主机上安装salt-minion,同时又能支持saltstack的大部分功能,而且salt-master也不需要运行。因此实现了免客户端登陆的部署和实施。
但是由于无客户端本身的局限性 salt-ssh 并不能完全取代标准的 salt 的通信方式,只是简单的提供了一个基于ssh通道的可选方式,这种方式不需要ZeroMQ和远程客户端的支持;整体的工作流程和基于minion的工作流程大致相同,但通过salt-ssh的执行速度会远远低于ZeroMQ支持的标准的salt通信方式。
salt-ssh执行原理:
salt-ssh
是在salt
基础上打了一个python
包上传到客户端的默认tmp
目录下, 在客户端上面解压并执行返回结果,最后删除tmp
上传的临时文件。salt-minion
方法是salt-mater
先执行语法验证,验证通过后发送到minion
,minion
收到Msater
的状态文件默认保存在/var/cache/salt/minion
salt-ssh
和salt-minion
可以共存,salt-minion
不依赖于ssh
服务
salt-ssh的特点:
- 远程系统需要Python支持,除非使用-r选项发送原始ssh命令
- salt-ssh是一个软件包,需安装之后才能使用,命令本身也是salt-ssh
- salt-ssh不会取代标准的Salt通信系统,它只是提供了一个基于SSH的替代方案,不需要ZeroMQ和agent
由于所有与Salt SSH的通信都是通过SSH执行的,因此它比使用ZeroMQ的标准Salt慢得多
2. salt-ssh管理
salt-ssh
有两种方式实现远程管理,一种是在配置文件中记录所有客户端的信息,诸如 IP 地址、端口号、用户名、密码以及是否支持sudo等;另一种是使用密钥实现远程管理,不需要输入密码。
Roster说明
salt-ssh
需要一个名单系统来确定哪些执行目标,Salt
的0.17.0
版本中salt-ssh
引入roste
r系统
roster
系统编译成了一个数据结构,包含了targets
,这些targets
是一个目标系统主机列表和或如连接到这些targets
。对于一个在salt的Roster模块来说,唯一要求是返回Targets数据结构:
<SaltID>: #目标ID
host: # 远端主机的ip地址或者dns域名
user: # 登录的用户
passwd: # 用户密码,如果不使用此选项,则默认使用秘钥方式
# 可选的部分
port: #ssh端口(不写使用默认的22端口)
sudo: #可以通过sudo
tty: # 如果设置了sudo,设置这个参数为true
priv: # ssh秘钥的文件路径
timeout: # 当建立链接时等待响应时间的秒数
minion_opts: # minion的位置路径
thin_dir: # target系统的存储目录,默认是/tmp/salt-<hash>
cmd_umask: # 使用salt-call命令的umask值
2.1 通过使用用户名密码的SSH实现远程管理
#安装salt-ssh
[root@master ~]# yum -y install salt-ssh
#修改配置文件,添加受控机信息
[root@master ~]# vim /etc/salt/roster
ssh01:
host: 192.168.32.135
user: root
passwd: 123456
测试连通性
[root@master ~]# salt-ssh '*' test.ping
ssh01:
----------
retcode:
254
stderr:
stdout:
The host key needs to be accepted, to auto accept run salt-ssh with the -i flag:
The authenticity of host '192.168.32.135 (192.168.32.135)' can't be established.
ECDSA key fingerprint is SHA256:BFDlHGdhFuhdlBPVKeGY6OhFc/KEMiVvKW1cKrir4uM.
ECDSA key fingerprint is MD5:85:bf:36:c6:8c:13:55:9d:70:d1:77:dc:8e:31:1f:b6.
Are you sure you want to continue connecting (yes/no)?
[root@master ~]#
从上面的信息可以看出,第一次访问时需要输入 yes/no ,但是 saltstack 是不支持交互式操作的,所以为了解决这个问题,有两种方案:
1.系统不进行主机验证
[root@master ~]# vim ~/.ssh/config
StrictHostKeyChecking no
[root@master ~]# salt-ssh '*' test.ping
ssh01:
True
2.加-i
参数自动认证
#删除.ssh/config的配置和.ssh/known_hosts,再次测试时又会要求验证
#这时可以使用-i 参数自动认证
[root@master ~]# salt-ssh '*' test.ping
ssh01:
----------
retcode:
254
stderr:
stdout:
The host key needs to be accepted, to auto accept run salt-ssh with the -i flag:
The authenticity of host '192.168.32.135 (192.168.32.135)' can't be established.
ECDSA key fingerprint is SHA256:BFDlHGdhFuhdlBPVKeGY6OhFc/KEMiVvKW1cKrir4uM.
ECDSA key fingerprint is MD5:85:bf:36:c6:8c:13:55:9d:70:d1:77:dc:8e:31:1f:b6.
Are you sure you want to continue connecting (yes/no)?
#自动认证后就可以正常使用了
[root@master ~]# salt-ssh '*' test.ping -i
ssh01:
True
[root@master ~]# salt-ssh '*' network.interface_ip ens33
ssh01:
192.168.32.135
[root@master ~]# ls .ssh/
config known_hosts
[root@master ~]# cat .ssh/known_hosts
192.168.32.135 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOlT0efgCuE5TLuZqELrU+5pKFmU4v197s7XDV/HPBL28fFvwKT8dD7Vm1vxqPU3x7cvDUpGEp35glmSgmryFUI=
[root@master ~]# cat .ssh/config
[root@master ~]#
salt-ssh
命令参数:
-r, –raw, –raw-shell # 直接使用shell命令
–priv #指定SSH私有密钥文件
–roster #定义使用哪个roster系统,如果定义了一个后端数据库,扫描方式,或者用户自定义的的roster系统,默认的就是/etc/salt/roster文件
–roster-file #指定roster文件
–refresh, –refresh-cache #刷新cache,如果target的grains改变会自动刷新
–max-procs #指定进程数,默认为25
-i, –ignore-host-keys #当ssh连接时,忽略keys
–passwd #指定默认密码
–key-deploy #配置keys 设置这个参数对于所有minions用来部署ssh-key认证,
这个参和–passwd结合起来使用会使初始化部署很快很方便。当调用master模块时,并加上参数 –key-deploy 即可在minions生成keys,下次开始就不使用密码
2.2 通过salt-ssh初始化系统安装salt-minion
安装salt-ssh
[root@master ~]# yum -y install salt-ssh
修改roster配置文件,添加受控主机
[root@master ~]# vim /etc/salt/roster
ssh01:
host: 192.168.32.136
user: root
passwd: 123456
#首次使用,加-i自动认证
[root@master ~]# salt-ssh '*' test.ping -i
ssh01:
True
执行状态命令,初始化系统,安装salt-minion
[root@master ~]# mkdir -p /srv/salt/base/minion/{repo,files}
#拷贝yum源
[root@master ~]# cp /etc/yum.repos.d/salt-3000.repo /srv/salt/base/minion/repo/
#拷贝配置文件
[root@master ~]# cp /etc/salt/minion /srv/salt/base/minion/files/
[root@master ~]# vim /srv/salt/base/minion/files/minion
修改
master: {{ IP }}
id: {{ ID }}
#编写状态文件
[root@master ~]# vim /srv/salt/base/minion/repo/repo.sls
salt-repo:
file.managed:
- name: /etc/yum.repos.d/salt-3000.repo
- source: salt://minion/repo/salt-3000.repo
- user: root
- group: root
- mode: 644
[root@master ~]# vim /srv/salt/base/minion/minion.sls
salt-minion-install:
pkg.installed:
- name: salt-minion
salt-minion-conf:
file.managed:
- name: /etc/salt/minion
- source: salt://minion/files/minion
- user: root
- group: root
- mode: 644
- template: jinja
- context:
IP: 192.168.32.130
ID: {{ grains['ipv4'] [1] }}
- require:
- pkg: salt-minion-install
salt-minion-service:
service.running:
- name: salt-minion
- enable: True
- start: True
- watch:
- file: /etc/salt/minion
#安装
[root@master ~]# salt-ssh '*' state.sls minion.repo.repo
[root@master ~]# salt-ssh '*' state.sls minion.minion
[root@master ~]# salt-ssh '*' cmd.run 'systemctl restart salt-minion'
ssh01:
[root@master ~]# salt-key
Accepted Keys:
192.168.32.135
Denied Keys:
minion-1
Unaccepted Keys:
192.168.32.136
minion-1
Rejected Keys:
[root@master ~]# salt-key -a 192.168.32.136
The following keys are going to be accepted:
Unaccepted Keys:
192.168.32.136
Proceed? [n/Y] y
Key for minion 192.168.32.136 accepted.
[root@master ~]# salt-key
Accepted Keys:
192.168.32.135
192.168.32.136
[root@master ~]# salt '*' test.ping
192.168.32.136:
True
192.168.32.135:
True