【问题标题】:NRPE Python script output bugNRPE Python 脚本输出错误
【发布时间】:2018-08-22 08:57:30
【问题描述】:

我的任务是制作一个自定义 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 文件的回报。但是,我仍然不知道如何解决此问题。

【问题讨论】:

  • nagios 用户或运行的用户 NRPE 是否有权限读取目录?您能否以远程服务器上的用户身份运行脚本并获得预期的结果? su nagios -c "/usr/local/nagios/libexec/check_tmp.py"
  • 是的,在远程服务器上运行上面的命令我得到了想要的输出
  • /usr/local/nagios/libexec/check_nrpe -H 192.168.1.59 -su nagios -c check_tmp_folder 在 Nagios 服务器(不是主机)上运行它,给我一个错误的输出。当我用 -su root 替换 -su nagios 时,它甚至给了我错误的输出

标签: python nagios nrpe


【解决方案1】:

systemd 服务文件,也许这个 var 设置为 true :)

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

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

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

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

【讨论】:

  • 以答案开头很好,但请格式化,使其可读。
【解决方案2】:

解决了!

解决方案:

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

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

    find / -name "nrpe.service"
    

并忽略所有 system.slice 结果

  • 用 vi/nano 打开文件
  • 查找写有PrivateTmp= 的行(通常是倒数第二行)
  • 如果设置为true,则设置为false
  • 保存并退出文件并运行以下 2 个命令:

    daemon-reload
    restart nrpe.service
    

问题解决了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2015-04-04
    • 2019-12-17
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多