引言
有這樣一個需求:用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開啓。