引言
有这样一个需求:用nagios监控mysql是否启动,如果没有启动则启动mysql
Nagios Event Handler:
要完成上面的这个需求就需要用到nagios的Event handler即事件处理机制,事件处理就是让Nagios在发现问题之后主动的尝试进行一些问题处理而不立刻通知联系人。
在介绍如何使用Nagios的事件处理之前先说明一下SOFT HARD故障。
在Nagios有两种故障一种是SOFT 一种是HARD 文档是这么说的Tye type of state the service or host is in。 我理解成为故障:
SOFT故障定义如下:
一个主机处于非UP状态或者一个服务处于非OK状态的时候,重新检查的次数还没有达到max_check_attempts,这中故障叫做SOFT ERROR
HARD故障定义如下:
因此与SOFT故障相对,HARD就是重新检查的次数已经达到max_check_attempts
SOFT与HARD还有更多的发生条件,具体请参考Nagios手册。本文只需要知道以上两点就可以。
那么什么时候会出发Nagios的事件处理呢:
1. 发生一个SOFT故障状态
2. 初始进入一个HARD故障状态
3. 从一个SOFT或者HARD故障状态恢复
Nagios共有四种事件处理:
Global host event handler
Global service event handler
Host-specific event handlers
Service-specific event handlers
Global service event handler
Host-specific event handlers
Service-specific event handlers
本文仅使用最后一种作为实验。
MySQL检查以及重启脚本
首先我们写一个MySQL检查以及重启脚本
MySQL检查脚本check_mysql
#!/bin/sh
# ########################################################################
# This program is used to check whether mysqld run on this machine
# ########################################################################
# ########################################################################
# Redirect STDERR to STDOUT; Nagios doesn't handle STDERR.
# ########################################################################
exec 2>&1
# ########################################################################
# Set up constants, etc.
# ########################################################################
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
DBSCALE=mysqld
# ########################################################################
# Run the program.
# ########################################################################
main() {
pidof $DBSCALE > /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]
then
NOTE="OK mysqld is running on this host"
else
NOTE="CRITICAL mysqld is not running on this host"
fi
echo $NOTE
}
# ########################################################################
# Determine whether this program is being executed directly, or sourced/included
# from another file.
# ########################################################################
is_not_sourced() {
[ "${0##*/}" = "check_mysqld" ] || [ "${0##*/}" = "bash" -a "$_" = "$0" ]
}
# ########################################################################
# Execute the program if it was not included from another file.
# This makes it possible to include without executing, and thus test.
# ########################################################################
if is_not_sourced; then
OUTPUT=$(main "$@")
EXITSTATUS=$STATE_UNKNOWN
case "${OUTPUT}" in
UNK*) EXITSTATUS=$STATE_UNKNOWN; ;;
OK*) EXITSTATUS=$STATE_OK; ;;
WARN*) EXITSTATUS=$STATE_WARNING; ;;
CRIT*) EXITSTATUS=$STATE_CRITICAL; ;;
esac
echo "${OUTPUT}"
exit $EXITSTATUS
fi
# ############################################################################
# Documentation
# ############################################################################
: <<'DOCUMENTATION'
check_mysqld - Return OK if mysqld is running on this machine
Usage: check_mysqld
DOCUMENTATION
MySQL重启脚本start_mysql
#!/bin/sh
exec 2>&1
/usr/local/mysql/bin/mysqld_safe --user=mysql>/dev/null
这里需要给nagios一个mysqld_safe的权限,修改/etc/sudoers加入
nagios ALL=(ALL) NOPASSWD: /usr/local/mysql/bin/mysqld_safe
准备好两个脚本后,将两个脚本放在/uar/local/nagios/libexec目录下
配置
在主监控机上配置服务:check_mysql
define service{
use local-service
host_name SmartMonitor-Linux
service_description mysqld_check
check_command check_nrpe!check_mysqld
event_handler_enabled 1
event_handler check_nrpe!start_mysqld
}
同时将主配置文件的event_handler_enabled设置为1
然后配置被监控机的nrpe.cfg
command[check_mysqld]=/usr/local/nagios/libexec/check_mysql
command[start_mysqld]=/usr/bin/sudo /usr/local/nagios/libexec/start_mysql
至此大功告成!
启动Nagios,首先手动开启MySQL,然后kill掉MySQL,当下一下检查check_mysql服务时,会自动将MySQL开启。