salt-ssh
是 0.17.0
新引入的一个功能,不需要用minion即可对客户端进行管理,也可以不需要master
;salt-ssh
也支持salt
大部分的功能:比如grains
,modules
,state
等;salt-ssh
没有使用ZeroMQ
的通信架构,执行是串行模式, salt-ssh 基于sshd服务
salt-ssh执行原理
salt-ssh
是在salt
基础上打了一个python
包上传到客户端的默认 /var/tmp
目录下, 在客户端上面解压并执行返回结果,最后删除/var/tmp
上传的临时文件。salt-minion
方法是salt-mater
先执行语法验证,验证通过后发送到minion
,minion
收到Msater
的状态文件默认保存在/var/cache/salt/minion
salt-ssh
和salt-minion
可以共存,salt-minion
不依赖于ssh
服务
roster
salt-ssh 基于 roster 文件对目标客户端进行操作, 在roster文件内配置需要管理的机器
vim /etc/salt/roster
decive-minion01:
host: 192.168.3.45
user: root
passwd: " "
port: 22
decive-minion02:
host: 192.168.3.83
user: root
passwd: 123456
port: 22
在roster文件中支持以下这些选项:
- host MINION主机的IP地址如果有解析的话主机名也可以
- port 通常是ssh协议默认的22端口,按照需要可以更改
- user 登陆目的主机时的用户
- passwd 对应用户的密码
- sudo 这个选项之后可填’True’或者’False’,为了非特权用户可以执行特权命令,为了sudo时不需要密码,可以通过visudo来修改/etc/sudoers文件来完成
- priv 指定私钥路径
- timeout 指定等待连接完成的最大时间,默认60秒
- thin_dir slat-thin agent的安装目录
当然在salt中也内置其他的roster,可以自己进行指定,例如下面这个命令
salt-ssh --roster=scan 192.168.3.0/24 test.ping
scan 这是一种动态的roster,在客户端对一定范围内的IP地址进行处理请求。在使用的时候,需要连接的所有主机连接信息都必须一致(除了IP地址)
cache
每一个minion的grain会被缓存到Master上,当已经安转过minion的客户端无法响应时,需要进行排错可以使用cache roster进行排错。
例如开启salt-minion服务
使用
说明:使用salt-ssh 命令时需要输入yes或no
进行ssh
认证,salt-ssh不支持交互式输入,所有可以加-i
参数自动认证
salt-ssh "*" state.sls test.mytest
192.168.3.82:
----------
_error:
Failed to return clean data
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.3.82 (192.168.3.82)' can't be established.
ECDSA key fingerprint is SHA256:24aaPJYog2MPXU/wRGIRz7dHWU82mgch6VGT1VFzz90.
Are you sure you want to continue connecting (yes/no)?
加上 -i 参数:
salt-ssh "*" state.sls test.mytest -i
192.168.3.82:
----------
ID: nginx_run
Function: service.running
Name: nginx
Result: True
Comment: The service nginx is already running
Started: 14:16:48.000172
Duration: 52.021 ms
Changes:
Summary for 192.168.3.82
------------
Succeeded: 1
Failed: 0
------------
Total states run: 1
Total run time: 52.021 ms
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,下次开始就不使用密码
python 调用salt-ssh
# pip install salt==3004
import salt.client
from salt.client.ssh.client import SSHClient
def test():
# SSHClient 源码里会到默认的 /etc/salt/master 下读取master文件,若自己更改了master位置,需要将新的位置传入SSHClient
c_path = os.path.join(settings.SALT_CONF, 'etc/salt/master')
master_opts = salt.config.client_config(c_path)
# 看源码要opt字典中药获取roster_file的值,由于我更改了roster的位置,所以将新的位置添加到opt中
master_opts['roster_file'] = os.path.join(settings.SALT_CONF, 'etc/salt/roster')
c = SSHClient(c_path=c_path, mopts=master_opts)
# 建议先读取roster名册是否有内容再执行命令
# res = c.cmd(tgt='*', fun='state.sls', arg=['test.mytest'])
res = c.cmd(tgt='*', fun='test.ping')
# res = c.cmd_iter(tgt='*', fun='test.ping') # 返回生成器
print(res)
if __name__ == '__main__':
test()
输出:
{
'192.168.3.82': {
'jid': '20220424090826076953',
'return': True,
'retcode': 0,
'id': '192.168.3.82',
'fun': 'test.ping',
'fun_args': []
},
'192.168.3.45': {
'jid': '20220424090827635708',
'return': True,
'retcode': 0,
'id': '192.168.3.45',
'fun': 'test.ping',
'fun_args': []
}
}
参考: