前言: Nagios是相当不错的监控工具,被称作是“监控之神”,但同样也有“难搞死”头衔。发挥Nagios一切魅力的都是他的插件,正因为丰富多样的插件让nagios有血有肉。监控的内容不断在变化,插件也不断变化,默认的一些插件可能越来越不能满足需求,这个时候就要自己来写些插件了。
以下就是用我的第一个Nagios插件来说明编写方法和我遇到一些问题调试方法。如果你有耐心可以通篇看完,应该对第一次写的人来说会有很大帮助(如果你看不懂,可能是我写得不清楚 那就没办法了 表达能力有限)
需求:
监控普通磁盘的健康状况(普通磁盘以外还有RAID、阵列的监控是不同方法来做的,这里先不讨论,先从最简单的入手),定期进行检测,并进行报警,报警内容磁盘是否正常,不正常是什么状态。
分析编写过程:
我写脚本的前提都是先从手动成功完成,再到自动化(我想其它人的思路应该都一样的)
1、找到监控磁盘的方法
通过一番查找 smartctl 这个命令是比较不错的 centos slackware一般的默认都有这个
smartctl -H /dev/sda 只检测状态
smartctl -i /dev/sda 只检测硬盘信息
smartctl -a /dev/sda 检测所有信息
通过一番查找 smartctl 这个命令是比较不错的 centos slackware一般的默认都有这个
smartctl -H /dev/sda 只检测状态
smartctl -i /dev/sda 只检测硬盘信息
smartctl -a /dev/sda 检测所有信息
2、获取检测信息
# 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/
# 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
关键的最后一行说明磁盘的情况 截取 DISK_HEALTH=`smartctl -H /dev/sda | tail -1 | cut -d: -f2- `
3、 进行关键判断
据我所知道的 smartctl 5.38 是出以上的結果 为OK
而 smartctl 5.39 是出以下結果
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
关键词是PASSED
所以要分析判断多种情况
据我所知道的 smartctl 5.38 是出以上的結果 为OK
而 smartctl 5.39 是出以下結果
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
关键词是PASSED
所以要分析判断多种情况
4、脚本编写步骤
1)了解nagios插件编写规范
Nagios的插件可以用脚本(shell、Perl)C编译后的可执行程序,但必须满足以下两件事:
A、既出时有一个返回值
B、至少向标准输出设备(STDOUT)输出一行文件。(但也不能太大,默认是4K,如果想大些,修改源程序吧,方法搜。。。)
返回值定义:B、至少向标准输出设备(STDOUT)输出一行文件。(但也不能太大,默认是4K,如果想大些,修改源程序吧,方法搜。。。)
Plugin Return Code
|
Service State
|
DISK State
|
0
|
OK
|
OK 或者PASSED
|
1
|
WARNING
|
插件警告 DISK报警只分OK或者CRITICAL
|
2
|
CRITICAL
|
DISK检测非OK 或者PASSED
|
3
|
UNKNOWN
|
未知状态
|
2)插件编写SHELL速成法
在这里我选用我最熟悉的SHELL进行脚本编写 ,
我的速成法就是,直接去nagios exchange 去下比较成熟的比较简单的shell脚本,这样会从一开始借鉴别人好的方法,养成好的习惯,而且只要你有一点SHELL编程经验也可以很快写得像一个老手。(不过不要把自己搞晕了就行)
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返回的状态变量
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.
# 定义关键的核心命令smartctl 路径 如果你的系统不是这个地址,请更改。 以下注释的是调试的信息,是自动获取命令路径的方法。
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
# 定义默认的检测硬盘
CHECK_DISK="/dev/sda"
# Plugin variable description
# 插件描述信息
PROGNAME=$(basename $0)
RELEASE="Revision 1.2.0"
AUTHOR="(c) 2009 Ajian (ajian521@gmail.com)"
# Functions plugin usage
# 插件的使用方法函数
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
# 传递参数
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