[nagios] CRITICAL – popen timeout received, but no child process

CRITICAL – popen timeout received, but no child process.

需要指定使用 ipV4 參數來執行 check_ping 的檢查

修正 nagios 的 command.cfg check_ping 命令的設定僅使用IPV4來檢查

define command{
        command_name    check-host-alive
        command_line    $USER1$/check_ping -4 -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5 -4
}

在 Nagios 上使用 timeperiod template 建立檢查時段的定義

在 Nagios 上使用 timeperiod template 建立檢查時段的定義,當定義設定完成後,即可套用於主機或是服務的檢查上,設定其要檢查時間區段。check_period 是設定參數。

例如:設定在 exchange2000 資料庫自動維護的期間不執行檢查..

在時間期間模板中加入exchange2000自訂的檢查區間

define timeperiod{
        timeperiod_name exchange2000_db_maintain
        alias           exchange2000 db maintain periods

        sunday          05:00-06:00
        monday          05:00-06:00
        tuesday         05:00-06:00
        wednesday       05:00-06:00
        thursday        05:00-06:00
        friday          05:00-06:00
        saturday        05:00-06:00
        }

define timeperiod{
        timeperiod_name exchange2000_timeperiod
        alias           exchange2000 check timeperiod,exclude 05:00-06:00 everydays.

        sunday          00:00-24:00
        monday          00:00-24:00
        tuesday         00:00-24:00
        wednesday       00:00-24:00
        thursday        00:00-24:00
        friday          00:00-24:00
        saturday        00:00-24:00

        exclude         exchange2000_db_maintain        ;
        }

exchage2000 的設定檔中,指定剛設定的檢查時間區間(host 與 services 是分開指定的)。

# Define a host for the local machine

define host{
        use                     windows-server          ; Name of host template to use
                                                        ; This host definition will inherit all variables that are defined
                                                        ; in (or inherited by) the freebsd-server host template definition.
        check_period            exchange2000_timeperiod
        host_name               mail2
        alias                   mail2
        address                 192.168.128.251
        }

###############################################################################
###############################################################################
#
# SERVICE DEFINITIONS
#
###############################################################################
###############################################################################

# Define a service to CPU on the remote machine.

define service{
        use                             local-service
        check_period                    exchange2000_timeperiod
        host_name                       mail2
        service_description             CPU load
        check_command                   CheckCPU!80!90
        }

讓Nagios服務檢查略過 Exchange2000 DB Maintain Period

將 Exchange2000 轉到 Proxmox 後,Nagios 一直都會在 exchange2000 db maintain 的時段報錯(time out)。為解決此一問題,決定讓 Nagios 略過exchange 資料庫維護期間的服務檢查。

所以在 naigos 的 timeperiod.cfg 設定檔,定義兩個時段的設定。定義週一到週日早上05:00~06:00時段這是要用來略過的時段,及Exchange2000服務檢查所要套用的時段(包含全時段設定,但不含要略過的時段)。

define timeperiod{
timeperiod_name exchange2000_db_maintain
alias exchange2000 db maintain periods

sunday 05:00-06:00
monday 05:00-06:00
tuesday 05:00-06:00
wednesday 05:00-06:00
thursday 05:00-06:00
friday 05:00-06:00
saturday 05:00-06:00
}

define timeperiod{
timeperiod_name exchange2000_timeperiod
alias exchange2000 check timeperiod,exclude 05:00-06:00 everydays.

sunday 00:00-24:00
monday 00:00-24:00
tuesday 00:00-24:00
wednesday 00:00-24:00
thursday 00:00-24:00
friday 00:00-24:00
saturday 00:00-24:00

exclude exchange2000_db_maintain ;
}

接著修改 Exchange2000 設定檔 define host 區塊 及 每個 define service 區塊 中加入 check_period 參數,指定檢查時間區段。

# Define a host for the local machine

define host{
use windows-server ; Name of host template to use
; This host definition will inherit all variables that are defined
; in (or inherited by) the freebsd-server host template definition.
check_period exchange2000_timeperiod
host_name mail2
alias mail2
address 192.168.128.251
}

# Define a service to CPU on the remote machine.

define service{
use local-service
check_period exchange2000_timeperiod
host_name mail2
service_description CPU load
check_command CheckCPU!80!90
}

最後就是讓 Nagios 服務重新載入新的設定囉!

/usr/local/etc/rc.d/nagios reload

FreeBSD 9.0 install Nagios 3.4.1

更新 package-tree :
//如果是第一次更新取得 package-tree
# portsnap fetch ; portsnap extract ; portsnap update ;
//之後僅需要 fetch 和 update
# portsnap fetch ; portsnap update ;

安裝 nagios :
# cd /usr/ports/net-mgmt/nagios
# make ; make install ; // 首次安裝 nagios
# make ; make deinstall ; make reinstall //先前已安裝過 nagios

設定 nagios :

//切換至 nagios 設定檔目錄下
# cd /usr/local/etc/nagios
//將範例設定檔更名為正確設定檔名稱
# cp cgi.cfg-sample cgi.cfg ; cp nagios.cfg-sample nagios.cfg ; cp resource.cfg-sample resource.cfg

//切換至 nagios/objects 物件設定檔放置的目錄下
# cd /usr/local/etc/nagios/objects
//將其中的範例設定檔更名為正確的設定檔名稱
# cp commands.cfg-sample commands.cfg ; cp contacts.cfg-sample contacts.cfg ; cp printer.cfg-sample printer.cfg ; cp templates.cfg-sample templates.cfg ; cp localhost.cfg-sample localhost.cfg ; cp switch.cfg-sample switch.cfg ; cp timeperiods.cfg-sample timeperiods.cfg

允許 Freebsd 可以啟動 nagios:
//編輯 /etc/rc.conf 加入 「nagios_enable="yes"」 字串於檔案中
# echo nagios_enable="YES" >> /etc/rc.conf

啟動 nagios 服務:
# /usr/local/etc/rc.d/nagios start

安裝 LAMP :
//MySQL 安裝
# cd /usr/ports/databases/mysql50-server
# make WITH_CHARSET=utf8 WITH_XCHARSET=all WITH_COLLATION=utf8_unicode_ci BUILD_OPTIMIZED=yes install clean

安裝好之後,我們要產生 MySQL 一開始所要用的 Database,預設會裝在 /var/db/mysql 裡 ( 若不想裝在預設的地方,安裝時下參數 –localstatedir=/path/to/your/location )
# rehash
# mysql_install_db

複製 MySQL 的系統設定檔到 /etc 下
# cp /usr/local/share/mysql/my-xxx.cnf /etc/my.cnf

設定 MySQL 資料庫權限,並且啟動它
# chown -R mysql:mysql /var/db/mysql
# echo “mysql_enable=yes” >> /etc/rc.conf
# /usr/local/etc/rc.d/mysql-server start

設定 MySQL Root 的密碼
# mysqladmin -u root password 新密碼

若是更新舊的版本,就稍微注意一下
Remember to run mysql_upgrade (with the optional –datadir=<dbdir> flag) the first time you start the MySQL server after an upgrade from an earlier version.

最後我們可以測試登入一下 MySQL,有出現以下畫面就 OK
# mysql -u root -p
Enter password: (請輸入密碼)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.60-log FreeBSD port: mysql-server-5.1.60
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

安裝 Apache :
# cd /usr/ports/www/apache22
# make install clean

安裝 php
# cd /usr/ports/lang/php5
# make config install clean

記得要勾選此選項喔,不然 Apache 會不認得 PHP
APACHE Build Apache module

再安裝 PHP Extensions
# cd /usr/ports/lang/php5-extensions
# make config install clean

建議加勾選 GD、MYSQL、MySQLI、MBSTRING、ZIP 和 ZLIB

修改設定檔:
首先設定 PHP 的設定檔,以後就是設定 php.ini 這檔
# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

修改 Apache 的設定
# vi /usr/local/etc/apache22/httpd.conf

在最上面加入
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

找到
DirectoryIndex index.html
把它變成
DirectoryIndex index.php index.html index.htm

設定一開機啟動 Apache & MySQL
# vi /etc/rc.conf

加入這三行
apache22_enable="YES"
apache22_http_accept_enable="YES"
mysql_enable="YES"

nagios account can’t sudo on ubuntu

查看 naigos 帳號在 /etc/passwd 的設定值,其 shell 是給予 /bin/false,所以執行 visudo 並設定讓 naigos 可不打密碼就能執行檢查硬碟溫度腳本「/usr/lib/nagios/plugins/check_temperature」 ,但是卻無法正常執行。

解決方法就是修改 /etc/shells 加入 /bin/false 到檔案中。之後..

sudo -u naigos sudo /usr/lib/nagios/plugins/check_temperature /dev/sda

就可以正常顯示出該硬碟的溫度。

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 重新載入設定檔才算是完成設定喔!