我在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>
答案 0 :(得分:1)
看起来,CLI和客户端之间的某些选项的处理有所不同。 salt-ssh
不使用SSHClient
。而是直接使用类salt.client.ssh.SSH
。
虽然salt-ssh
将config_dir
从Saltfile
添加到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)