我有一个定制的python脚本,它收集关于服务器主机的硬件(CPU、RAM等)的信息(容量、供应商、制造商等),并将这些信息转储到json格式化的输出文件(即memory_info.json --后来被另一个脚本用于其他东西)中。在本例中,脚本使用python 子过程来调用外部程序(如“因西” )。
在各种主机(不同的操作系统、archs等)中进行了一些测试之后,它似乎工作得很好,所以我决定对它进行配置,以便作为运行程序(用于中央管理目的)运行。运行程序任务非常简单,它只是以以下方式执行脚本:
sshpass -p ${RD_OPTION_SERVERPASSWORD} ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -q -t root@${RD_OPTION_SERVERIPADDRESS} "python3 /tmp/hw_inxi.py"
问题来了:
将其作为运行程序作业执行,将得到以下跟踪:
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已在目标计算机中安装和正确配置,二进制权限似乎可以。我的脚本运行得非常好,没有服务器内部的错误,当它作为运行程序作业执行时就会出现问题(RundeceVersion3.3.10)。
脚本中的相关代码片段如下所示:
inxi_mem = subprocess.check_output(["inxi", "-xxxm", "--output-file", "print", "--output", "json"]).strip().decode()
memory_list = json.loads(inxi_mem)关于谁可能是罪魁祸首或如何解决上述问题,有什么想法吗?
(p.s.对不起,如果我忘了什么,这是我的第一个问题)
发布于 2021-07-30 08:06:02
我正在使用作业步骤来连接远程主机,因为这是使用第二个脚本和第一个脚本收集的硬件数据的唯一方法,这些数据来自我的Rundeck服务器。
这个问题似乎与环境变量有关,它是通过在inxi命令中添加“-tty”选项来解决的,就像这个问题中提到的那样。子进程命令现在看起来像下面的样子,并且工作起来很有魅力。
inxi_mem = subprocess.check_output(["inxi", "--tty", "-xxxm", "--output-file", "print", "--output", "json"]).strip().decode()
memory_list = json.loads(inxi_mem)发布于 2021-07-29 22:42:53
您正在使用作业步骤连接到远程节点,一个很好的方法是:
https://stackoverflow.com/questions/68498116
复制相似问题