当前位置: 首页 > 工具软件 > Salt > 使用案例 >

saltstack salt-ssh

费凯康
2023-12-01

salt-ssh0.17.0 新引入的一个功能,不需要用minion即可对客户端进行管理,也可以不需要mastersalt-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先执行语法验证,验证通过后发送到minionminion收到Msater的状态文件默认保存在/var/cache/salt/minion
  • salt-sshsalt-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': []
        }
    }

参考:

 SaltStack--使用salt-ssh - 别来无恙- - 博客园

saltstack的SSH使用--Roster的配置使用_parameter_的博客-CSDN博客

 类似资料: