Nagios monitoring remote server’s temperature of HDD by smartmon

因為先前遇到伺服器的硬碟抽取盒風扇故障,造成伺服器硬碟過熱當機的狀況。有鑑於此,不想在歷史重演。於是就用 smartmon 套件工具來寫了一個 nagios 檢查硬碟的監控命令腳本。腳本的功能很簡單,只用 smartctl 指令取得指定硬碟的smart資訊,在用 grep、awk 取得硬碟攝氏溫度值。判斷溫度值是屬於何種狀態等級,輸出相對應的狀態說明及回傳狀態代碼。

在 NRPE client Host 端:
寫個檢查硬碟溫度的腳本,下面是 check_temperature.sh 的內容:

#!/bin/bash
# create date :20120815
# create by jerry yang

#description use smartctl and grep to get temperature raw value,then use this value to identify status.

PATH=/usr/bin/:/usr/sbin/:/usr/local/bin/:/usr/local/sbin/:/bin/
disk_path=$1
echo "$(date) path $1 " >> /tmp/pass_argv.log
#nagios error codes
OK=0
WARNING=1
CRITICAL=2
UNKNOWN=3
WARNING_limit=40
CRITICAL_limit=50

temperature=$(smartctl -a -d ata $disk_path | grep ^194 | awk '{print  $10}')
message="The disk [$1]'s temperature is $temperature C"
if ! [[ $temperature =~ ^[0-9]+$ ]]; then
    echo "State UNKNOWN ! can't find the disk device. please,check the disk is exist."
    exit $UNKNOWN
fi

if [[ $temperature -lt $WARNING_limit ]]
then
    echo "State OK ! $message"
    exit $OK
elif [[ $temperature -lt $CRITICAL_limit ]]
then
    echo "State WARNING ! $message"
    exit $WARNING
elif [[ $temperature -eq $CRITICAL_limit || $temperature -gt $CRITICAL_limit ]]
then
    echo "State CRITICAL ! $message"
    exit $CRITICAL
fi

這段腳本執行需要指定硬碟路徑作為參數才能傳回正常值。也是為了給 nrpe 可以傳遞參數使用。還有一個重點是 NRPE 預設是以「nagios」的帳號執行運作,而命令 smartctl 須以 root 的權限執行才能正確訪問到指定的硬碟路徑。
因此,我們編輯「/etc/sudoers」設定讓nagios不用打密碼就能以root的身份執行我們所指定的腳本程式。

編輯/etc/sudoers的命令

visudo

在/etc/sudoers 檔案尾加上一行設定,讓 nagios 不需要密碼以 root 的身份執行腳本。

nagios ALL = (root) NOPASSWD: /usr/local/nagios/libexec/check_temperature.sh

NRPE 的編譯安裝時需要特別指定編譯參數「enable-command-args」,加入允許接收命令參數的功能。並使用「xinted」來管理 NRPE 。

wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.13.tar.gz
tar -xzvf nrpe-2.13.tar.gz
cd nrpe-2.13
./configure --enable-command-args
make all
make install-plugin
make install-daemon
make install-daemon-config
make install-xinetd

編輯 /etc/xinted.d/nrpe ,允許 Nagios Server 可以透過 check_nrpe 命令來 NRPE client 。

# default: on
# description: NRPE (Nagios Remote Plugin Executor)
service nrpe
{
        flags           = REUSE
        socket_type     = stream
        port            = 5666
        wait            = no
        user            = nagios
        group           = nagios
        server          = /usr/local/nagios/bin/nrpe
        server_args     = -c /usr/local/nagios/etc/nrpe.cfg -i
        log_on_failure  += USERID
        disable         = no
        only_from       = 192.168.128.116 127.0.0.1
}

only_from 設定哪些 IPADDRESS 可以訪問 NRPE 服務,我的 Nagios Server IP 是 192.168.128.l16 。

啟動 xinted 服務

/etc/init.d/xinted start

編輯 /usr/local/nagios/etc/nrpe.cfg ,在這設定開啟 NRPE 可接收參數的功能與設定檢查命令(利用我們的腳本來取得指定硬碟的溫度值)。

# COMMAND ARGUMENT PROCESSING
# This option determines whether or not the NRPE daemon will allow clients
# to specify arguments to commands that are executed.  This option only works
# if the daemon was configured with the --enable-command-args configure script
# option.
#
# *** ENABLING THIS OPTION IS A SECURITY RISK! ***
# Read the SECURITY file for information on some of the security implications
# of enabling this variable.
#
# Values: 0=do not allow arguments, 1=allow command arguments

dont_blame_nrpe=1
.....
....
...
command[check_temperature]=/usr/bin/sudo /usr/local/nagios/libexec/check_temperature.sh $ARG1$

dont_blame_nrpe=1 設定為「1」,允許命令可帶參數。最後一行設定命令,而這個命令可以帶一個參數(注意:命令前面有加 「sudo」 )。

在 Nagios Server 端:
先用 check_nrpe 指定查詢命令並帶查詢命令的參數來做測試。命令大致如下:

./check_nrpe -H 192.168.128.231 -c check_temperature -a /dev/sda

執行命令之前需要切換到「check_nrpe」所在的目錄下。

如果上面的測試沒有問題,就可以將上面這一行檢查命令寫到監控主機的設定檔上,將它定義為服務檢查的項目。
下面是主機「filer01.cfg」設定檔片段:

define service{
        use                             local-service
        host_name                       filer01
        service_description             Disk /dev/sda temperature
        check_command                   check_nrpe!check_temperature -a /dev/sda
        }
define service{
        use                             local-service
        host_name                       filer01
        service_description             Disk /dev/sdb temperature
        check_command                   check_nrpe!check_temperature -a /dev/sdb
        }
define service{
        use                             local-service
        host_name                       filer01
        service_description             Disk /dev/sdc temperature
        check_command                   check_nrpe!check_temperature -a /dev/sdc
        }
define service{
        use                             local-service
        host_name                       filer01
        service_description             Disk /dev/sdd temperature
        check_command                   check_nrpe!check_temperature -a /dev/sdd
        }
define service{
        use                             local-service
        host_name                       filer01
        service_description             Disk /dev/sde temperature
        check_command                   check_nrpe!check_temperature -a /dev/sde
        }

上面定義了五個檢查項目,它們都使用同一個命令來做檢查,但只是使用不同的命令參數罷了(硬碟路徑代號)。

設定完成後,記得要讓 Nagios 重新載入設定檔才算是完成設定喔!

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s