salt引入强大的消息队列作为通信传输机制,有些时候我们需要老旧的工具才更具有效果--salt ssh。

官方文档https://docs.saltstack.com/en/latest/topics/ssh/index.html

salt设计目标是一次就可以联系数量庞大的远程主机,而ssh(安全shell是Secure shell缩写)每次只允许一台主机交互。

salt-ssh使用步骤:

1.Roster(花名册)建立:

传统salt基础设施中,由minions主动链接master,master并不会存储minion的网络和主机配置。而基于ssh链接时,这个规则就需要改变,因为master必须通过ssh去链接他的minion。

Roster就是用来保存minion id和ip的。

Roster是纯文本文档,存储在/etc/salt/roster中。可以通过salt-ssh --roster-file=/etc/salt/roster '*' test.ping改变roster路径。

roster文件可增加内容有以下:

id:minion唯一标识
host:主机名称
port:ssh端口(默认22,非标准安装请指定端口)
user:运行salt-ssh的默认用户是root
passwd:使用密码认证
sudo:特权用户执行命令,默认False。
priv:带私钥访问minion,可通过指定路径选择密钥
timeout:等待ssh连接建立最大秒数
thin_dir: minion的salt thin agent安装目录

我个人的设置很简单

[root@Management-Machine-140 ~]# cat /etc/salt/roster
136: 192.168.146.136
137: 192.168.146.137
138:
  host: 192.168.146.138
  user: root
  port: 22
  passwd: 111111
  timeout: 5
[root@Management-Machine-140 ~]#


其他内置roster

scan动态定义主机和连接参数,需要在salt-ssh --roster=scan指定roster

[root@Management-Machine-140 ~]# salt-ssh --roster=scan 192.168.146.0/24 test.ping
192.168.146.139:    #未将sshkey中存储在ssh key agent中。
    ----------
    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.146.139 (192.168.146.139)' can't be established.
        RSA key fingerprint is 6e:c2:82:f9:9b:dc:b6:21:8f:9f:9f:55:59:4e:72:6f.
        Are you sure you want to continue connecting (yes/no)?
192.168.146.136:
    True
192.168.146.137:
    True
192.168.146.138:
    True
[root@Management-Machine-140 ~]#

cache,当minion无法响应时,可以使用salt-ssh --roster cache 136 service.start salt-minion排错。

[root@Management-Machine-140 ~]# salt-ssh --roster cache 136 service.start salt-minion

cloud,与cache类似

ansible ssh自动化平台,可自行学习


使用salt-ssh,匹配target有Glob(默认)、Perl正则-E、列表-L、Grains -G、NodeGroup -N组名、Range  -R

-r 指定执行命令

-i 连接时忽略keys

[root@Management-Machine-140 ~]# salt-ssh '*'  -r 'tail -1 /var/log/dmesg'
137:
    ----------
    retcode:
        0
    stderr:
    stdout:
        SELinux: initialized (dev binfmt_misc, type binfmt_misc), uses genfs_contexts
138:
    ----------
    retcode:
        0
    stderr:
    stdout:
        SELinux: initialized (dev binfmt_misc, type binfmt_misc), uses genfs_contexts
136:
    ----------
    retcode:
        0
    stderr:
    stdout:
        SELinux: initialized (dev binfmt_misc, type binfmt_misc), uses genfs_contexts
[root@Management-Machine-140 ~]#