1. 程式人生 > >關於nagios系統下使用shell指令碼自定義監控外掛的編寫以及沒有實時監控圖的問題

關於nagios系統下使用shell指令碼自定義監控外掛的編寫以及沒有實時監控圖的問題

關於nagios系統下shell自定義監控外掛的編寫、指令碼規範以及沒有實時監控圖的問題的解決辦法

在自已編寫監控外掛之前我們首先需要對nagios監控原理有一定的瞭解

Nagios的功能是監控服務和主機,但是他自身並不包括這部分功能,所有的監控、檢測功能都是通過各種外掛來完成的。

啟動Nagios後,它會週期性的自動呼叫外掛去檢測伺服器狀態,同時Nagios會維持一個佇列,所有外掛返回來的狀態資訊都進入佇列, Nagios每次都從隊首開始讀取資訊,並進行處理後,把狀態結果通過web顯示出來。

Nagios提供了許多外掛,利用這些外掛可以方便的監控很多服務狀態。安裝完成後,在nagios主目錄下的/libexec裡放有nagios自帶的可以使用的所有外掛,

如,check_disk是檢查磁碟空間的外掛,check_load是檢查CPU負載的,等等。基本上每一個外掛可以通過執行./check_xxx –h 來檢視其使用方法和功能。

Nagios可以識別4種狀態返回資訊:

0(OK)表示狀態正常/綠色、

1(WARNING)表示出現警告/黃色

2(CRITICAL)表示出現非常嚴重的錯誤/紅色

3(UNKNOWN)表示未知錯誤/深黃色。

Nagios根據外掛返回來的值,來判斷監控物件的狀態,並通過web顯示出來,以供管理員及時發現故障。

當我們知道了nagios是通過命令返回值來判斷狀態,在shell中也即是通過命令的退出狀態碼來判斷,這樣我們可以自已編寫一個監控指令碼

1.編寫檢查weburl地址的外掛

可以如下的命令及語法進行編寫。

[[email protected] libexec]# cat check_url

#!/bin/bash

#get the shell script name

PROGNAME=`basename $0`

#get the file path

PROGPATH=`dirname $0`

usage() {

      echo "Usage: /bin/sh  $PROGNAME url"

      exit 1

  }

[ $# -ne 1 ] &&usage

. $PROGPATH/utils.sh

t=`ping -c1 $1|awk 'NR==2 {print $7,$8}'`

o=`ping -c1 $1|awk 'NR==5{print $12}'`

ping -c1 $1>/dev/null 2>&1

if [ $? -eq 0 ]

then

    echo "Url $1 OK|$t;0.000000 size=295B;;;0"

    exit $STATE_OK

else

    echo "Url $1 NO|Socket timeout after $o"

    exit $STATE_CRITICAL

fi

接下來,指令碼授權可執行 以及主動監控指令碼寫進command.cfg ,服務寫進services.cfg

企業級監控nagios實踐文件已經說過。  自行操作。

編寫監控指令碼是請參考utils.sh 規範

以上監控指令碼的編寫,在此作為一種編寫nagios監控外掛的思路,其中在if語句中的echo語句中、我們可以發現輸出的內容是由 | 分隔

其中只寫入"|"之前的內容也行,"|"之後的的內容為可選見容, nagios會將"|"之後的內容作為效能資料輸出 。

得到效能資料之後會在伺服器端/usr/local/nagios/share/perfdata下生成檔案。

如可輸出給pnp4nagios,效能資料格式如下:

'label'=value[UOM];[warn];[crit];[min];[max]

需要注意的是:

1、效能資料的多個選項值之間用分號;分割

2、如果label中包含空格、等號、或者單引號,則label需要用單引號來括起來

3、warn/crit/min/max可以為null值

value, min and max只能為負號"-" "0到9"和小數點"." 並且單位必須統一

4、如果UOM單位是%,則min和max不需要再指定

5、UOM單位可以是如下: 預設空,表示數量(用於使用者數、處理器數等)

s    表示秒(也可以用us,ms)

%    表示百分比

B    表示位元組(也可以用KB,MB,TB,GB)

c    一個連續的計數(如:介面傳輸的位元組數)

實際情況中效能資料選項值,可以參考已有監控外掛的返回值。

[[email protected] ~]# cd /usr/local/nagios

[[email protected] nagios]# chown nagios.nagcmd share

 

使用者和組必須改為:nagios nagcmd 

檔案的許可權問題,web使用者apache無法在/usr/local/nagios/share中寫入。在前面已經把使用者apache加入組nagcmd中了,所以直接改變資料夾的所有者和所屬的組就可以了。

下一步

重新載入nagios

/etc/init.d/nagios reload

可以看到自己寫的監控指令碼 有實時監控圖了。 OK

2.編寫一個被動外掛,監控客戶端的/dev/sda3分割槽的如果磁碟佔用率超過7%報警exit 2,如果不大於7%不報警,exit 0

[[email protected] libexec]# cat check_sda3

#! /bin/bash

#get the shell script name

PROGNAME=`basename $0`

#get the file path

PROGPATH=`dirname $0`

usage() {

      echo "Usage: /bin/sh  $PROGNAME url"

      exit 1

  }

[ $# -ne 1 ] &&usage

. $PROGPATH/utils.sh

n=`df -i|awk 'NR==2{print $5}'|sed 's/'%'//g'`

if [ $n -le 7 ]

then

        echo "disk usage rate is ok!|sda3=$n;7;50;0;100"

        exit $STATE_OK

elif [ $n -gt 7 -a $n -le 50 ]

then

        echo "disk usage rate is warning!!|sda3=$n;7;50;0;100"

        exit $STATE_WARNING

elif [ $n -gt 50 ]

then

        echo "disk usage rate is critical!!!|sda3=$n;7;50;0;100"

        exit $STATE_CRITICAL

fi

[[email protected] libexec]#