前言: Nagios是相當(dāng)不錯(cuò)的監(jiān)控工具,被稱作是“監(jiān)控之神”,但同樣也有“難搞死”頭銜。發(fā)揮Nagios一切魅力的都是他的插件,正因?yàn)樨S富多樣的插件讓 nagios有血有肉。監(jiān)控的內(nèi)容不斷在變化,插件也不斷變化,默認(rèn)的一些插件可能越來(lái)越不能滿足需求,這個(gè)時(shí)候就要自己來(lái)寫些插件了。
以下就是用我的第一個(gè)Nagios插件來(lái)說(shuō)明編寫方法和我遇到一些問(wèn)題調(diào)試方法。如果你有耐心可以通篇看完,應(yīng)該對(duì)第一次寫的人來(lái)說(shuō)會(huì)有很大幫助(如果你看不懂,可能是我寫得不清楚 那就沒(méi)辦法了 表達(dá)能力有限)
需求:
監(jiān)控普通磁盤的健康狀況(普通磁盤以外還有RAID、陣列的監(jiān)控是不同方法來(lái)做的,這里先不討論,先從最簡(jiǎn)單的入手),定期進(jìn)行檢測(cè),并進(jìn)行報(bào)警,報(bào)警內(nèi)容磁盤是否正常,不正常是什么狀態(tài)。
分析編寫過(guò)程:
我寫腳本的前提都是先從手動(dòng)成功完成,再到自動(dòng)化(我想其它人的思路應(yīng)該都一樣的)
1、找到監(jiān)控磁盤的方法
通過(guò)一番查找 smartctl 這個(gè)命令是比較不錯(cuò)的 centos slackware一般的默認(rèn)都有這個(gè)
smartctl -H /dev/sda 只檢測(cè)狀態(tài)
smartctl -i /dev/sda 只檢測(cè)硬盤信息
smartctl -a /dev/sda 檢測(cè)所有信息
2、獲取檢測(cè)信息
# smartctl -H /dev/sda
smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
SMART Health Status: OK
關(guān)鍵的最后一行說(shuō)明磁盤的情況 截取 DISK_HEALTH=`smartctl -H /dev/sda | tail -1 | cut -d: -f2- `
3、 進(jìn)行關(guān)鍵判斷
據(jù)我所知道的 smartctl 5.38 是出以上的結(jié)果 為OK
而 smartctl 5.39 是出以下結(jié)果
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
關(guān)鍵詞是PASSED
所以要分析判斷多種情況
4、腳本編寫步驟
1)了解nagios插件編寫規(guī)范
Nagios的插件可以用腳本(shell、Perl)C編譯后的可執(zhí)行程序,但必須滿足以下兩件事:
A、既出時(shí)有一個(gè)返回值
B、至少向標(biāo)準(zhǔn)輸出設(shè)備(STDOUT)輸出一行文件。(但也不能太大,默認(rèn)是4K,如果想大些,修改源程序吧,方法搜。)
返回值定義:
Plugin Return Code Service State DISK State
0 OK OK 或者PASSED
1 WARNING 插件警告 DISK報(bào)警只分OK或者CRITICAL
2 CRITICAL DISK檢測(cè)非OK 或者PASSED
3 UNKNOWN 未知狀態(tài)
2)插件編寫SHELL速成法
在這里我選用我最熟悉的SHELL進(jìn)行腳本編寫 ,
我的速成法就是,直接去nagios exchange 去下比較成熟的比較簡(jiǎn)單的shell腳本,這樣會(huì)從一開(kāi)始借鑒別人好的方法,養(yǎng)成好的習(xí)慣,而且只要你有一點(diǎn)SHELL編程經(jīng)驗(yàn)也可以很快寫得像一個(gè)老手。(不過(guò)不要把自己搞暈了就行)
3)以下是我的check_disk_health.sh
#!/bin/bash
# ========================================================================================
# disk health plugin for Nagios
#
# Written by : Ajian
# Release : 1.2.0
# Creation date : 2009-07-28
# Revision date : 2009-07-30
# Description : Nagios plugin (script) to check disk health .
# This script has been designed and written on Linux System.
#
# USAGE : ./check_disk_health.sh [-d (disk)]
#
# Exemple: ./check_cpu_stats.sh
# ./check_cpu_stats.sh -d /dev/sda
#
#
# HISTORY :
# Release | Date | Authors | Description
# --------------+---------------+----------------------+-----------------------------------
# 1.0.0 | 2009-07-28 | Ajian | Create the script
# 1.2.0 | 2009-07-30 | Ajian | modify the script and run well ,fix a bug.
# -----------------------------------------------------------------------------------------
# NOTICE:
#-----------------------------------------------------------------------------------------
# You should have the root Permissions ,You can use sudo to realize .
# -----------------------------------------------------------------------------------------
# Nagios return codes
#定義 nagios返回的狀態(tài)變量
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
# Paths to commands used in this script. These may have to be modified to match your system setup.
# 定義關(guān)鍵的核心命令smartctl 路徑 如果你的系統(tǒng)不是這個(gè)地址,請(qǐng)更改。 以下注釋的是調(diào)試的信息,是自動(dòng)獲取命令路徑的方法。
SMARTCTL="/usr/sbin/smartctl"
#SMARTCTL=`which smartctl`
#if [ $? -ne 0 ]; then
# echo " smartctl is found in $SMARTCTL ; Go on ... "
# echo "smartctl the command cannot find"
# exit $STATE_UNKNOWN
#fi
# Plugin parameters value if not define
# 定義默認(rèn)的檢測(cè)硬盤
CHECK_DISK="/dev/sda"
# Plugin variable description
# 插件描述信息
PROGNAME=$(basename $0)
RELEASE="Revision 1.2.0"
AUTHOR="(c) 2009 Ajian ()"
# Functions plugin usage
# 插件的使用方法函數(shù)
print_release() {
echo "$RELEASE $AUTHOR"
}
print_usage() {
echo ""
echo "$PROGNAME $RELEASE - Disk health check script for Nagios"
echo ""
echo "Usage: check_disk_health.sh -d /dev/sdb"
echo ""
echo " -d the disk (/dev/sda) "
echo " not the Hard disk partition(sda2 is wrong)"
echo " -v check the version"
echo " -h Show this page"
echo ""
echo "Usage: $PROGNAME"
echo "Usage: $PROGNAME --help"
echo ""
exit 0
}
print_help() {
print_usage
echo ""
echo "This plugin will check disk health "
echo ""
exit 0
}
# Parse parameters
# 傳遞參數(shù)
while [ $# -gt 0 ]; do
case "$1" in
-h | --help)
print_help
exit $STATE_OK
;;
-v | --version)
print_release
exit $STATE_OK
;;
-d | --disk)
shift
CHECK_DISK=$1
#判斷磁盤是否存在
if [ ! -b $CHECK_DISK ];then
echo "$CHECK_DISK is no exsit,Please change it "
exit $STATE_CRITICAL
fi
;;
*) echo "Unknown argument: $1"
print_usage
exit $STATE_UNKNOWN
;;
esac
shift
done
#根據(jù)不同的操作進(jìn)行不同的操作,這里暫時(shí)只支持Linux
case `uname` in
Linux )
#最核心的部分 前面都是些腳本的基本功能 一個(gè)框架 因?yàn)榈谝粋€(gè)腳本牽扯到了很多東西,雖然功能很簡(jiǎn)單,
#但折騰了我不少,在后面的分析中會(huì)具體說(shuō)到 總之注意sudo用法 腳本一開(kāi)始就有說(shuō)哦
DISK_HEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
#DISK_HEALTH="OK"
# DISK_INFO=`/usr/bin/sudo $SMARTCTL -i $CHECK_DISK | grep "Device:"`
if [ "$DISK_HEALTH" = " OK" ]|| [ "$DISK_HEALTH" = " PASSED" ];then
echo "OK - $CHECK_DISK status is $DISK_HEALTH "
#echo "OK - $CHECK_DISK status is $DISK_HEALTH | $DISK_INFO"
exit $STATE_OK
else
echo "CRITICAL - $CHECK_DISK status is $DISK_HEALTH "
#echo "CRITICAL - $CHECK_DISK status is $DISK_HEALTH | $DISK_INFO"
exit $STATE_CRITICAL
fi
;;
*) echo "UNKNOWN: `uname` not yet supported by this plugin. Coming soon !"
exit $STATE_UNKNOWN
;;
esac4)運(yùn)行腳本
(注意:在最開(kāi)始自己寫的腳本是沒(méi)有sudo的,以上腳本是已經(jīng)調(diào)試過(guò)后的,還需要配置一些其它的東西,慢慢看吧)
給與腳本執(zhí)行權(quán)限,手動(dòng)執(zhí)行
# ./check_disk_health.sh
OK – /dev/sda status is OK
結(jié)果正確了,其實(shí)這個(gè)時(shí)候,高興得太早了。 我先不說(shuō)問(wèn)題、繼續(xù)正常的一般流程。
5、配置Nagios 調(diào)用插件
1)在遠(yuǎn)程N(yùn)RPE 被監(jiān)控服務(wù)器上修改nrpe.conf
# vim /usr/local/nagios/etc/nrpe.cfg
添加 command[check_sda_health]=/usr/local/nagios/libexec/check_disk_health.sh -d /dev/sda
(注意這里了,先提醒下,這里是錯(cuò)誤的,一般是正確的,是這個(gè)腳本的特殊性造成的)
2)在Nagios 監(jiān)控服務(wù)器上添加一些配置
定義服務(wù)
define service{
use Disk-Health
host_name DB-56
servicegroups Disk-Health
service_description check sda disk health
contact_groups admins
check_command check_nrpe!check_sda_health
}
如果像上面定義一個(gè)服務(wù) 那么就要注意相關(guān)的定義了 ,
定義Disk-Health 模版 把硬盤檢測(cè)定義一個(gè)模版會(huì)比較好控制,因?yàn)橛脖P的檢測(cè)不像其它服務(wù)一樣需要準(zhǔn)確的及時(shí)性反正檢測(cè)得太多可能會(huì)造成壓力,一般一天檢測(cè)幾次就夠了。
定義DB-56 主機(jī)需要定義
定義組 admins
以上這些只要安裝過(guò)nagios 一般都知道的了 只是強(qiáng)調(diào)下模版的單獨(dú)定義
3)通過(guò)WEB控制檢測(cè) 查看結(jié)果
結(jié)果是失敗 報(bào)警CRITCTL 但是狀態(tài)里面的信息都是空的 CRITCTL – /dev/sda status is
6、調(diào)試
從Nagios的遠(yuǎn)程監(jiān)控來(lái)看是失敗的,并且沒(méi)有獲取到任務(wù)有用的信息。
分析可以看到,說(shuō)明nrpe調(diào)用 這個(gè)變量獲取到的是為空的信息
DISK_HEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
即是空的 只有一個(gè)原因,肯定是沒(méi)有執(zhí)行 如果執(zhí)行了 肯定會(huì)有字段 不管這個(gè)字段是否相符。
但是手動(dòng)執(zhí)行是沒(méi)有問(wèn)題。
經(jīng)過(guò)對(duì)smartctl的查看 原來(lái)這個(gè)命令是只允許root進(jìn)行調(diào)用的。
現(xiàn)在需要解決的問(wèn)題是:非root 用戶 如何遠(yuǎn)程調(diào)用含有需要有root權(quán)限命令的腳本進(jìn)行監(jiān)控。
(不要小看這一句話,每一個(gè)詞都是一個(gè)需要攻克的地方)
以下是調(diào)試步驟:
1)非root用戶
NRPE插件是用nagios這個(gè)用戶來(lái)執(zhí)行的 所以要得到真實(shí)的情況需要
A: su nagios 再執(zhí)行腳本 (這個(gè)方法比較好)
B: sudo -u nagios ./check_disk_health.sh
結(jié)果:
sudo -u nagios ./check_disk_health.sh
CRITICAL – /dev/sda status is
跟遠(yuǎn)程的結(jié)果是一樣的了 沒(méi)有信息
2)需要有root權(quán)限
需要root權(quán)限只有一個(gè)辦法就是用sudo
將DISK_HEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
改為DISK_HEALTH=`/usr/bin/sudo $SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
(最后發(fā)現(xiàn)這時(shí)加sudo 并不是關(guān)鍵 關(guān)鍵是很行腳本時(shí)用sudo )
結(jié)果:sudo -u nagios ./check_disk_health.sh
Password:
需要輸入密碼 sudo不用輸入密碼的方法
修改sudo配置文件
執(zhí)行 visudo
添加
nagios ALL=(ALL) NOPASSWD:/usr/local/nagios/libexec/check_disk_health.sh
建議:最好進(jìn)行sudo的一些控制,很多網(wǎng)方法就是nagios ALL=NOPASSWD:ALL
結(jié)果:
su nagios
/usr/bin/sudo check_disk_health.sh
OK – /dev/sda status is OK
那么在nrpe.conf配置文件中需要添加sudo
command[check_sda_health]=/usr/bin/sudo /usr/local/nagios/libexec/check_disk_health.sh
最開(kāi)始那個(gè)是錯(cuò)誤的 注意啊 這個(gè)是需要添加/usr/bin/sudo 就是說(shuō)只要腳本中涉及到提升到root權(quán)限的命令那么就要用這個(gè)
3)遠(yuǎn)程調(diào)用
遠(yuǎn)程調(diào)用方法:./check_nrpe -H 192.168.0.56 -c check_sda_health
同上如果想模擬真實(shí)環(huán)境請(qǐng)切換到相應(yīng)的執(zhí)行用戶 su nagios 再執(zhí)行以上操作
結(jié)果: NRPE: Unable to read output
這個(gè)錯(cuò)誤的原因一定要明白,之所以報(bào)這個(gè)錯(cuò)意思是說(shuō)NRPE沒(méi)有獲取到任何信息,也說(shuō)是寫腳本之前說(shuō)的其中第二條規(guī)范
問(wèn)題:在沒(méi)有任何信息的情況下怎么來(lái)獲取NRPE執(zhí)行的日志呢
就是要確定問(wèn)題在哪,經(jīng)過(guò)一大番的查找眼睛偶爾看到一個(gè)有趣的小方法
修復(fù)nrpe.conf配置文件 在要檢查的命令后面添加>>/tmp/output 2>&1 將錯(cuò)誤導(dǎo)出到文件中進(jìn)行查看
command[check_sda_health]=/usr/bin/sudo /usr/local/nagios/libexec/check_disk_health.sh -d /dev/sda >>/tmp/output 2>&1
重記nrpe服務(wù)
遠(yuǎn)程調(diào)用 結(jié)果當(dāng)然還是NRPE: Unable to read output
查看/tmp/output
sudo: sorry, you must have a tty to run sudo
有錯(cuò)誤就簡(jiǎn)單了 原來(lái)這個(gè)是默認(rèn)不允許sudo 在后端進(jìn)行
visudo
注釋Defaults requiretty 就OK了
結(jié)果通過(guò)WEB查看也正確了。
(注意:注釋后 檢測(cè)仍然會(huì)是Unable 不過(guò)看/tmp/output就會(huì)有正確的結(jié)果,所以有正確的結(jié)果后,一定要去掉 >>/tmp/outpt 2>&1 信息都導(dǎo)到文件中了 nagios還是得不到任何消息。)
一個(gè)腳本執(zhí)行成功后,就是大批量應(yīng)用,用生產(chǎn)環(huán)境驗(yàn)證,出現(xiàn)問(wèn)題繼續(xù)調(diào)試。
以上為所有的分析調(diào)試方法。如果你看到最后一步了,說(shuō)明你很有耐心,你也一定會(huì)成功的,至于寫得好與壞、對(duì)與錯(cuò)請(qǐng)盡管說(shuō),這不會(huì)影響你的成功。呵呵。