NRPE Python脚本输出错误
我的任务是制作一个自定义python脚本,因为我不擅长在远程NRPE客户端上运行Bash,该客户端递归地计算/tmp目录中的文件数。这是我的剧本:NRPE Python脚本输出错误,python,nagios,nrpe,Python,Nagios,Nrpe,我的任务是制作一个自定义python脚本,因为我不擅长在远程NRPE客户端上运行Bash,该客户端递归地计算/tmp目录中的文件数。这是我的剧本: #!/usr/bin/python3.5 import os import subprocess import sys file_count = sum([len(files) for r, d, files in os.walk("/tmp")]) #Recursive check of /tmp if file_count < 10
#!/usr/bin/python3.5
import os
import subprocess
import sys
file_count = sum([len(files) for r, d, files in os.walk("/tmp")]) #Recursive check of /tmp
if file_count < 1000:
x = subprocess.Popen(['echo', 'OK -', str(file_count), 'files in /tmp.'], stdout=subproce$
print(x.communicate()[0].decode("utf-8")) #Converts from byteobj to str
# subprocess.run('exit 0', shell=True, check=True) #Service OK - exit 0
sys.exit(0)
elif 1000 <= file_count < 1500:
x = subprocess.Popen(['echo', 'WARNING -', str(file_count), 'files in /tmp.'], stdout=sub$
print(x.communicate()[0].decode("utf-8")) #Converts from byteobj to str
sys.exit(1)
else:
x = subprocess.Popen(['echo', 'CRITICAL -', str(file_count), 'files in /tmp.'], stdout=su$
print(x.communicate()[0].decode("utf-8")) #Converts from byteobj to str
sys.exit(2)
我在nagios服务器上编辑了这个/usr/local/nagios/etc/servers/testserver.cfg文件,如下所示:
define service {
use generic-service
host_name wp-proxy
service_description Files in /tmp
check_command check_nrpe!check_tmp
}
输出:
正确的输出是:OK-在/tmp中有3个文件
当我以root用户身份在客户机上运行脚本时,得到了正确的输出
当我以nagios用户的身份在客户机上运行脚本时,我得到了正确的输出
我在Nagios core上的输出似乎正常工作,但当我知道有更多文件时,它显示/tmp中有0个文件。我在客户机上创建了2个文件,在nagios服务器上创建了1个文件。
用于参考的服务器输出:
忽略底层服务器,使用wp代理解决的任何问题也将在wpreess-gkanc1上更改
编辑2:我在nagios服务器上运行了以下操作:
/usr/local/nagios/libexec/check_nrpe -H 192.168.1.59 -c check_tmp_folder
我确实得到了一个0文件返回。但是,我仍然不知道如何修复此问题。systemd服务文件,可能此变量设置为true: PrivateTmp=接受一个布尔参数。如果为true,则为已执行的进程设置一个新的文件系统命名空间,并在其中装载私有/tmp和/var/tmp目录,这些目录不由命名空间之外的进程共享 这有助于确保对进程临时文件的访问安全,但不可能通过/tmp或/var/tmp在进程之间共享。如果启用此选项,则服务停止后,将删除这些目录中由服务创建的所有临时文件。默认为false。通过使用JoinsNamespaceOf=指令,可以在相同的private/tmp和/var/tmp命名空间中运行两个或多个单元,有关详细信息,请参阅systemd.unit5 如果设置了DynamicUser=则暗示此设置。对于此设置,与ReadOnlyPath=和相关调用相同的装载传播和权限限制适用,请参见上文。启用此设置的副作用是在访问/tmp和/var/tmp所需的所有装载单元上添加Requires=和After=依赖项 此外,还添加了systemd-tmpfiles-setup.service8上的隐式After=排序。请注意,此设置的实现可能是不可能的,例如,如果装载名称空间不可用,那么该单元的写入方式不应仅依赖此设置来实现安全性。已解决 解决方案: 转到您的systemd文件以获取nrpe。我是在这里发现的:
/lib/systemd/system/nrpe.service
如果没有,请运行:
find / -name "nrpe.service"
并忽略所有system.slice结果
用vi/nano打开文件
找到一行,上面写着PrivateTmp=通常是倒数第二行
如果设置为true,则将其设置为false
保存并退出文件,然后运行以下2个命令:
daemon-reload
restart nrpe.service
问题解决了
简要说明:这个问题的主要原因是,对于Debian9.x,一些使用systemd的进程在默认情况下强制使用私有tmp目录。因此,如果您有任何其他程序在/tmp中存在搜索或索引问题,可以根据需要定制此解决方案。nagios用户或正在运行的用户NRPE是否具有读取目录的权限?您能否在远程服务器上以用户身份运行脚本并获得预期结果?su-nagios-c/usr/local/nagios/libexec/check_tmp.pyYes,在远程服务器上运行上述命令,我得到了所需的输出/usr/local/nagios/libexec/check_nrpe-H 192.168.1.59-su-nagios-c check_tmp_文件夹,在nagios服务器非主机上运行此命令,给了我错误的输出。当我用-su roots替换-su nagios时,它甚至给了我错误的输出。以答案开头很好,但是请格式化它,使其可读。
daemon-reload
restart nrpe.service