NRPE Python脚本输出错误

时间:2018-08-22 08:57:30

标签: python nagios nrpe

我的任务是制作一个自定义python脚本(因为我对Bash不太满意),使其可以在远程NRPE客户端上运行,该客户端递归计算/ 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 < 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)

编辑1:我尝试将file_count硬编码为1300,并且得到警告-/ tmp中有1300个文件。看来问题仅在于nagios服务器读取客户端计算机/ tmp中文件的能力。

我做了什么:

我在其他目录中都有该脚本。 我已经在客户端计算机上使用以下行编辑了/usr/local/nagios/etc/nrpe.cfg:

  

command [check_tmp] = / usr / local / nagios / libexec / check_tmp.py

我已经在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核心上的输出似乎正在工作,但是当我知道还有更多文件时,它显示/ tmp中有0个文件。我在客户端计算机上制作了2个文件,在nagios服务器上制作了1个文件。

服务器输出以供参考:

https://puu.sh/BioHW/838ba84c3e.png

(忽略底层服务器,使用wp-proxy解决的任何问题也将在wpreess-gkanc1上更改)

编辑2:我在nagios服务器上运行了以下命令: / usr / local / nagios / libexec / check_nrpe -H 192.168.1.59 -c check_tmp_folder

我确实返回了0文件。我仍然不知道如何解决这个问题。

预先感谢

2 个答案:

答案 0 :(得分:0)

系统服务文件,也许此var设置为true:)

PrivateTmp=接受布尔参数。如果为true,则为执行的进程设置一个新的文件系统名称空间,并在其中安装私有的/tmp/var/tmp目录,该目录不被该命名空间之外的进程共享。

这对于保护对进程临时文件的访问很有用,但是使通过/tmp/var/tmp在进程之间共享变得不可能。如果启用此功能,则在停止服务后,将删除由服务在这些目录中创建的所有临时文件。默认为false。通过使用JoinsNamespaceOf =指令,可以在同一私有/tmp/var/tmp命名空间中运行两个或多个单元,有关详细信息,请参见systemd.unit(5)。

如果设置了DynamicUser=,则暗示此设置。对于此设置,关于挂载传播和特权的限制与ReadOnlyPaths=和相关调用相同,请参见上文。启用此设置具有在访问/tmp/var/tmp所需的所有装入单元上添加Requires =和After =依赖项的副作用。

此外,添加了对systemd-tmpfiles-setup.service(8)的隐式After =排序。请注意,可能无法实现此设置(例如,如果安装命名空间不可用),并且应该以不仅仅依赖于此设置的安全性来编写单元。

答案 1 :(得分:0)

已解决!

解决方案:

  • 转到systemd文件获取nrpe。我的被​​发现在这里:

    /lib/systemd/system/nrpe.service

  • 如果不存在,请运行:

    找到/-名称“ nrpe.service”

并忽略所有system.slice结果

  • 使用vi / nano打开文件
  • 找到一行显示PrivateTmp =的行(通常倒数第二行)
  • 如果将其设置为true,请将其设置为false
  • 保存并退出文件,然后运行以下2个命令:

    守护进程重新加载 重新启动nrpe.service

问题解决了。

简短说明:造成此问题的主要原因是,在debian 9.x中,某些使用systemd的进程默认情况下会强制使用私有tmp目录。因此,如果您有其他程序在/ tmp中搜索或建立索引时遇到问题,则可以定制此解决方案以使其适合。