介绍
事件处理程序是可选的系统命令(脚本或可执行文件),它们在主机或服务状态发生更改时运行。
事件处理程序的一个明显用途是Nagios Core能够在通知任何人之前主动解决问题。事件处理程序的其他一些用途包括:
- 重新启动失败的服务
- 在技术支持系统中输入故障工单
- 将事件信息记录到数据库
- 重启主机电源*
- 其他
*请慎重考虑基于自动化脚本部署方式重启主机,因为其可能导致的严重后果所以在部署之前务必慎重考虑。
什么时候执行事件处理程序?
服务或主机在以下情况下执行事件处理程序:
- 处于SOFT问题状态
- 最初进入HARD问题状态
- 最初从SOFT或HARD问题状态恢复
此处 详细描述SOFT和HARD状态。
事件处理程序类型
您可以定义不同类型的可选事件处理程序,以处理主机和状态更改:
- 全局主机事件处理程序
- 全局服务事件处理程序
- 主机特定的事件处理程序
- 特定于服务的事件处理程序
在发生任何主机或服务特定事件处理程序之前,将针对发生的每个主机或服务状态更改 运行全局主机和服务事件处理程序。您可以通过使用主配置文件中的global_host_event_handler和global_service_event_handler选项来指定全局事件处理程序命令。
各个主机和服务可以具有自己的事件处理程序命令,应运行该命令以处理状态更改。您可以在主机和服务定义中使用event_handler指令指定应运行的事件处理程序。这些(特定于主机和服务的)事件处理程序在(可选)全局主机或服务事件处理程序执行后立即执行。
启用事件处理程序
通过使用主配置文件中的enable_event_handlers,可以在整个程序范围内启用或禁用事件处理程序。
可以通过在主机和服务定义中使用event_handler_enabled指令来启用或禁用特定于主机和服务的事件处理程序。如果禁用了全局enable_event_handlers选项,则将不执行特定于主机和服务的事件处理程序。
事件处理程序执行顺序
如前所述,全局主机和服务事件处理程序在特定于主机或服务的事件处理程序之前立即执行。
发出通知后,将立即针对HARD问题和恢复状态执行事件处理程序。
编写事件处理程序命令
事件处理程序命令可能是shell或perl脚本,但是它们可以是可以从命令提示符运行的任何类型的可执行文件。脚本至少应将以下宏作为参数:
服务:$ SERVICESTATE $,$ SERVICESTATETYPE $,$ SERVICEATTEMPT $
主机:$ HOSTSTATE $,$ HOSTSTATETYPE $,$ HOSTATTEMPT $
脚本应检查传递给它的参数的值,并根据这些值采取任何必要的措施。了解事件处理程序如何工作的最好方法是看一个示例。幸运的是,下面提供了一个。
提示:可以在Nagios Core发行版的contrib / eventhandlers /子目录中找到其他示例事件处理程序脚本。其中一些示例脚本演示了如何使用外部命令来实现冗余和分布式监视环境。
事件处理程序命令的权限
事件处理程序命令通常将以与Nagios Core在您的计算机上运行的用户相同的权限执行。如果您要编写重新启动系统服务的事件处理程序,可能会出现问题,因为执行此类任务通常需要root特权。
理想情况下,您应该评估将要实现的事件处理程序的类型,并向Nagios Core用户授予足够的权限以执行必要的系统命令。您可能想尝试使用sudo完成此操作。
服务事件处理程序示例
下面的示例假定您正在监视本地计算机上的HTTP服务器,并已将restart-httpd指定为HTTP服务定义的事件处理程序命令。此外,我将假设您已将服务的max_check_attempts选项设置为4或更大的值(即,在对服务进行4次检查之前,将其视为真正的问题)。缩写的示例服务定义可能如下所示:
define service {
host_name somehost
service_description HTTP
max_check_attempts 4
event_handler restart-httpd
...
}
使用事件处理程序定义服务后,我们必须将该事件处理程序定义为命令。下面显示了restart-httpd的示例命令定义。请注意我要传递给事件处理程序脚本的命令行中的宏-这些很重要!
define command {
command_name restart-httpd
command_line /usr/local/nagios/libexec/eventhandlers/restart-httpd $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$
}
现在,让我们编写事件处理程序脚本(/usr/local/nagios/libexec/eventhandlers/restart-httpd脚本)。
#!/bin/sh
#
# Event handler script for restarting the web server on the local machine
#
# Note: This script will only restart the web server if the service is
# retried 3 times (in a "soft" state) or if the web service somehow
# manages to fall into a "hard" error state.
#
# What state is the HTTP service in?
case "$1" in
OK)
# The service just came back up, so don't do anything...
;;
WARNING)
# We don't really care about warning states, since the service is probably still running...
;;
UNKNOWN)
# We don't know what might be causing an unknown error, so don't do anything...
;;
CRITICAL)
# Aha! The HTTP service appears to have a problem - perhaps we should restart the server...
# Is this a "soft" or a "hard" state?
case "$2" in
# We're in a "soft" state, meaning that Nagios is in the middle of retrying the
# check before it turns into a "hard" state and contacts get notified...
SOFT)
# What check attempt are we on? We don't want to restart the web server on the first
# check, because it may just be a fluke!
case "$3" in
# Wait until the check has been tried 3 times before restarting the web server.
# If the check fails on the 4th time (after we restart the web server), the state
# type will turn to "hard" and contacts will be notified of the problem.
# Hopefully this will restart the web server successfully, so the 4th check will
# result in a "soft" recovery. If that happens no one gets notified because we
# fixed the problem!
3)
echo -n "Restarting HTTP service (3rd soft critical state)..."
# Call the init script to restart the HTTPD server
/etc/rc.d/init.d/httpd restart
;;
esac
;;
# The HTTP service somehow managed to turn into a hard error without getting fixed.
# It should have been restarted by the code above, but for some reason it didn't.
# Let's give it one last try, shall we?
# Note: Contacts have already been notified of a problem with the service at this
# point (unless you disabled notifications for this service)
HARD)
echo -n "Restarting HTTP service..."
# Call the init script to restart the HTTPD server
/etc/rc.d/init.d/httpd restart
;;
esac
;;
esac
exit 0
上面提供的示例脚本将尝试在两个不同的实例中重新启动本地计算机上的Web服务器:
- 在第三次重新检查该服务并使其处于SOFT CRITICAL状态后
- 服务首次进入“HARD CRITICAL ”状态后
理论上,该脚本应该重新启动并从Web服务器重新启动,并在服务进入HARD问题状态之前解决该问题,但是,如果该脚本第一次无法正常运行,我们会提供一个备用案例。应该注意的是,事件处理程序只会在服务第一次进入HARD问题状态时才执行。如果服务仍然处于HARD问题状态,这可以防止Nagios Core持续执行脚本以重新启动Web服务器。
事件处理程序易于编写和实现,请自己尝试写一个试试。