如何编写自定义Nagios检查插件

如何编写自定义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提供的灵活性非常适合这些情况。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏