如何通过 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-ssh
将 Saltfile
中的 config_dir
添加到 opts
字典以解析 master
配置文件,但 SSHClient
直接读取传递给构造函数的配置文件,并且 config_dir
没有添加到选项中(导致找不到花名册文件)。
我的解决方案是在 master
配置文件中也包含 config_dir
。 问题中的代码将保持不变。
方案一:如果你只有一个Salt配置,也可以设置环境变量SALT_CONFIG_DIR
.
方案二: SSHClient
的mopts
参数可以用来传递自定义配置目录,但需要多行代码:
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)
我在 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-ssh
将 Saltfile
中的 config_dir
添加到 opts
字典以解析 master
配置文件,但 SSHClient
直接读取传递给构造函数的配置文件,并且 config_dir
没有添加到选项中(导致找不到花名册文件)。
我的解决方案是在 master
配置文件中也包含 config_dir
。 问题中的代码将保持不变。
方案一:如果你只有一个Salt配置,也可以设置环境变量SALT_CONFIG_DIR
.
方案二: SSHClient
的mopts
参数可以用来传递自定义配置目录,但需要多行代码:
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)