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

2024-09-28 05:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个自定义python脚本,它收集服务器主机硬件(CPU、RAM等)的信息(容量、供应商、制造商等),并将这些信息转储到json格式的输出文件中(即memory_info.json-稍后由另一个脚本用于其他用途)。在本例中,该脚本使用python subprocess来调用像"inxi"这样的外部程序

在各种主机(不同的操作系统、ARCH等)中进行了一些测试之后,它似乎工作得很好,因此我决定对其进行配置,以便作为Rundeck作业运行(用于中央管理目的)。rundeck作业非常简单,它仅以以下方式执行脚本:

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

问题来了:

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

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已在目标计算机中安装并正确配置,二进制权限似乎正常。我的脚本在服务器中运行得很好,没有任何错误,当它作为rundeck作业(rundeck版本3.3.10)执行时,就会出现问题

下面可以看到脚本中的相关代码段:

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

关于谁可能是罪魁祸首或如何排除上述问题,您有何想法

(请注意,如果我忘了什么,很抱歉,这是我的第一个问题)


Tags: inpy脚本nodejsonoutputserver作业
2条回答

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

这个问题似乎与环境变量有关,它是通过在inxi命令中添加“tty”选项解决的,如本issue中所述。现在,subprocess命令如下所示,并像一个符咒一样工作

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

如果要使用作业步骤连接到远程节点,一个好方法是:

  1. model source中配置远程节点

  2. 然后,在作业中,在命令步骤中调用脚本dispatching将作业发送到节点

相关问题 更多 >

    热门问题