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

问题描述

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

在各种主机(不同的操作系统、archs 等)上进行了一些测试后,它似乎工作正常,所以我决定对其进行配置,以便作为 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}}},status: failed]

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

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

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

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

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

解决方法

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

该问题似乎与环境变量有关,通过在此issue 中提到的 inxi 命令中添加“--tty”选项已解决。 subprocess 命令现在如下所示,效果很好。

return (
<main>
<AuthContext.Provider
   value={{
      state,dispatch
   }}
>
   
<Router basename={process.env.PUBLIC_URL}>
    <Switch>
      <Route path="/login" component={Login}/>
      <Route path="/gallery" component={MyComponent} />
      <Route component={Error} />
      <Route exact path="/">
        {!state.isAuthenticated ? <Redirect to="/login" /> : <MyComponent/>}
      </Route>
    </Switch>
</Router>
</AuthContext.Provider>
</main>
);
,

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...