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

Nagios 如何參數傳遞給 NRPE

如何讓 NRPE 允許接收參數的傳遞是這次的重點

在遠端 Nagios Server 上,使用 check_nrpe 並以傳遞參數的方貸式,取得監控主機的服務狀態。卻得到以下的錯誤訊息:

[root@xxx ~]# /usr/local/nagios/libexec/check_nrpe -H 2.xx.xx.xx -c check_pingtest -a " -H 1.2.3.4 -w 150,30% -c 200,50% -p 5"
CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages.

在被監控端主機查看日誌,發現以下訊息。而它說明 NRPE 目前是無法接受傳遞參數的狀態查詢:

/var/log/message
Jun 5 07:41:31 xxx nrpe[10807]: Error: Request contained command arguments!
Jun 5 07:41:31 xxx nrpe[10807]: Client request was invalid, bailing out...

因此需要在被監控端要做的事:
1. 重新編譯安裝 nrpe 帶這個參數 –enable-command-args 讓編譯後的 nrpe 可以接收參數。

./configure --enable-command-args;make all ;make install
#####allows clients to specify command arguments. *** THIS IS A SECURITY RISK! *** Read the SECURITY file before using this option!

2. 編輯 /usr/local/nagios/etc/nrpe.cfg 設定檔 :

dont_blame_nrpe=1 #打開參數傳遞功能
...........................
...
command[check_pingtest]=/usr/local/nagios/libexec/check_ping -H $ARG1$ -w 1500,100% -c 2000,100% -p $ARG2$ -t 10 #宣告帶參數的檢查命令

Nagios Server 服務端測試:

[root@xxx ~]# /usr/local/nagios/libexec/check_nrpe -H 2.xx.xx.xx -c "check_pingtest" -a 1.2.3.4 10

測試ok 返回結果:PING OK – Packet loss = 0%, RTA = 53.43 ms|rta=53.426998ms;1500.000000;2000.000000;0.000000 pl=0%;100;100;0
Note:ping

Use google calendar api to Nagios send notification by SMS

經過之前的安裝與設定,大略已經知道 python 版的 google api 是如何操作與使用 google calendar 。而這次的記錄主要是能讓 nagios 的事件,透過 google calendar api 來發送簡訊通知

Nagios 要使用 google api ,它上面必需要安裝 google api 。如果 Nagios 還沒安裝 google api 就趕緊安裝吧!因為我的 Nagios server 是架在 FreeBSD 上,所以還要再安裝一次 google api 。

在 Nagios 上需要修改幾個檔案來才能使用 Google 簡訊通知服務:

  • /usr/local/etc/nagios/object/command.cfg #命令定義配置檔
  • /usr/local/etc/nagios/object/contacts.cfg #通知聯絡配置檔

繼續閱讀

由nrpe.cfg配置不當引起的CHECK_NRPE: Error -Could not complete SSL handshake

文章出處:由nrpe.cfg配置不當引起的CHECK_NRPE: Error -Could not complete SSL handshake

一般Linux都自帶了openssl和openssl-devel,並且系統iptables也不會阻攔5666端口通訊。我按照網上提供的步驟安裝nrpe,然後作為服務運行,然後運行檢查命令 check_nrpe -H ip,結果發現
繼續閱讀