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

时间:2018-03-27 10:41:41

标签: python salt salt-stack

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

然而,当通过Python直接调用download时,我没有得到任何结果。我已经发现没有读取名单文件,显然会导致空目标列表。我被卡住了,documentation没有用。

以下是代码:

<a download href=' + fileURL + '>' + document_actual_name + '</a>

1 个答案:

答案 0 :(得分:1)

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

虽然salt-sshconfig_dirSaltfile添加到opts词典以解析master配置文件,但SSHClient会将config_dir读取配置文件直接传递给构造函数,config_dir未添加到选项中(导致找不到名册文件)。

我的解决方案是在master配置文件中加入SALT_CONFIG_DIR问题中的代码将保持不变。

备选方案1:如果您只有一个Salt配置,也可以设置环境变量mopts

备选方案2: SSHClient的{​​{1}}参数可用于传递自定义配置目录,但需要更多代码行:

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)