如何编写自定义Nagios检查插件
本教程在Debian 9.2上使用Nagios Core 4.3.4进行了测试
尽管Nagios Exchange有数以千计的可供免费下载的插件,但有时需要检查的状态对于您的情况非常具体。
注意事项
假定:
- 你已经安装并运行了Nagios(如果没有,你可以按照这个教程 )。
- 你知道Nagios管理的基础知识。
此示例中的Nagios服务器位于192.168.0.150上
,示例客户端位于IP 192.168.0.200上
退出代码
为了识别受监控服务的状态,Nagios在其上运行一个检查插件。 Nagios通过读取支票的退出代码可以知道服务的状态。
Nagios理解以下退出代码:
-
0
- 服务还可以。 -
1
- 服务有警告。 -
2
- 服务处于关键状态。 -
3
- 服务状态是UNKNOWN。
一个程序可以用任何语言写成Nagios检查插件。 根据检查的条件,插件可以使Nagios知道发生故障的服务。
示例插件
我将用一个简单的例子。 我在bash脚本中编写了一个插件来检查当前的警告。 让我们考虑一下,我将Nagios服务器配置为仅在严重状态下发出警报,所以如果在警告状态下有太多的服务,我需要警报。
考虑下面的脚本( check_warnings.sh
):
#!/bin/bash countWarnings=$(/usr/local/nagios/bin/nagiostats | grep "Ok/Warn/Unk/Crit:" | sed 's/[[:space:]]//g' | cut -d"/" -f5) if (($countWarnings<=5)); then echo "OK - $countWarnings services in Warning state" exit 0 elif ((6<=$countWarnings && $countWarnings<=30)); then # This case makes no sense because it only adds one warning. # It is just to make an example on all possible exits. echo "WARNING - $countWarnings services in Warning state" exit 1 elif ((30<=$countWarnings)); then echo "CRITICAL - $countWarnings services in Warning state" exit 2 else echo "UNKNOWN - $countWarnings" exit 3 fi
根据nagiostats
工具提供的信息,如果在警告状态下有五个或更少的服务,我认为一切正常。
我将把所有其他Nagios插件放在/ usr / local / nagios / libexec /
(这个目录根据你的配置不同而不同)。
像每个Nagios插件一样,在将其添加到配置文件之前,您需要从命令行进行检查。
请记住允许执行脚本:
sudo chmod +x /usr/local/nagios/libexec/check_warnings.sh
然后像其他脚本一样运行它:
结果是一条短信和一个退出代码:
设置新的检查命令和服务
这一步将与你自己的插件相同,如果你从互联网下载第三方插件。
首先你应该在commands.cfg
文件中定义一个命令。 这个文件的位置取决于你所做的配置,在我的情况下它在/usr/local/nagios/etc/objects/commands.cfg中
。
所以我会在文件末尾添加下面的代码块:
# Custom plugins commands... define command{ command_name check_warnings command_line $USER1$/check_warnings.sh }
请记住$ USER1 $
变量是在resource.cfg文件中设置的本地Nagios变量,在我的情况下指向/ usr / local / nagios / libexec
。
定义命令后,您可以将该命令关联到服务,然后关联到主机。 在这个例子中,我们要定义一个服务并将其分配给本地主机,因为这个检查在Nagios上。
编辑/usr/local/nagios/etc/objects/localhost.cfg
文件并添加以下块:
# Example - Check current warnings... define service{ use local-service host_name localhost service_description Nagios Server Warnings check_command check_warnings }
现在我们都已经设置好了,唯一需要重新加载的Nagios再次读取配置文件。
请记住,在重新加载Nagios之前,请检查配置中是否存在错误。 你以root身份执行nagios -v
命令:
sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
你应该得到这样的东西:
确保它返回0错误和0警告并继续重新加载服务:
sudo systemctl reload-or-restart nagios.service
重新加载服务之后,您将在本地主机中看到相关的检查。 首先等待:
执行后的结果是:
使用NRPE在客户端上运行
要在远程客户端上运行脚本,您需要设置Nagios Remote Plugin Executor(NRPE)
由于本教程基于Debian 9,我将以示例的形式展示如何安装它,但您可以找到任何发行版的说明。
在基于Debian的客户机上进行通用安装
请注意,本节中的所有配置都是在要检查的客户机上完成的,而不是在nagios服务器上完成的。
安装NRPE和Nagios插件:
sudo apt-get install libcurl4-openssl-dev nagios-plugins nagios-nrpe-server nagios-nrpe-plugin --no-install-recommends
sudo ln -s /usr/lib/nagios/plugins/check_nrpe /usr/bin/check_nrpe
允许Nagios服务器通过将其添加到/etc/nagios/nrpe.cfg中
的allowed_hosts
条目来在客户端上运行命令。 该行应该看起来像:
allowed_hosts=127.0.0.1,::1,192.168.0.150
定义您将使用NRPE在每个客户端执行的标准检查。 定义/etc/nagios/nrpe_local.cfg
上的检查。 例如,文件的模型可以是:
###################################### # Do any local nrpe configuration here ###################################### #----------------------------------------------------------------------------------- # Users command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10 # Load command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20 command[check_zombie_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s Z command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200 # Disk command[check_root]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p / command[check_boot]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /boot command[check_usr]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /usr command[check_var]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /var command[check_tmp]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /tmp # If you want to add a non-standard mount point: # command[check_mnt1]=/usr/lib/nagios/plugins/check_disk -w 4% -c 1% -p /export #-----------------------------------------------------------------------------------
拥有这个通用文件的想法是这样的,你可以在每个客户端上检查相同的文件。
确保本地文件和.d目录包含在主配置文件中:
cat /etc/nagios/nrpe.cfg | grep include | grep -v ^#
重新启动服务:
sudo systemctl restart nagios-nrpe-server.service
检查NRPE服务是否正在运行:
cat /etc/services | grep nrpe
netstat -at | grep nrpe
现在从Nagios服务器中检查一个以前定义的NRPE命令:
请注意,在/etc/nagios/nrpe_local.cfg
文件中定义了check_users
NRPE命令来运行/ usr / lib / nagios / plugins / check_users -w 5 -c 10
。
如果您在Nagios服务器中没有插件,则可以通过以下方式进行安装:
sudo apt-get install nagios-nrpe-plugin
因此,总结一下,NRPE将在远程主机上运行脚本,并将退出代码返回到Nagios服务器。
自定义脚本的配置
要将自定义脚本作为插件通过NRPE远程运行,应首先在服务器上编写脚本,例如在/usr/local/scripts/check_root_home_du.sh中
:
#!/bin/bash homeUsage=$(du -s /root/ | cut -f1) if (($homeUsage<=$((1024*1024)))); then echo "OK - Root home usage is $(du -sh /root/ | cut -f1)" exit 0 elif (($((1024*1024))<$homeUsage && $homeUsage<=$((3*1024*1024)))); then echo "WARNING - Root home usage is $(du -sh /root/ | cut -f1)" exit 1 elif (($((3*1024*1024))<$homeUsage)); then echo "CRITICAL - Root home usage is $(du -sh /root/ | cut -f1)" exit 2 else echo "UNKNOWN - Value received: $homeUsage" exit 3 fi
允许执行脚本:
sudo chmod +x /usr/local/scripts/check_root_home_du.sh
前面的脚本是一个非常简单的例子,它检查目录/ root
的磁盘使用情况,并设置一个阈值来考虑OK,Warning或Critical。
将该命令添加到客户机上的NRPE配置文件( /etc/nagios/nrpe_local.cfg
)中:
# Custom command[check_root_home_du]=/usr/local/scripts/check_root_home_du.sh
并重新启动NRPE监听器:
sudo systemctl restart nagios-nrpe-server.service
现在我们可以访问服务器并像任何标准插件一样测试它
在服务器配置文件上设置NRPE检查
现在我们知道自定义插件正在客户端和服务器上工作,并且NRPE正在通信,我们可以继续配置Nagios文件来检查远程设备。 所以在服务器上设置文件:
/usr/local/nagios/etc/objects/commands.cfg
:
#... define command{ command_name check_nrpe command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ }
/usr/local/nagios/etc/objects/nrpeclient.cfg
:
define host{ use linux-server host_name nrpeclient alias nrpeclient address 192.168.0.200 } define service{ use local-service host_name nrpeclient service_description Root Home Usage check_command check_nrpe!check_root_home_du }
请注意!
标记将命令与check_command
条目中的参数分隔开。 这定义了check_nrpe
是命令, check_root_home_du
是$ ARG1 $
的值。
另外,根据您的配置,您应该将最后一个文件添加到主文件( /usr/local/nagios/etc/nagios.cfg
)中:
#... cfg_file=/usr/local/nagios/etc/objects/nrpeclient.cfg #...
检查配置,如果没有错误或警告,请重新加载服务:
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
sudo systemctl reload-or-restart nagios.service
现在你有一个新的自定义检查主机:
结论
Nagios在Nagios Exchange有一个庞大的插件库。 但是,在大环境中,很可能需要对特定用途进行一些自定义检查,例如:检查某个任务结果,监视内部开发的应用程序等等。
Nagios提供的灵活性非常适合这些情况。