Python 带有漂亮汤的自定义 nagios 脚本 - 得到 "NRPE: Unable to read output"
Python custom nagios script with beautiful soup - getting "NRPE: Unable to read output"
我正在尝试创建自定义 python 2 nagios 脚本,以便能够监控单个起搏器资源。
当它从文件读取输入时,我设法让它工作,但当从 cli 收集输入时,我无法让它工作。
这样就可以了:
from __future__ import print_function
from bs4 import BeautifulSoup
import os,sys
with open ("/tmp/crm_output.txt","r") as f:
#with os.popen ("/usr/sbin/crm_mon -r -X") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'lxml')
resource_status = soup.find("resource").attrs["role"]
resource_name = soup.find("resource").attrs["id"]
if resource_status == "Started":
print("The status of " +resource_name + " is " + resource_status)
sys.exit(0)
elif resource_status == "Stopped" or resource_status == "Stopped (disabled)":
print("The status of " +resource_name + " is " + resource_status)
sys.exit(1)
elif resource_status == "Failed":
print("The status of " +resource_name + " is " + resource_status)
sys.exit(2)
else:
print("The status of " +resource_name + " is " + "UNKNOWN")
sys.exit(3)
但是如果我取消注释这一行:
with os.popen ("/usr/sbin/crm_mon -r -X") as f:
让它从 cli 读取输入,它给了我 NRPE:unable 来读取输出
有趣的是,当我 运行 目标服务器本地脚本时,它始终给我正确的输出。
像这样:
[root@lb-01 tmp]# /usr/lib64/nagios/plugins/check_pacemaker.py
The status of api-lb-ip is Started
我怀疑我读取命令输出的方式有问题,但无法弄清楚。有什么建议可以在哪里查找更多详细信息?
这可能是您在远程服务器上执行脚本的远程用户的问题。
默认行为是只有 root
可以 运行 集群命令。
您可以将命令 /usr/sbin/crm_mon -r -X
添加到 /etc/sudoers
,例如:
nrpe ALL=(ALL) NOPASSWD: /usr/sbin/crm_mon -r -X
将 nrpe
替换为您的远程用户。
您还需要编辑 Python 脚本并在命令前添加 sudo
:
with os.popen ("sudo /usr/sbin/crm_mon -r -X") as f:
希望对您有所帮助。
我正在尝试创建自定义 python 2 nagios 脚本,以便能够监控单个起搏器资源。 当它从文件读取输入时,我设法让它工作,但当从 cli 收集输入时,我无法让它工作。
这样就可以了:
from __future__ import print_function
from bs4 import BeautifulSoup
import os,sys
with open ("/tmp/crm_output.txt","r") as f:
#with os.popen ("/usr/sbin/crm_mon -r -X") as f:
contents = f.read()
soup = BeautifulSoup(contents, 'lxml')
resource_status = soup.find("resource").attrs["role"]
resource_name = soup.find("resource").attrs["id"]
if resource_status == "Started":
print("The status of " +resource_name + " is " + resource_status)
sys.exit(0)
elif resource_status == "Stopped" or resource_status == "Stopped (disabled)":
print("The status of " +resource_name + " is " + resource_status)
sys.exit(1)
elif resource_status == "Failed":
print("The status of " +resource_name + " is " + resource_status)
sys.exit(2)
else:
print("The status of " +resource_name + " is " + "UNKNOWN")
sys.exit(3)
但是如果我取消注释这一行:
with os.popen ("/usr/sbin/crm_mon -r -X") as f:
让它从 cli 读取输入,它给了我 NRPE:unable 来读取输出
有趣的是,当我 运行 目标服务器本地脚本时,它始终给我正确的输出。 像这样:
[root@lb-01 tmp]# /usr/lib64/nagios/plugins/check_pacemaker.py
The status of api-lb-ip is Started
我怀疑我读取命令输出的方式有问题,但无法弄清楚。有什么建议可以在哪里查找更多详细信息?
这可能是您在远程服务器上执行脚本的远程用户的问题。
默认行为是只有 root
可以 运行 集群命令。
您可以将命令 /usr/sbin/crm_mon -r -X
添加到 /etc/sudoers
,例如:
nrpe ALL=(ALL) NOPASSWD: /usr/sbin/crm_mon -r -X
将 nrpe
替换为您的远程用户。
您还需要编辑 Python 脚本并在命令前添加 sudo
:
with os.popen ("sudo /usr/sbin/crm_mon -r -X") as f:
希望对您有所帮助。