【问题标题】:How to call salt-ssh (SSHClient) via Python API如何通过 Python API 调用 salt-ssh (SSHClient)
【发布时间】:2018-09-05 17:42:25
【问题描述】:

我在 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()

【问题讨论】:

    标签: python salt salt-stack


    【解决方案1】:

    CLI 和客户端对某些选项的处理似乎有所不同。 salt-ssh 不使用 SSHClient。而是直接使用 salt.client.ssh.SSH 类。

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

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

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

    方案2: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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2013-03-22
      • 1970-01-01
      • 2016-05-23
      • 2021-08-03
      相关资源
      最近更新 更多