NRPE Python 脚本输出错误



我的任务是制作一个自定义的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,并收到警告:1300 files in /tmp。似乎问题仅在于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 - 3 files in /tmp

  • 当我以 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 文件返回。但是,我仍然不知道如何解决此问题。

systemd 服务文件,也许这个 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= 排序。请注意,此设置的实现可能无法实现(例如,如果装载命名空间不可用(,并且单元的编写方式不应仅依赖于此设置以确保安全。

解决了!

溶液:

  • 转到您的系统文件以获取 nrpe。我的是在这里找到的:

    /lib/systemd/system/nrpe.service
    
  • 如果不存在,请运行:

    find / -name "nrpe.service"
    

并忽略所有系统切片结果

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

    daemon-reload
    restart nrpe.service
    

问题解决了。

简短解释:这个问题的主要原因是,在 debian 9.x 中,一些使用 systemd 的进程默认强制使用私有 tmp 目录。因此,如果您有任何其他程序在/tmp中搜索或索引时遇到问题,则可以定制此解决方案以适应。

最新更新