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先执行语法验证,验证通过后发送到minionminion收到Msater的状态文件默认保存在/var/cache/salt/minion
  • salt-sshsalt-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需要一个名单系统来确定哪些执行目标,Salt0.17.0版本中salt-ssh引入roster系统
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
posted @ 2020-08-25 13:08  EverEternity  阅读(219)  评论(0编辑  收藏  举报