我编写了一个自定义 ruby 脚本来检查 ubuntu 服务器上每个卷的磁盘使用情况。服务器由 puppet 控制,nagios 系统已经运行多年,包含许多其他自定义检查。当我在 nagios 服务器上运行我的新脚本时,它返回预期的输出,但当我为另一台服务器运行它时,它返回 NRPE:无法读取输出。在任何服务器上运行标准插件都可以。
我只是将文件加载到 /usr/lib/nagios/plugins 中并在 nrpe.cfg 中包含了一个命令,以便我从终端的命令行运行它。
我是否需要为客户端服务器的自定义检查设置主机名(或主机组)和服务,以使其在该服务器上工作,即使是从命令行?
这是nrpe.cfg中的命令
command[check_disk_usage]=/usr/lib/nagios/plugins/check_disk_usage.rb
以下是一些说明该问题的命令示例。
nagios@nagios-server:~$ /usr/lib/nagios/plugins/check_nrpe -H nagios-server
NRPE v2.15
nagios@nagios-server:~$ /usr/lib/nagios/plugins/check_nrpe -H client-server
NRPE v2.15
nagios@nagios-server:~$ /usr/lib/nagios/plugins/check_nrpe -H nagios-server -c check_users
USERS OK - 2 users currently logged in |users=2;5;5;0
nagios@nagios-server:~$ /usr/lib/nagios/plugins/check_nrpe -H client-server -c check_users
USERS OK - 2 users currently logged in |users=2;5;5;0
nagios@nagios-server:~$ /usr/lib/nagios/plugins/check_nrpe -H nagios-server -c check_disk_usage
OK - '/backups' 79% of disk space used | '/'=37% '/tmp'=1% '/srv'=62% '/backups'=79%
nagios@nagios-server:~$ /usr/lib/nagios/plugins/check_nrpe -H client-server -c check_disk_usage
NRPE: Unable to read output
这是我的自定义检查脚本:
#!/usr/bin/env ruby
def largest_hash_key(hash)
hash.max_by{|k,v| v}
end
filesystem = %x(df -h)
perfdata = filesystem.split("\n")
.grep(/\A\/dev/)
.map(&:split)
.map{ |e| "'%s'=%s" % [ e[-1], e[-2] ] }
.join(" ")
volumes = Hash[perfdata.split(" ").map {|str| str.split("=")}]
volumes = volumes.map{ |k, v| [k, v.to_i] }
full_disk = largest_hash_key(volumes)
pc_full = full_disk[1]
message = "#{perfdata} | #{perfdata}"
if pc_full > 94
puts "DISK CRITICAL - #{message}"
exit 2
elsif pc_full > 89
puts "DISK WARNING - #{message}"
exit 1
else
puts "DISK OK - #{message}"
exit 0
end
答案1
您需要在脚本顶部使用 ruby 二进制文件的完整路径。
您不能用作/usr/bin/env ruby
解释器,因为 NRPE 将在没有 ENV 的情况下运行。
这可以通过运行脚本来模拟env -i
,作为 nagios/nrpe 用户:
env -i /usr/lib/nagios/plugins/check_disk_usage.rb
答案2
和往常一样,这是由于一个愚蠢的错误造成的。检查脚本文件安装在 nagios 服务器上,而不是客户端服务器上。此 nagios 配置由 puppet 控制,一些自定义检查安装在 nagios 服务器上,一些安装在客户端服务器上。
我按照我安装的另一个自定义检查脚本的示例进行操作。该脚本之所以能正常工作,是因为有人在客户端服务器上的 /usr/lib/nagios/plugins 中手动安装了该脚本,而 puppet 也毫无用处地在 nagios 服务器上安装了该脚本。