Nagios 的自定义检查和通知

作者:Mike Diehl

不久前,我为 Linux Journal 的网络版撰写了一篇文章,题为“如何成为一名优秀(且懒惰的)系统管理员。” 一些敏锐的读者在阅读了这篇文章后,询问我是否熟悉 Nagios 监控系统,我确实熟悉。我已经使用 Nagios 几年了。

我本打算将这篇文章写成一篇关于首次配置和运行 Nagios 的操作指南。然而,事实证明 Nagios 自带的文档已经非常好了。即使您遇到问题(我确实遇到过),用户社区的响应也非常迅速。因此,与其老生常谈(向爱马人士致以歉意),我决定延续“优秀且懒惰的管理员”主题,讨论如何通过自定义服务检查和自定义通知来扩展 Nagios。

Nagios 使用插件机制来实现其所有服务器和服务检查以及所有通知。这对黑客来说是个好消息,因为它允许我们构建其他人没有想到或需要的新功能。我为我的 Nagios 系统编写了几个脚本。一个脚本执行自定义服务检查,以查看我在帮助台是否有语音邮件等待,另一个脚本通过电话执行自定义通知。在继续之前,我应该先介绍一点背景信息。

我维护着多台服务器,既有我自己的,也有客户的。这些服务器的范围从 Web 服务器到运行 Asterisk 的电话系统。与大多数系统管理员一样,我没有任何“可选”的服务器或服务;这些东西必须正常工作,当它不正常工作时,我需要知道。但我要告诉你,我对坐在办公桌前盯着帮助台电话或监控屏幕不感兴趣。要么是我太懒,要么是我太忙。无论哪种方式,这都是硅的作用,对吧?

我家里的电话系统运行在 Asterisk 上。您可以在 https://linuxjournal.cn/article/9111 上阅读更多关于我的家庭基础设施的信息。我的 Nagios 服务器运行在同一台服务器上,因此将这两项服务集成在一起是很合理的。

我创建了一个 Nagios 脚本,用于监控帮助台语音信箱,并在 Nagios 中存在任何严重警报时设置服务警报。我还编写了一个脚本,可以在服务中断时给我打电话,可能打到我的手机上。有了这两个脚本,每当有人呼叫我的帮助台并留言时,我都可以接到电话。如果我的任何受监控服务失败,我也可以接到电话。理论上,我可以在公园里和我的孩子们玩耍,并且知道我的服务器运行良好……直到手机铃响。

我理解我的情况有点特殊,但相同的概念适用于商业生产环境,所以让我们开始研究代码。

首先,让我们谈谈帮助台监控脚本。本质上,此脚本检查帮助台邮箱的 INBOX 中是否有任何文件。以下是代码

#!/usr/bin/perl -w

local *DIR;
my ($file, $error);

$error = 0;

opendir DIR, "/var/spool/asterisk/voicemail/customers/611/INBOX/"
       or die("Error: Permission denied\n");

while ($file = readdir(DIR)) {
       if ($file eq ".") { next; }
       if ($file eq "..") { next; }

       $error++;
}

$error = $error/4;

if (!$error) {
       print "OK\n";
       exit 0;
} else {
       print "CRITICAL: $error\n";
}

exit 2;

当然,您需要确保 Nagios 用户有权访问 Asterisk 语音信箱,但这可以通过设置脚本 set-uid 来解决。正如您所见,该脚本非常简单。如果目录中有任何其他文件,则脚本假定存在语音邮件,并向 Nagios 发送 CRITICAL 警报。否则一切正常。

要使 Nagios 能够使用此检查脚本,我们需要在 checkcommands.cfg 中定义它。这是我使用的定义

define command{
       command_name    check_help
       command_line    /etc/nagios/local/check_611.pl
}

现在,我可以在 services.cfg 文件中引用 check_help 检查脚本。这是我操作的方法

define service {
       use generic-service
       name                    Help_Desk
       host_name               my_server
       service_description     Help Desk Voicemail
       check_command           check_help
       register 1
}

有了这个配置,Nagios 可以在帮助台邮箱中有语音邮件时发出警报。但这只是我承诺要写的一半内容。下一个脚本允许 Nagios 给我打电话,让我知道我有紧急情况需要处理。以下是该脚本

#!/usr/bin/perl

foreach $main::phone ("15055551234") {

       $main::call = 
MaxRetries: 0
RetryTime: 1
WaitTime: 120
Account: Enterprise
Context: apps
Extension: OUTAGE
Priority: 1
EOF
;

       open FILE, ">/tmp/outage.call";
       print FILE $main::call;
       close FILE;

       system("mv /tmp/outage.call /var/spool/asterisk/outgoing");
}

正如您所见,此脚本也不复杂。它只是创建一个 Asterisk “呼叫文件”并将其放入 Asterisk 的外发队列目录中。该脚本能够呼叫多个号码……以防万一。重要的是,呼叫文件应在另一个目录中创建,然后再移动到队列目录中。否则,如果 Asterisk 在脚本仍在写入文件时尝试读取该文件,则可能会发生糟糕的事情。

显然,此脚本依赖于 Asterisk 拨号计划中的某些配置。以下是拨号计划的相关部分

exten => OUTAGE,1,answer
exten => OUTAGE,2,playback(/etc/asterisk/sounds/OUTAGE)
exten => OUTAGE,3,hangup

此时,您可能意识到我没有做任何复杂的事情。从 Asterisk 的角度来看,只需要在 /etc/asterisk/sounds/OUTAGE 中放置一个音频消息(.wav 或 .au),以指示发生了紧急情况。Asterisk 将选择最合理的文件扩展名,并在接听电话时播放该文件。

因此,剩下要做的就是配置 Nagios 以使用此通知方法。这在 misccommands.cfg 文件中配置。以下是我操作的方法

# 'notify_by_phone' command definition
define command{
       command_name    notify_by_phone
       command_line    /etc/nagios/local/notify_by_phone.pl
}

现在所有配置都已完成,我们重启 Nagios 并重新加载 Asterisk 拨号计划。为此,我们在命令行中输入 “/etc/init.d/nagios restart”,并在 Asterisk 控制台中输入 “extensions reload”。

现在,每当我在帮助台有语音邮件时,它都会在 Nagios 监控屏幕上指示为严重警报。此外,每当我的任何服务器或服务不可用时,我都可以通过家里的电话或手机接到电话。这意味着我的客户不必拥有这些电话号码,而我仍然可以为他们提供优质的服务。

现在我意识到我的情况很特殊,但我希望本文可以作为如何创建自定义 Nagios 服务检查和通知的示例,并暗示 Asterisk 中可用的一些集成选项。

加载 Disqus 评论