如何通过 Python API 调用 salt-ssh (SSHClient)

How to call salt-ssh (SSHClient) via Python API

我在 Python 3 虚拟环境中安装了 Salt,并创建了一个 Salt 配置,该配置对所有内容都使用非根文件夹 (/home/user/saltenv)。在 venv 中使用 salt-ssh 命令时,例如salt-ssh '*' test.ping,一切正常。 (请注意,配置目录是通过 Saltfile 解析的,因此省略了 -c 选项,但这无关紧要。)

然而,当通过 Python 直接调用 SSHClient 时,我没有得到任何结果。我已经发现花名册文件没有被读取,显然导致了一个空的目标列表。我不知何故被卡住了,documentation 没有那么有用。

代码如下:

import salt.config
from salt.client.ssh.client import SSHClient

def main():
    c_path = '/home/user/saltenv/etc/salt/master'
    master_opts = salt.config.client_config(c_path)

    c = SSHClient(c_path=c_path, mopts=master_opts)
    res = c.cmd(tgt='*', fun='test.ping')
    print(res)

if __name__ == '__main__':
    main()

看起来,某些选项的处理在 CLI 和客户端之间是不同的。 salt-ssh 不使用 SSHClient。而是直接使用class salt.client.ssh.SSH

虽然 salt-sshSaltfile 中的 config_dir 添加到 opts 字典以解析 master 配置文件,但 SSHClient直接读取传递给构造函数的配置文件,并且 config_dir 没有添加到选项中(导致找不到花名册文件)。

我的解决方案是在 master 配置文件中也包含 config_dir 问题中的代码将保持不变。

方案一:如果你只有一个Salt配置,也可以设置环境变量SALT_CONFIG_DIR.

方案二: SSHClientmopts参数可以用来传递自定义配置目录,但需要多行代码:

config = '/home/user/saltenv/etc/salt/master'
defaults = dict(salt.config.DEFAULT_MASTER_OPTS)
defaults['config_dir'] = os.path.dirname(config)
master_opts = salt.config.client_config(config, defaults=defaults)
c = SSHClient(mopts=master_opts)