通过ssh执行salt命令和状态,而无需安装salt-minion。
Salt SSH非常易于使用,只需设置一个系统的roster基本名册文件即可以类似于标准salt
命令的方式连接并运行salt-ssh
命令。
- Salt ssh从2014.7.0版开始具备了投入生产环境使用的条件
- 在远程目标系统上需要安装有Python(除非使用
-r
选项发送原始ssh命令) - 在许多系统上,
salt-ssh
可执行文件将位于其自己的程序包中,包名通常为salt-ssh
; - Salt SSH系统不会取代标准的Salt通信系统,它只是提供了一个基于SSH的替代方案,不需要ZeroMQ和远程代理。请注意,由于与Salt SSH的所有通信都是通过SSH执行的,因此它比带有ZeroMQ的标准Salt实现慢得多。
- 目前,必须对文件服务器操作做额外的包装,以确保使用salt-ssh命令传递相关文件。状态模块是一个例外,它将编译在master服务器上运行的状态,并在该过程中查找对
salt://
路径的所有引用,并将这些文件复制到与状态运行相同的tarball中。此外,所需的文件服务器包装程序仍在开发中。
Salt的roster(花名册)系统可轻松定义远程minions。
注
查看roster以了解更多的细节。
创建一个简单的 roster 文件, 默认的位置路径是 /etc/salt/roster
:
web1: 192.168.42.1
上面是一个非常基本的roster文件,其中将Salt ID分配给IP地址。 我们可以创建更详细的名册:
web1:
host: 192.168.42.1 # The IP addr or DNS hostname
user: fred # Remote executions will be executed as user fred
passwd: foobarbaz # The password to use for login, if omitted, keys are used
sudo: True # Whether to sudo to root, not enabled by default
web2:
host: 192.168.42.2
注
只有在/etc/sudoers中为用户设置了NOPASSWD时,sudo才起作用:
fred ALL =(ALL) NOPASSWD:ALL
默认情况下,salt-ssh
将为ssh生成密钥对,默认路径为/etc/salt/pki/master/ssh/salt-ssh.rsa
。 首次运行salt-ssh
时会生成密钥。
您可以使用ssh-copy-id
(OpenSSH密钥部署工具)将密钥部署到服务器。
ssh-copy-id -i /etc/salt/pki/master/ssh/salt-ssh.rsa.pub [email protected]
也可以写成一个简单的shell脚本, 像下面 salt-ssh-copy-id.sh 这样:
#!/bin/bash
if [ -z $1 ]; then
echo $0 [email protected]
exit 0
fi
ssh-copy-id -i /etc/salt/pki/master/ssh/salt-ssh.rsa.pub $1
注意:确保使用chmod + x salt-ssh-copy-id.sh。
Be certain to chmod +x salt-ssh-copy-id.sh.
./salt-ssh-copy-id.sh [email protected]
./salt-ssh-copy-id.sh [email protected]
成功部署密钥后,即可使用salt-ssh对其进行控制。
另外,可以通过将priv
设置为 agent-forwarding
来使用ssh代理转发。
注意
salt-ssh
on RHEL/CentOS 5
salt-ssh
命令至少需要python 2.6,默认情况下未在RHEL/CentOS 5上安装python 2.6。在这种情况下,一种简单的解决方法是使用-r
选项运行安装python2.6的原始shell命令:salt-ssh centos-5-minion -r 'yum -y install epel-release ; yum -y install python26'
注意
salt-ssh
on systems with Python 3.xSalt在2017.7.0发行版之前是不支持Python 3.x的,这是一个默认设置,例如使用广泛的16.04 LTS发行版Ubuntu。 对于这种情况,一个简单的解决方法是使用
-r
选项,类似于上面的示例:
salt-ssh ubuntu-1604-minion -r 'apt update ; apt install -y python-minimal'
这时就可以轻松使用salt-ssh命令了:
salt-ssh '*' test.version
具有salt-ssh的命令遵循与salt命令相同的语法。
可以使用标准的Salt功能! 输出也与salt相同,并且有许多相同的参数标志可用。 有关所有可用选项,请参见http://docs.saltstack.com/ref/cli/salt-ssh.html。
默认情况下,salt-ssh
在远程系统上运行Salt的执行模块,但是salt-ssh
也可以执行原始shell命令:
salt-ssh '*' -r 'ifconfig'
Salt State系统也可以与salt-ssh
一起使用。 状态系统为salt-ssh
提供的抽象接口实现与使用标准salt时的接口相同。 目的是让那些为标准Salt
定义的Salt Formulas公式与Salt-ssh
无缝配合,反之亦然。
通过简单地将Salt
命令替换为salt-ssh
,即可实现切换为不同的方式执行标准的Salt State功能。
由于目标minions定位的方法在salt-ssh中的实现有所不同,所以在撰写本文时仅支持glob和regex目标,因此仍然需要继续实现其余目标系统。
注意
默认情况下,虽然可以通过
salt-ssh
设置grains。但是,这些grains将不会在系统重新启动后继续存在。有关更多详细信息,请参见roster文档中的"thin_dir"设置。
Salt SSH从master配置文件获取其配置信息。 通常,此文件位于/etc/salt/master
中。 如果希望使用自定义的配置文件,Salt SSH的-c
选项可以方便地传递目录以在内部查找名为master
的配置文件。
New in version 2015.5.1.
可以使用master配置选项ssh_minion_opts
对全局性的Minion配置选项进行定义。 也可以使用roster名册中的minion_opts
参数基于每个minion进行定义。
默认情况下,Salt从/etc/salt/
中读取所有配置。 如果您以普通用户身份运行Salt SSH,则必须修改某些路径,否则将收到"权限拒绝"的消息。 您必须修改两个参数:pki_dir
和cachedir
。 这些应该指向用户可写的完整路径。
建议不要为此目的修改/etc/salt
。 而是为用户创建/etc/salt的私有副本,并使用-c /new/config/path
运行salt-ssh命令。
如果通常将CLI选项传递给salt-ssh
,则可以创建Saltfile
来自动使用这些选项。 需要在同一服务器上管理多个不同的Salt项目时,这是很常见的。
因此,您可以cd
进入一个包含Saltfile
文件的目录,其中包含以下YAML内容:
salt-ssh:
config_dir: path/to/config/dir
ssh_log_file: salt-ssh.log
ssh_max_procs: 30
ssh_wipe: True
此时,就不必调用
salt-ssh --config-dir = path/to/config/dir --max-procs = 30 --wipe \* test.version
,而是可以直接调用salt-ssh \* test.version
。
布尔样式的选项应在其中使用YAML表示指定。
注意
指定的选项键必须与解析器
salt.utils.parsers.SaltSSHOptionParser
中指定的选项的目标属性匹配。 例如,在使用--wipe
命令行选项的情况下,其dest
配置为ssh_wipe
,因此应在Saltfile
中进行配置。 使用此选项的标志名称进行wipe: True
或w: True
,将不起作用。
注意
为了能够自动检测到Saltfile,需要将其命名为Saltfile,并使用大写字母S,并且可由运行salt-ssh的用户读取。
最后,您还可以创建〜/.salt/Saltfile,默认情况下salt-ssh将自动加载它。
调试salt-ssh
的一种常用方法是简单地使用salt传输到远程计算机的压缩包,然后直接调用salt-call
。
要确定salt-call
的位置,只需使用-ltrace
标志运行salt-ssh并查找包含字符串SALT_ARGV
的行。 它包含salt-ssh
尝试执行的salt-call
命令。
建议您通过删除-l quiet
,--metadata
和--output json
稍微修改一下此命令,以更好地了解目标系统的运行状况。
Salt名册是在Salt 0.17.0中添加的可插拔系统,以简化Salt-ssh
系统的使用。 之所以创建名册系统,是因为salt-ssh
需要一种方法来识别需要针对哪些系统执行。
注意:无需在标准Salt系统中使用名册系统,因为Master初始设计思想是不需要知道目标系统,Salt Minion会将自身登记到Master中。
由于花名册系统是可插拔的,因此可以轻松进行扩充以连接到任何现有系统,以收集当前有哪些服务器可用以及可以使用salt-ssh
进行管理控制。 默认情况下,名册文件位于/etc/salt/roster
中。
名册系统会编译出一个内部称为 targets
的数据结构。 targets
是一个目标系统的列表和有关如何连接到所述这些系统的属性信息。 Salt中的名册模块的唯一要求是返回 targets
数据结构。
可以存储在一个roster target中的信息如下:
<Salt ID>: # The id to reference the target system with
host: # The IP address or DNS name of the remote host
user: # The user to log in as
passwd: # The password to log in with
# Optional parameters
port: # The target system's ssh port number
sudo: # Boolean to run command via sudo
sudo_user: # Str: Set this to execute Salt as a sudo user other than root.
# This user must be in the same system group as the remote user
# that is used to login and is specified above. Alternatively,
# the user must be a super-user.
tty: # Boolean: Set this option to True if sudo is also set to
# True and requiretty is also set on the target system
priv: # File path to ssh private key, defaults to salt-ssh.rsa
# The priv can also be set to agent-forwarding to not specify
# a key, but use ssh agent forwarding
priv_passwd: # Passphrase for ssh private key
timeout: # Number of seconds to wait for response when establishing
# an SSH connection
minion_opts: # Dictionary of minion opts
thin_dir: # The target system's storage directory for Salt
# components. Defaults to /tmp/salt-<hash>.
cmd_umask: # umask to enforce for the salt-call command. Should be in
# octal (so for 0o077 in YAML you would do 0077, or 63)
Master配置中的roster_defaults词典用于为名册中的minions设置默认登录变量,这样就不需要将相同的参数与命令行参数一起传递。
roster_defaults:
user: daniel
sudo: True
priv: /root/.ssh/id_rsa
tty: True
Salt需要将一个独立的软件运行环境上传到目标系统,该环境在默认情况下部署于/tmp/salt-<hash>
。 该目录下的内容会受系统对临时文件管理的影响,比如会定时清理掉。
如果需要一个持久的Salt环境,例如设置持久化的grains信息,则需要更改此值。