Python 获取有关 RAM 在主机内部工作但作为 Rundeck 作业失败的硬件信息的脚本

Python script that get HW info about RAM working inside host but fails as a Rundeck Job

我有一个自定义 python 脚本,用于收集有关服务器主机的硬件(CPU、RAM 等)的信息(容量、供应商、制造商等),并转储该信息在 json 格式的输出文件中(即 memory_info.json - 稍后由另一个脚本用于其他用途)。在这种情况下,脚本使用 python subprocess in order to call external programs like "inxi"

在各种主机(不同的 OS、archs 等)中进行了一些测试后,它似乎工作正常,所以我决定配置它,以便 运行 作为 Rundeck 作业(对于中央管理目的)。 运行deck 作业非常简单,它只是按以下方式执行脚本:

sshpass -p ${RD_OPTION_SERVERPASSWORD} ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -q -t root@${RD_OPTION_SERVERIPADDRESS} "python3 /tmp/hw_inxi.py"

问题来了:

将其作为 运行deck 作业执行,我得到以下回溯:

Traceback (most recent call last):
  File "/tmp/hw_inxi.py", line 53, in <module>
    "--output-file", "print", "--output", "json"]).strip().decode()
  File "/usr/lib/python3.7/subprocess.py", line 395, in check_output
    **kwargs).stdout
  File "/usr/lib/python3.7/subprocess.py", line 487, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['inxi', '-xxxm', '--output-file', 'print', '--output', 'json']' returned non-zero exit status 1.
Result: 1
Failed: NonZeroResultCode: Result code was 1
Execution failed: 2541 in project server_setup: [Workflow result: , step failures: {1=Dispatch failed on 1 nodes: [RUNDECK_SERVER: NonZeroResultCode: Result code was 1 + {dataContext=MultiDataContextImpl(map={ContextView(node:RUNDECK_SERVER)=BaseDataContext{{exec={exitCode=0}}}, ContextView(step:1, node:RUNDECK_SERVER)=BaseDataContext{{exec={exitCode=0}}}}, base=null)} ]}, Node failures: {RUNDECK_SERVER=[NonZeroResultCode: Result code was 1 + {dataContext=MultiDataContextImpl(map={ContextView(node:RUNDECK_SERVER)=BaseDataContext{{exec={exitCode=0}}}, ContextView(step:1, node:RUNDECK_SERVER)=BaseDataContext{{exec={exitCode=0}}}}, base=null)} ]}, status: failed]

Inxi 已在目标机器上安装并正确配置,二进制权限似乎没问题。我的脚本 运行 非常好,服务器内部没有错误,当它作为 运行deck 作业(Rundeck 版本 3.3.10)执行时出现问题。

脚本中的相关代码片段如下所示:

inxi_mem = subprocess.check_output(["inxi", "-xxxm", "--output-file", "print", "--output", "json"]).strip().decode()
memory_list = json.loads(inxi_mem)

关于谁可能是罪魁祸首或如何解决上述问题的任何想法?

(p.s。对不起,如果我忘记了什么,这是我的第一个问题)

您正在使用作业步骤连接到远程节点,一个好的方法是:

  1. model source 中配置您的远程节点。

  2. 然后,在作业中,在命令步骤中调用脚本 dispatching 作业到您的节点。

我故意使用作业步骤连接到远程主机,因为这是使用第二个脚本和第一个脚本从我的 Rundeck 服务器中收集的硬件数据的唯一方法。

问题似乎与环境变量有关,已通过在 issue 中提到的 inxi 命令中添加“--tty”选项解决。 subprocess 命令现在看起来像下面一样,并且很有魅力。

inxi_mem = subprocess.check_output(["inxi", "--tty", "-xxxm", "--output-file", "print", "--output", "json"]).strip().decode()
memory_list = json.loads(inxi_mem)