NRPE Python 脚本输出错误
NRPE Python script output bug
我的任务是在远程 NRPE 客户端上制作自定义 python 脚本(因为我不擅长 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 < 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文件return。但是,我仍然不知道如何解决这个问题。
systemd 服务文件,也许这个变量设置为 true :)
PrivateTmp=
采用布尔参数。如果为真,则为已执行的进程设置一个新的文件系统命名空间,并在其中安装私有 /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= 排序。请注意,此设置的实现可能是不可能的(例如,如果挂载命名空间不可用),并且单元的编写方式不应完全依赖此设置来确保安全。
已解决!
解决方案:
转到 nrpe 的 systemd 文件。我的是在这里找到的:
/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
中搜索或索引时遇到问题,可以调整此解决方案以适应。
我的任务是在远程 NRPE 客户端上制作自定义 python 脚本(因为我不擅长 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 < 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文件return。但是,我仍然不知道如何解决这个问题。
systemd 服务文件,也许这个变量设置为 true :)
PrivateTmp=
采用布尔参数。如果为真,则为已执行的进程设置一个新的文件系统命名空间,并在其中安装私有 /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= 排序。请注意,此设置的实现可能是不可能的(例如,如果挂载命名空间不可用),并且单元的编写方式不应完全依赖此设置来确保安全。
已解决!
解决方案:
转到 nrpe 的 systemd 文件。我的是在这里找到的:
/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
中搜索或索引时遇到问题,可以调整此解决方案以适应。