Linux實戰教學筆記35:企業級監控Nagios實踐(下)

七,服務器端Nagios圖形監控顯示和管理

前面搭建的Nagios服務雖然能顯示信息,能報警。可是在企業工做中還會須要一個歷史趨勢圖,跟蹤每個業務的長期趨勢,而且能以圖形的方式展現,例如:根據磁盤的剩餘趨勢,肯定是否須要提早購買磁盤。php

7.1 服務器端安裝PNP生成圖形監控曲線

PNP是一款配合Nagios出圖的軟件,官方站點爲:http://www.pnp4nagios.orghtml

7.1.1 PNP出圖基礎依賴軟件安裝

[root@Nagios 6]# yum -y install cairo pango zlib zlib-devel freetype freetype-devel gd gd-devel
[root@Nagios 6]# rpm -qa cairo pango zlib zlib-devel freetype freetype-devel gd gd-devel
freetype-2.3.11-17.el6.x86_64
zlib-1.2.3-29.el6.x86_64
zlib-devel-1.2.3-29.el6.x86_64
freetype-devel-2.3.11-17.el6.x86_64
gd-2.0.35-11.el6.x86_64
gd-devel-2.0.35-11.el6.x86_64
cairo-1.8.8-6.el6_6.x86_64
pango-1.28.1-11.el6.x86_64

#而後安裝rrdtool依賴的libart_lgpl相關軟件包,這個軟件包要優先於rrdtool安裝
[root@Nagios 6]# yum -y install libart_lgpl libart_lgpl-devel
[root@Nagios 6]# rpm -qa libart_lgpl libart_lgpl-devel
libart_lgpl-2.3.20-5.1.el6.x86_64
libart_lgpl-devel-2.3.20-5.1.el6.x86_64

#PNP工具最終是經過rrdtool實現的畫圖,所以須要提早安裝rrdtool
[root@Nagios 6]# yum -y install rrdtool rrdtool-devel
[root@Nagios 6]# rpm -qa rrdtool rrdtool-devel
rrdtool-1.3.8-10.el6.x86_64
rrdtool-devel-1.3.8-10.el6.x86_64
[root@Nagios 6]# which rrdtool
/usr/bin/rrdtool

7.1.2 安裝出圖web界面展現軟件PNP

此處選擇0.4.14的PNP版本,若是選擇高版本在出圖方面可能會有坑,正常狀況下,選04版本已經足夠了,所以,若是沒有特殊需求,建議最好徹底按照書本測試步驟,在弄清楚以後再變通版本。linux

PNP軟件沒法yum安裝,可經過編譯的方式進行安裝,操做過程以下:ios

[root@Nagios ~]# yum -y install perl-Time-HiRes
[root@Nagios ~]# cd nagios/
[root@Nagios nagios]# ll pnp-0.4.14.tar.gz 
-rw-r--r--. 1 root root 455593 Aug 12 12:22 pnp-0.4.14.tar.gz
[root@Nagios nagios]# tar xf pnp-0.4.14.tar.gz -C /usr/src/
[root@Nagios nagios]# cd /usr/src/pnp-0.4.14/
[root@Nagios pnp-0.4.14]# ./configure \ 

> --with-rrdtool \
> --with-perfdata-dir=/usr/local/nagios/share/perfdata/
[root@Nagios pnp-0.4.14]# make all
[root@Nagios pnp-0.4.14]# make install
[root@Nagios pnp-0.4.14]# make install-config
[root@Nagios pnp-0.4.14]# make install-init
[root@Nagios pnp-0.4.14]# ll /usr/local/nagios/libexec/ | grep process
-rwxr-xr-x  1 nagios nagios  31813 Aug 19 23:04 process_perfdata.pl

若是configure後出現以下警告信息,請忽略:web

#################

# WARNING:The RRDs Perl Modules are not found on your System

# Using RRDs will speedup things in larg

##################

PNP提供了一個獲取數據出圖的Perl腳本,能夠用以下命令查到:面試

[root@Nagios pnp-0.4.14]# ll /usr/local/nagios/libexec/ | grep process
-rwxr-xr-x  1 nagios nagios  31813 Aug 19 23:04 process_perfdata.pl

7.1.3 Nagios出圖相關配置

1)執行編輯命令vi,須要改nagios.cfg主配置文件833行,將以下參數對應的值從0改成1,表示記錄數據。shell

[root@Nagios nagios]# sed -n '833p' /usr/local/nagios/etc/nagios.cfg 
process_performance_data=0    #默認0,改成1

#而後繼續向下大概在845,846行的位置,找到以下兩項,取消參數開頭的註釋。
[root@Nagios nagios]# sed -n '845,846p' /usr/local/nagios/etc/nagios.cfg 
#host_perfdata_command=process-host-perfdata    #取消註釋
#service_perfdata_command=process-service-perfdata  #取消註釋

2)執行編輯命令vi,須要修改commands.cfg配置文件,定義出圖獲取數據的命令。vim

[root@Nagios nagios]# sed -n '227,238p' /usr/local/nagios/etc/objects/commands.cfg 
# 'process-host-perfdata' command definition
define command{
    command_name process-host-perfdata
    command_line  /usr/bin/printf "%b"             "$LASTHOSTCHECK$\t$HOSTNAME$\t$HOSTSTATE$\t$HOSTATTEMPT$\t$HOSTSTATETYPE$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$\n" >>/usr/local/nagios/var/host-perfdata.out
}
# 'process-service-perfdata' command definition
define command{
    command_name process-service-perfdata
    command_line /usr/bin/printf "%b" "$LASTSERVICECHECK$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICESTATE$\t$SERVICEATTEMPT$\t$SERVICESTATETYPE$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$\n" >>/usr/local/nagios/var/service-perfdata.out
}

如今刪除上述的默認配置,而後將其修改成以下的配置內容:瀏覽器

[root@Nagios nagios]# sed -n '227,238p' /usr/local/nagios/etc/objects/commands.cfg 
# 'process-host-perfdata' command definition
define command{
    command_name    process-host-perfdata
    command_line    /usr/local/nagios/libexec/process_perfdata.pl
    }
# 'process-service-perfdata' command definition
define command{
    command_name    process-service-perfdata
    command_line    /usr/local/nagios/libexec/process_perfdata.pl
    }

3)執行檢查語法命令bash

[root@Nagios nagios]# /etc/init.d/nagios checkconfig
#..以上省略若干...
Total Warnings: 0
Total Errors:   0
Things look okay - No serious problems were detected during the pre-flight check
 OK

4)執行命令使Nagios配置文件生效。

[root@Nagios nagios]# /etc/init.d/nagios reload     
Running configuration check...done.
Reloading nagios configuration...done

5)此時打開瀏覽器訪問「http://192.168.0.200/nagios/pnp/」,應該會出現以下圖所示的圖形界面,可是沒有業務數據顯示。

QQ截圖20170820114101.png-103.1kB

若是同窗們打開出現以下錯誤:

QQ截圖20170820111137.png-58.8kB

若是出現上圖中的錯誤,先彆着急,可能過一下子從新訪問上述地址就會恢復正常。
若是過了很長時間從新訪問上述地址還不正常,能夠執行以下命令看看,而後再訪問試試:
yum -y install php-gd gd gd-devel

7.2 配置主機及服務獲取狀態數據出圖

7.1結尾的圖形是沒有具體的業務數據圖形趨勢的,由於那時尚未爲Nagios的各個主機和具體要監控的服務配置獲取數據信息,下面是讓各個主機或服務獲取數據的配置。

7.2.1 設置讓被監控的主機記錄數據

若是要讓全部的主機獲取數據並出趨勢圖,則需編輯Nagios的主機hosts.cfg文件,不過,只要在每個被監控主機的配置下面增長同一個參數項「process_perf_data 1」便可。操做步驟以下:

[root@Nagios nagios]# cd /usr/local/nagios/etc/objects/
[root@Nagios objects]# cat hosts.cfg

# Define a host for the local machine
define host{
        use                     linux-server            
        host_name               web01
        alias                   web01
        address                 192.168.0.223
    process_perf_data 1    #爲web01增長1此行,表示記錄web01主機狀態數據
        }
define host{
        use                     linux-server            
        host_name               web02
        alias                   web02
        address                 192.168.0.224
    process_perf_data 1     #爲Web02增長此行,表示記錄web02主機狀態數據
        }

define hostgroup{
        hostgroup_name  linux-servers 
        alias           Linux Servers 
        members         web01,web02

7.2.2 設置讓被監控主機對應的服務記錄數據

若是須要全部的主機對應的服務獲取數據並出趨勢圖,則要編輯Nagios的服務配置文件services.cfg,固然,也只須要在每個對應服務下面增長同一個參數項便可,即「process_perf_data 1」,配置步驟以下:

[root@Nagios objects]# cat /usr/local/nagios/etc/objects/services.cfg 

define service {
    use generic-service
    host_name web01,web02
    service_description Disk Partition
    check_command check_nrpe!check_disk
    process_perf_data 1             #爲每一個service添加此行
}
define service {
    use generic-service
    host_name web01,web02
    service_description Swap Useage
    check_command check_nrpe!check_swap
    process_perf_data 1             #爲每一個service添加此行
}
define service {
    use generic-service
    host_name web01,web02
    service_description MEM Useage
    check_command check_nrpe!check_mem
    process_perf_data 1             #爲每一個service添加此行
}
define service {
    use generic-service
    host_name web01,web02
    service_description Current Load
    check_command check_nrpe!check_load
    process_perf_data 1                 #爲每一個service添加此行
}
define service {
    use generic-service
    host_name web01,web02
    service_description Disk lostat
    check_command check_nrpe!check_iostat!5!11
    process_perf_data 1                 #爲每一個service添加此行
}
define service {
    use generic-service
    host_name web01,web02
    service_description PING
    check_command check_ping!100.0,20%!500.0,60%
    process_perf_data 1                 #爲每一個service添加此行
}

#url examples http://www.yunjisuan.com

define service {

    use generic-service
    host_name web01
    service_description www_url
    check_command check_weburl! -H www.yunjisuan.com
    process_perf_data 1                 #爲每一個service添加此行
    
}

define service {

    use generic-service
    host_name web01
    service_description www_url
    check_command check_http
    process_perf_data 1                 #爲每一個service添加此行

}

define service {

    use generic-service
    host_name web01
    ervice_description www_static_url
    check_command check_weburl! -H www.yunjisuan.com -u /static/test.html
    process_perf_data 1                 #爲每一個service添加此行

}

define service {

    use generic-service
    host_name web01
    service_description www_yunjisuan_url
    check_command check_weburl! -H www.yunjisuan.com -u "/article/index.phpm=article&a=list&id=670"
    process_perf_data 1                 #爲每一個service添加此行

}

#tcp examples
define service {

    use generic-service
    host_name web01
    service_description ssh_22
    check_command check_tcp! 22
    process_perf_data 1                     #爲每一個service添加此行

}

define service {

    use generic-service
    host_name web01
    service_description http_80
    check_command check_tcp! 80
    process_perf_data 1                     #爲每一個service添加此行
    
}

因爲每一個主機對應的服務內容太多了,所以能夠採起在全部服務對應的統一模板裏添加配置參數的方式,這樣可以使全部的服務均可以生效。這裏每一個服務使用的模板就是由服務裏的「use generic-service」這個選項肯定的,查看與模板文件裏服務模板generic-service名對應的服務參數:

[root@Nagios objects]# sed -n '154,177p' /usr/local/nagios/etc/objects/templates.cfg | awk -F ";" '{print $1}'
        name                            generic-service     
        active_checks_enabled           1               
        passive_checks_enabled          1               
        parallelize_check               1               
        obsess_over_service             1               
        check_freshness                 0               
        notifications_enabled           1               
        event_handler_enabled           1               
        flap_detection_enabled          1               
        failure_prediction_enabled      1               
        process_perf_data               1               
        retain_status_information       1               
        retain_nonstatus_information    1               
        is_volatile                     0               
        check_period                    24x7            
        max_check_attempts              3           
        normal_check_interval           10          
        retry_check_interval            2           
        contact_groups                  admins          
    notification_options        w,u,c,r         
        notification_interval           60          
        notification_period             24x7            
         register                        0              
        }

提示:
爲了看的清晰,這裏去掉了全部註釋,服務的模板裏默認已經配置了「process_perf_data 1」,即凡是使用templates.cfg模板文件里名字爲generic-service的模板,均做爲服務的模板,這樣就至關於全部服務都執行generic-service模板裏的配置了。

配置完畢重啓Nagios服務:

[root@Nagios objects]# /etc/init.d/nagios reload     
Running configuration check...done.
Reloading nagios configuration...done

到此,若是等一段時間,而後查看PNP URL就能夠發現生成了圖形數據,有些數據須要壓力測試或者真實環境才能看到,例如主機負載等。趨勢圖以下圖所示:

QQ截圖20170820122224.png-98.7kB

7.3 整合PNP URL超連接到Nagios Web界面

在整合PNP URL超連接到Nagios Web界面後,會在全部的主機或主機對應服務的前面,出現一個閃電樣的超連接1圖標,單擊超連接,就能夠查看到對應的主機或服務實際的監控狀態趨勢圖。

7.3.1 給被監控的全部主機添加超連接圖標

默認狀況PNP的URL爲http://192.168.0.200/nagios/pnp/index.php和Nagios不在一個界面裏,因此查看主機或服務對應的趨勢圖很費勁。那麼如何完善呢?
咱們能夠直接在host.cfg裏在但願出圖的主機裏配置以下一行參數:

action_url  /nagios/pnp/index.php?host=$HOSTNAME$    #實際上就是給URL傳個主機參數

而後編輯host.cfg,增長上述配置。配置結果以下:

[root@Nagios objects]# cat /usr/local/nagios/etc/objects/hosts.cfg

# Define a host for the local machine
define host{
        use                     linux-server            
        host_name               web01
        alias                   web01
        address                 192.168.0.223
    process_perf_data 1
    action_url  /nagios/pnp/index.php?host=$HOSTNAME$    #添加超連接圖標
        }
define host{
        use                     linux-server            
        host_name               web02
        alias                   web02
        address                 192.168.0.224
    process_perf_data 1
    action_url  /nagios/pnp/index.php?host=$HOSTNAME$    #添加超連接圖標
        }

define hostgroup{
        hostgroup_name  linux-servers 
        alias           Linux Servers 
        members         web01,web02
        }

接着,檢查語法從新加載Nagios

[root@Nagios objects]# /etc/init.d/nagios reload
Running configuration check...done.
Reloading nagios configuration...done

若是配置過程都正確,打開瀏覽器訪問Nagios界面,最終能夠看到以下圖所示的圖形。圖中,右邊方框裏標記的白色方格里,中間帶波浪線的就是超連接圖標。單擊進去便可看到一個主機全部的服務圖。

QQ截圖20170820134626.png-42.9kB

7.3.2 給被監控主機指定的服務添加超連接圖標

和上述主機添加超連接圖標的配置幾乎同樣,執行「vi /usr/local/nagios/etc/objects/services.cfg」,添加以下內容:

action_url /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$

#實際上就是給URL傳了一個主機的參數和一個主機對應服務的參數

給具體服務增長超連接配置方法是,直接在define service {}大括號中增長參數便可,具體配置的內容以下「action_url參數部分」:

[root@Nagios objects]# cat /usr/local/nagios/etc/objects/services.cfg

define service {
    use generic-service
    host_name web01,web02
    service_description Disk Partition
    check_command check_nrpe!check_disk
    process_perf_data 1
    action_url /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$
    #給具體服務增長超連接配置
}
define service {
    use generic-service
    host_name web01,web02
    service_description Swap Useage
    check_command check_nrpe!check_swap
    process_perf_data 1
    action_url /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$
    #給具體服務增長超連接配置
}
define service {
    use generic-service
    host_name web01,web02
    service_description MEM Useage
    check_command check_nrpe!check_mem
    process_perf_data 1
    action_url /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$
    #給具體服務增長超連接配置
}
define service {
    use generic-service
    host_name web01,web02
    service_description Current Load
    check_command check_nrpe!check_load
    process_perf_data 1
}
define service {
    use generic-service
    host_name web01,web02
    service_description Disk lostat
    check_command check_nrpe!check_iostat!5!11
    process_perf_data 1
}
define service {
    use generic-service
    host_name web01,web02
    service_description PING
    check_command check_ping!100.0,20%!500.0,60%
    process_perf_data 1
}

#url examples http://www.yunjisuan.com

define service {

        use generic-service
        host_name web01
        service_description www_url
    check_command check_weburl! -H www.yunjisuan.com
    process_perf_data 1
    
}

define service {

    use generic-service
    host_name web01
    service_description www_url
    check_command check_http
    process_perf_data 1

}

define service {

    use generic-service
        host_name web01
        service_description www_static_url
    check_command check_weburl! -H www.yunjisuan.com -u /static/test.html
    process_perf_data 1

}

define service {

        use generic-service
        host_name web01
        service_description www_yunjisuan_url
    check_command check_weburl! -H www.yunjisuan.com -u "/article/index.phpm=article&a=list&id=670"
    process_perf_data 1

}

#tcp examples
define service {

    use generic-service
    host_name web01
    service_description ssh_22
    check_command check_tcp! 22
    process_perf_data 1

}

define service {

        use generic-service
        host_name web01
        service_description http_80
    check_command check_tcp! 80
    process_perf_data 1
    
}

配置完成後的效果圖以下:

QQ截圖20170820135700.png-78.6kB

也能夠快速設置讓所有的服務出圖,找到templates.cfg模板文件,找到默認的服務名generic-service,在這個服務名大括號的內部結尾增長「action_url /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$ 」一行便可。

[root@Nagios objects]# sed -n '153,178p' /usr/local/nagios/etc/objects/templates.cfg | awk -F ";" '{print $1}'
define service{
        name                            generic-service     
        active_checks_enabled           1               
        passive_checks_enabled          1               
        parallelize_check               1               
        obsess_over_service             1               
        check_freshness                 0               
        notifications_enabled           1               
        event_handler_enabled           1               
        flap_detection_enabled          1               
        failure_prediction_enabled      1               
        process_perf_data               1               
        retain_status_information       1               
        retain_nonstatus_information    1               
        is_volatile                     0               
        check_period                    24x7            
        max_check_attempts              3           
        normal_check_interval           10          
        retry_check_interval            2           
        contact_groups                  admins          
    notification_options        w,u,c,r         
        notification_interval           60          
        notification_period             24x7            
         register                        0              
    action_url /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$
       #在最後添加此行
        }

這樣全部主機的全部服務都將增長出圖的超連接圖標了。
如今,人要檢查語法並從新加載Nagios

[root@Nagios objects]# /etc/init.d/nagios reload
Running configuration check...done.
Reloading nagios configuration...done

所有主機和服務的監控圖最終結果以下圖所示:

QQ截圖20170820140636.png-105.5kB

此時,單擊任意一個超連接圖標,就能夠查看對應的主機或服務的業務趨勢圖了,到此,Nagios的主機和服務出圖的配置就完成了,是否是很簡單?

7.3.3 Nagios出圖獲取的數據存放路徑

想真正繪製出業務的趨勢圖全靠下面命令生成的數據。這些歷史數據要備份好。

[root@Nagios objects]# ll /usr/local/nagios/share/perfdata/
total 8
drwxr-xr-x 2 nagios nagios 4096 Aug 20 02:10 web01
drwxr-xr-x 2 nagios nagios 4096 Aug 20 02:03 web02
[root@Nagios objects]# tree /usr/local/nagios/share/perfdata/
/usr/local/nagios/share/perfdata/
|-- web01
|   |-- Current_Load.rrd
|   |-- Current_Load.xml
|   |-- Disk_Partition.rrd
|   |-- Disk_Partition.xml
|   |-- Disk_lostat.rrd
|   |-- Disk_lostat.xml
|   |-- MEM_Useage.rrd
|   |-- MEM_Useage.xml
|   |-- PING.rrd
|   |-- PING.xml
|   |-- Swap_Useage.rrd
|   |-- Swap_Useage.xml
|   |-- http_80.rrd
|   |-- http_80.xml
|   |-- ssh_22.rrd
|   |-- ssh_22.xml
|   |-- www_static_url.rrd
|   |-- www_static_url.xml
|   |-- www_url.rrd
|   |-- www_url.xml
|   |-- www_yunjisuan_url.rrd
|   `-- www_yunjisuan_url.xml
`-- web02
    |-- PING.rrd
    `-- PING.xml

2 directories, 24 files

八,實現將Nagios故障報警給管理員

要將Nagios故障報警給管理員時,經常使用的方式包括郵件報警和手機報警,下面分別介紹

8.1 郵件報警

  • 普通郵件報警就是在故障發生或恢復時,將報警信息發到系統管理員或相關維護人員的信箱中,通常來講最好使用公司內部信箱做爲報警信箱。同窗們回家學習測試時若是用QQ,126等信箱可能會有收不到郵件的狀況或者被看成垃圾郵件了。
  • 通常白天上班時,郵件報警還算比較及時,可是若是人不在計算機旁,郵件報警就不行了,所以,郵件報警只適合不是特別重要的業務,或者做爲發送大量報警信息中的一個輔助方式,如硬盤,內存,及日誌相關等不須要及時解決的服務報警。故而,在生產環境中,郵件報警通常會結合其餘報警方式一塊兒使用。
  • 那麼,下面就來看一下郵件報警的基本配置方法。

首先,添加監控報警的接收Email地址

[root@Nagios objects]# sed -n '35p' /usr/local/nagios/etc/objects/contacts.cfg | awk -F ";" '{print $1}'
        email                           215379068@qq.com    #將本行內容改爲你的QQ郵箱

打開postfix服務

[root@Nagios objects]# /etc/init.d/postfix start
Starting postfix:                                          [  OK  ]
[root@Nagios objects]# echo "/etc/init.d/postfix start" >> /etc/rc.local 
[root@Nagios objects]# tail -3 /etc/rc.local
touch /var/lock/subsys/local
/etc/init.d/nagios start
/etc/init.d/postfix start

用命令測試發郵件:

[root@Nagios objects]# echo "this is test email" | mail -s "yunjisuan" 215379068@qq.com

#將郵件從QQ攔截名單取出,而後添加白名單

QQ截圖20170820160305.png-40kB

特別警示!
同窗們在家玩Nagios必定要用本身的QQ玩,誰給我發,我和誰急-_-!

8.2 關於郵件相關的配置文件的大概解釋(喜歡的同窗本身百度含義)

templates.cfg系統定義模板

#模板:generic-service
[root@Nagios objects]# sed -n '153,178p' /usr/local/nagios/etc/objects/templates.cfg | awk -F ";" '{print $1}'
define service{
        name                            generic-service     
        active_checks_enabled           1               
        passive_checks_enabled          1               
        parallelize_check               1               
        obsess_over_service             1               
        check_freshness                 0               
        notifications_enabled           1               
        event_handler_enabled           1               
        flap_detection_enabled          1               
        failure_prediction_enabled      1               
        process_perf_data               1               
        retain_status_information       1               
        retain_nonstatus_information    1               
        is_volatile                     0               
        check_period                    24x7        #告訴Nagios檢查服務的時間段   
        max_check_attempts              3           #對Nagios服務的最大檢查次數
        normal_check_interval           10          #兩次檢查的時間間隔   
        retry_check_interval            2           #從新檢查時間間隔
        contact_groups                  admins      #指定聯繫人主 
    notification_options        w,u,c,r             #定義何種異常能夠被通知(email),w即warn表示警告狀態,r即recover,表示恢復狀態
        notification_interval           60          #服務出現異常,故障一直沒解決,Nagios再次對聯繫人發出通知的時間間隔       
        notification_period             24x7        #指定email的時間段    
         register                        0              
    action_url /nagios/pnp/index.php?host=$HOSTNAME$&srv=$SERVICEDESC$
        }

#模板:generic-contact
[root@Nagios objects]# sed -n '28,37p' /usr/local/nagios/etc/objects/templates.cfg | awk -F ";" '{print $1}'
define contact{
        name                            generic-contact     #聯繫人名稱
        service_notification_period     24x7                #服務異常,發送通知時間段
        host_notification_period        24x7                #主機異常,發送通知時間段   
        service_notification_options    w,u,c,r,f,s     #何種異常進行通知
        host_notification_options       d,u,r,f,s       #何種異常進行通知
        service_notification_commands   notify-service-by-email #定義服務異常發送郵件命令,commands.cfg文件裏定義
        host_notification_commands      notify-host-by-email #定義主機異常發送郵件命令,commands.cfg文件裏定義    
        register                        0               
        }

commands.cfg命令定義模板

#定義發送郵件命令
[root@Nagios objects]# sed -n '27,37p' commands.cfg 
# 'notify-host-by-email' command definition
define command{
    command_name    notify-host-by-email        #主機異常發送郵件命令的定義
    command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$
    }

# 'notify-service-by-email' command definition
define command{
    command_name    notify-service-by-email     #服務異常發送郵件命令的定義
    command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
    }

contacts.cfg聯繫人定義模板

[root@Nagios objects]# cat contacts.cfg | egrep -v "#|^$" | awk -F ";" '{print $1}'
define contact{
        contact_name                    nagiosadmin     #定義成員
    use             generic-contact     
        alias                           Nagios Admin    #成員別名   
        email                           215379068@qq.com    #成員郵箱
        }
define contactgroup{
        contactgroup_name       admins                  #聯繫人組名
        alias                   Nagios Administrators   #別名
        members                 nagiosadmin             #組員名單定義
        }

8.3 Nagios各個配置文件的相互間關係圖

QQ截圖20170820155456.png-22.5kB

九,Nagios插件開發

9.1 概述

9.1.1 什麼是Nagios插件

前文在部署Nagios服務時已經安裝了nagios-plugins-1.4.16.tar.gz,這個軟件包就是Nagios的插件安裝包,安裝後,執行ls -l /usr/local/nagios/libexec能夠看到以下插件內容:

[root@Nagios objects]# ls -l /usr/local/nagios/libexec/        
total 5288
lrwxrwxrwx  1 root   root       27 Aug 18 08:29 check_111 -> /service/scripts/check_test
-rwxr-xr-x. 1 nagios nagios 376524 Aug 14 10:11 check_apt
-rwxr-xr-x. 1 nagios nagios   2245 Aug 14 10:11 check_breeze
-rwxr-xr-x. 1 nagios nagios 128296 Aug 14 10:11 check_by_ssh
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_clamd -> check_tcp
-rwxr-xr-x. 1 nagios nagios  85694 Aug 14 10:11 check_cluster
-r-sr-xr-x. 1 root   nagios 123603 Aug 14 10:11 check_dhcp
-rwxr-xr-x. 1 nagios nagios 417895 Aug 14 10:11 check_disk
-rwxr-xr-x. 1 nagios nagios   9148 Aug 14 10:11 check_disk_smb
-rwxr-xr-x. 1 nagios nagios  80689 Aug 14 10:11 check_dummy
-rwxr-xr-x. 1 nagios nagios   3056 Aug 14 10:11 check_file_age
-rwxr-xr-x. 1 nagios nagios   6318 Aug 14 10:11 check_flexlm
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_ftp -> check_tcp
-rwxr-xr-x. 1 nagios nagios 520614 Aug 14 10:11 check_http
-r-sr-xr-x. 1 root   nagios 133689 Aug 14 10:11 check_icmp
-rwxr-xr-x. 1 nagios nagios  93416 Aug 14 10:11 check_ide_smart
-rwxr-xr-x. 1 nagios nagios  15137 Aug 14 10:11 check_ifoperstatus
-rwxr-xr-x. 1 nagios nagios  12601 Aug 14 10:11 check_ifstatus
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_imap -> check_tcp
-rwxr-xr-x. 1 nagios nagios   6890 Aug 14 10:11 check_ircd
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_jabber -> check_tcp
-rwxr-xr-x. 1 nagios nagios 106573 Aug 14 10:11 check_load
-rwxr-xr-x. 1 nagios nagios   6020 Aug 14 10:11 check_log
-rwxr-xr-x. 1 nagios nagios  20287 Aug 14 10:11 check_mailq
-rwxr-xr-x. 1 nagios nagios  93142 Aug 14 10:11 check_mrtg
-rwxr-xr-x. 1 nagios nagios  92487 Aug 14 10:11 check_mrtgtraf
-rwxr-xr-x. 1 nagios nagios 105606 Aug 14 10:11 check_nagios
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_nntp -> check_tcp
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_nntps -> check_tcp
-rwxrwxr-x. 1 nagios nagios  76744 Aug 14 10:32 check_nrpe
-rwxr-xr-x. 1 nagios nagios 127679 Aug 14 10:11 check_nt
-rwxr-xr-x. 1 nagios nagios 130078 Aug 14 10:11 check_ntp
-rwxr-xr-x. 1 nagios nagios 119167 Aug 14 10:11 check_ntp_peer
-rwxr-xr-x. 1 nagios nagios 117728 Aug 14 10:11 check_ntp_time
-rwxr-xr-x. 1 nagios nagios 159372 Aug 14 10:11 check_nwstat
-rwxr-xr-x. 1 nagios nagios   8324 Aug 14 10:11 check_oracle
-rwxr-xr-x. 1 nagios nagios 108934 Aug 14 10:11 check_overcr
-rwxr-xr-x. 1 nagios nagios 132691 Aug 14 10:11 check_ping
-rwxr-xr-x  1 nagios nagios   6184 Aug 19 23:04 check_pnp_rrds.pl
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_pop -> check_tcp
-rwxr-xr-x. 1 nagios nagios 396833 Aug 14 10:11 check_procs
-rwxr-xr-x. 1 nagios nagios 106492 Aug 14 10:11 check_real
-rwxr-xr-x. 1 nagios nagios   9584 Aug 14 10:11 check_rpc
-rwxr-xr-x. 1 nagios nagios   1412 Aug 14 10:11 check_sensors
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_simap -> check_tcp
-rwxr-xr-x. 1 nagios nagios 446511 Aug 14 10:11 check_smtp
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_spop -> check_tcp
-rwxr-xr-x. 1 nagios nagios 103000 Aug 14 10:11 check_ssh
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_ssmtp -> check_tcp
-rwxr-xr-x. 1 nagios nagios 108233 Aug 14 10:11 check_swap
-rwxr-xr-x. 1 nagios nagios 160386 Aug 14 10:11 check_tcp
-rwxr-xr-x. 1 nagios nagios 105022 Aug 14 10:11 check_time
lrwxrwxrwx. 1 root   root        9 Aug 14 10:11 check_udp -> check_tcp
-rwxr-xr-x. 1 nagios nagios 117534 Aug 14 10:11 check_ups
-rwxr-xr-x. 1 nagios nagios  83434 Aug 14 10:11 check_users
-rwxr-xr-x. 1 nagios nagios   2939 Aug 14 10:11 check_wave
-rwxr-xr-x. 1 nagios nagios 109723 Aug 14 10:11 negate
-rwxr-xr-x  1 nagios nagios  31813 Aug 19 23:04 process_perfdata.pl
-rwxr-xr-x. 1 nagios nagios 103242 Aug 14 10:11 urlize
-rwxr-xr-x. 1 nagios nagios   1904 Aug 14 10:11 utils.pm
-rwxr-xr-x. 1 nagios nagios   2728 Aug 14 10:11 utils.sh

提示:
默認安裝後大概有60個左右的插件,數量比較多,這裏只介紹幾個常見的。
以上結果內容都是Nagios插件,如今你們應該對Nagios插件有一個基本的瞭解了。其實,Nagios軟件自己僅僅是一個監控的平臺,若是要監控具體的主機及服務的狀態和數據信息,還必須配置或調用插件或程序文件才能完成任務,所以,若是沒有Nagios插件,Nagios就是一個空殼,啥都作不了。

9.1.2 爲何要開發Nagios插件

  • 既然已經安裝了Nagios的插件軟件包,爲何還要開發Nagios插件呢?
  • 首先想說明的是,在生產場景中經常使用的大部分服務都是不須要編寫插件就能夠完成監控的,check_http,check_tcp,check_nrpe等這些自帶的插件已經很強大了。可是,仍然有部分咱們想要監控的服務,是Nagios未自帶插件的,如:監控LVS RS的lo網卡的VIP,監控NFS狀態,又或是監控iostat,mem,sar系統指標及相關APP應用(MQ隊列)等。這個時候咱們有兩個選擇,一個是去網上搜索,看看有沒有別人寫過的腳本,拿來使用或修改後使用;另外就是本身開發編寫腳本。這裏建議你們學會手工編寫插件,若是開始不會寫,能夠把網上別人分享的插件拿來改,改着改着就會寫了。
  • 若是要開發插件,最好掌握一門開發語言,例如:Shell,Python。

9.2 編寫Nagios插件的規則

9.2.1 編寫Nagios插件說明

  • Nagios插件是Nagios提供的一種經過可擴展的方式部署的程序組件,該插件可經過Shell,Java,C/C++,PHP等多種語言開發,運維或者系統架構人員只要經過修改Nagios配置文件和相應參數,就能很方便的將該插件集成到Nagios中,實現對目標系統的監控。
  • Nagios服務爲1插件程序提供了兩個返回值接口和插件交互:一個是插件執行後的退出狀態碼,另外一個是插件執行過程當中在控制檯打印的1第一行數據。退出狀態碼能夠被Nagios主程序做爲判斷被監控系統服務狀態的依據,控制檯打印的第一行數據能夠被Nagios主程序做爲被監控系統服務狀態的補充說明,會顯示在Web管理頁面,以下圖所示:

QQ截圖20170820165857.png-4.5kB

爲了管理Nagios插件,Nagios每查詢一個服務的狀態時,就會產生一個子進程,並使用來自該命令的輸出和退出代碼來肯定其具體的狀態。Nagios主程序可識別的插件的退出狀態碼和說明以下:

  • OK:退出代碼,0表示服務工做正常。
  • WARNING:退出代碼,1表示服務處於警告狀態
  • CRITICAL:退出代碼,2表示服務處於緊急,嚴重狀態。
  • UNKNOWN:退出代碼,3表示服務處於未知狀態。

注意:
此處數字代碼的含義曾經有公司面試時考過。

最後一種狀態一般表示該插件沒法肯定服務的狀態。例如,可能出現了網絡或內部錯誤。相關狀態能夠從以下文件中看到:

[root@Nagios objects]# head -7 /usr/local/nagios/libexec/utils.sh 
#! /bin/sh

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

#提示:結尾處比列舉的還多個狀態,但不經常使用

9.2.2 Nagios插件開發原理

Nagios插件程序中須要調用監控服務規定的操做序列,並根據預先定義的規則,對返回結果進行分析,判斷服務的當前狀態,而後以指定的狀態碼退出程序,同時將對該狀態的說明不換行輸出到控制檯。

9.2.3 Nagios插件開發語言

Nagios的插件開發不限制任何開發語言,只要該插件能被Nagios調用,並獲取到相應業務數據就OK,如能在命令行執行輸出結果也能夠,經常使用的插件語言有Shell,Perl,Python,PHP, C/C++。

9.3 使用Shell開發Nagios插件

9.3.1 編寫檢查WebURL地址的插件

如下腳本只是針對訪問客戶端192.168.0.223的IP的

[root@Nagios libexec]# cat check_url.sh 
#!/bin/bash
# anthor:Mr.chen by 2017-8-20

wget -T 10 --spider 192.168.0.223 >/dev/null 2>&1   #用wget檢查192.168.0.223是否是能夠訪問,-T超時時間 --spider不下載網頁

if [ $? -eq 0 ];then                    #判斷上述wget命令返回值,0成功非0失敗
    echo "URL 192.168.0.223 OK"
    exit 0
else
    echo "URL 192.168.0.223 CRITICAL"
    exit 2
fi

下面利用傳參把腳本改進爲通用的WebURL插件

[root@Nagios libexec]# cat check_url.sh 
#!/bin/bash
# anthor:Mr.chen by 2017-8-20

PROGNAME=`basename $0`      #取腳本名
PROGPATH=`dirname $0`       #取腳本路徑

usage(){            #打印幫助

    echo "Usage: /bin/sh ${PROGPATH}/${PROGNAME} url" 
    exit 1

}

[ $# -ne 1 ] && usage           #參數個數不是1,打印幫助

wget -T 10 --spider $1 >/dev/null 2>&1       #URL地址改爲傳參   

if [ $? -eq 0 ];then
    echo "URL $1 OK"
    exit 0
else
    echo "URL $1 CRITICAL"
    exit 2
fi

如下是監控WebURL的插件腳本專業型寫法

[root@Nagios libexec]# cat check_url.sh 
#!/bin/bash
# anthor:Mr.chen by 2017-8-20

PROGNAME=`basename $0`
PROGPATH=`dirname $0`

usage(){

    echo "Usage: /bin/sh ${PROGPATH}/${PROGNAME} url" 
    exit 1

}

[ $# -ne 1 ] && usage

. $PROGPATH/utils.sh

if wget -T 20 --spider $1 >/dev/null 2>&1;then
    echo "URL $1 OK"
    exit $STATE_OK
else
    echo "URL $1 NO"
    exit $STATE_CRITICAL
fi

最後手工測試如下改進的WebURL插件腳本

[root@Nagios libexec]# sh /usr/local/nagios/libexec/check_url.sh www.yunjisuan.com
URL www.yunjisuan.com OK
[root@Nagios libexec]# echo $?
0
[root@Nagios libexec]# sh /usr/local/nagios/libexec/check_url.sh bbs.yunjisuan.com
URL bbs.yunjisuan.com OK
[root@Nagios libexec]# echo $?
0
[root@Nagios libexec]# sh /usr/local/nagios/libexec/check_url.sh blog.yunjisuan.com
URL blog.yunjisuan.com NO
[root@Nagios libexec]# echo $?
2

9.3.2 WebURL插件腳本的部署過程(主動監控方式)

Nagios主動模式監控和Nagios客戶端的nrpe進程沒有關係。
主動模式的全部操做徹底在Nagios主服務器上進行。部署步驟以下:

(1)開發check_url.sh,放到/usr/local/nagios/libexec中,受權爲可執行

root@Nagios libexec]# cd /usr/local/nagios/libexec/
[root@Nagios libexec]# chmod +x check_url.sh 
[root@Nagios libexec]# ll check_url.sh
-rwxr-xr-x 1 root root 337 Aug 20 06:38 check_url.sh
[root@Nagios libexec]# cat check_url.sh 
#!/bin/bash
# anthor:Mr.chen by 2017-8-20

PROGNAME=`basename $0`
PROGPATH=`dirname $0`

usage(){

    echo "Usage: /bin/sh ${PROGPATH}/${PROGNAME} url" 
    exit 1

}

[ $# -ne 1 ] && usage

. $PROGPATH/utils.sh

if wget -T 20 --spider $1 >/dev/null 2>&1;then
    echo "URL $1 OK"
    exit $STATE_OK
else
    echo "URL $1 NO"
    exit $STATE_CRITICAL
fi

(2)在commands.cfg中創建check_url命令:

[root@Nagios objects]# cd /usr/local/nagios/etc/objects/
[root@Nagios objects]# tail -7 commands.cfg 
# 'check_url' command definition by Mr.chen
define command {

    command_name check_url
    command_line $USER1$/check_url.sh 192.168.0.223    #加載腳本並傳參數

}
#提示:$USER1$是Nagios默認變量,爲/usr/local/nagios/libexec

(3)在services.cfg裏添加監控上述URL地址的服務

能夠將服務直接添加進services裏也能夠,寫一個子服務的配置文件,寫在/usr/local/nagios/etc/objects/services目錄裏

#建立須要監控的子服務配置文件
[root@Nagios objects]# pwd
/usr/local/nagios/etc/objects
[root@Nagios objects]# cd services
[root@Nagios services]# pwd
/usr/local/nagios/etc/objects/services
[root@Nagios services]# vim check_url.cfg
[root@Nagios services]# cat check_url.cfg 
define service {

    use generic-service
    host_name web01
    service_description     http_zhudong_url
    check_command       check_url

}

因爲/usr/local/nagios/etc/objects/services/*已經被nagios.cfg主配置文件引用,所以無需在include進service.cfg配置文件。

[root@Nagios etc]# cat nagios.cfg | grep "/usr/local/nagios/etc/objects/services"
cfg_file=/usr/local/nagios/etc/objects/services.cfg
cfg_dir=/usr/local/nagios/etc/objects/services

各個配置文件與Nagios.cfg主配置文件的關係以下圖所示:

QQ截圖20170820190632.png-30.3kB

(4)從新加載Nagios,查看結果

[root@Nagios etc]# /etc/init.d/nagios reload     
Running configuration check...done.
Reloading nagios configuration...done

(5)查看Nagios服務頁面監控結果,以下圖所示:

QQ截圖20170820190940.png-109.9kB

備註:
Web01服務器須要可以提供http協議的web訪問。
等待刷新....

QQ截圖20170820192403.png-96.9kB

9.3.3 利用被動模式的nrpe方式監控/etc/passwd文件是否變化

Nagios被動模式下的全部插件都須要部署在被監控的Nagios客戶端。部署步驟以下。

1)在Nagios客戶端web01上取/etc/passwd的文件指紋,即md5值。

[root@web01 ~]# md5sum /etc/passwd >/opt/ps.md5
[root@web01 ~]# cat /opt/ps.md5
3660c548ce618df6c066f0db6bedd2af  /etc/passwd       #記住這個校驗碼

2)在Nagios客戶端web01上開發插件腳本,並測試

#請注意這是在web01客戶端的操做
[root@web01 ~]# cd /usr/local/nagios/libexec/
[root@web01 libexec]# vim check_passwd
[root@web01 libexec]# vim check_passwd
[root@web01 libexec]# cat check_passwd 
#!/bin/bash
# author:Mr.chen by 2017-8-20

OriMd5="3660c548ce618df6c066f0db6bedd2af"       #以前記錄的校驗碼
CurrMd5=`md5sum /etc/passwd | cut -c 1-32`      #每次都從新生成校驗碼
if [ "$OriMd5" == "$CurrMd5" ];then
    echo "/etc/passwd:OK"
    exit 0
else
    echo "/etc/passwd:FAILED"
    exit 2
fi
[root@web01 libexec]# sh check_passwd
/etc/passwd:OK
[root@web01 libexec]# chmod +x check_passwd 

#提示:還能夠用md5sum -c /opt/ps.md5的方法比較

3)在Nagios客戶端web01上編輯nrpe.cfg,插入以下的內容後保存

root@web01 libexec]# cd /usr/local/nagios/etc/
[root@web01 etc]# vim nrpe.cfg 
[root@web01 etc]# tail -1 nrpe.cfg      #在文件末尾加入以下內容
command[check_passwd]=/usr/local/nagios/libexec/check_passwd

4)在Nagios客戶端web01上重啓nrpe,並檢查是否重啓成功(check_nrpe檢驗)

[root@web01 etc]# ps -ef | grep nrpe | grep -v grep
nagios     1027      1  0 Aug18 ?        00:00:05 /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d
[root@web01 etc]# pkill nrpe
[root@web01 etc]# ps -ef | grep nrpe | grep -v grep
[root@web01 etc]# /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d
[root@web01 etc]# ps -ef | grep nrpe | grep -v grep
nagios     4362      1  0 06:33 ?        00:00:00 /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

5)在Nagios服務器端nagios-server上進入service目錄,建立配置文件check_passwd_web01.cfg

#請注意這裏是Nagios服務器端的操做
[root@Nagios ~]# cd /usr/local/nagios/etc/objects/services
[root@Nagios services]# vim check_passwd_web01.cfg
[root@Nagios services]# cat check_passwd_web01.cfg
define service {

    use generic-service
    service_description check_passwd
    check_command check_nrpe!check_passwd
#這裏的check_passwd就是Nagios客戶端nrpe.cfg裏command[check_passwd]=/usr/local/nagios/libexec/check_passwd配置的中括號命令名check_passwd
}

6)在Nagios服務器端檢查語法

[root@Nagios services]# /etc/init.d/nagios checkconfig
#以上省略若干....
Total Warnings: 0
Total Errors:   0

Things look okay - No serious problems were detected during the pre-flight check
OK.

7)在Nagios服務器端加載Nagios配置,而後打開Nagios頁面查看

[root@Nagios services]# /etc/init.d/nagios reload
Running configuration check...done.
Reloading nagios configuration...done

QQ截圖20170820195452.png-102.1kB

等待刷新....

QQ截圖20170820195654.png-101.3kB

十,本節重點回顧

  1. Nagios監控系統家族成員功能介紹
  2. Nagios監控系統完整框架圖解說明
  3. Nagios服務器端核心配置文件之間的關係原理
  4. Nagios服務器端及客戶端安裝,配置細節。
  5. Nagios利用check_nrpe插件進行監控的原理
  6. Nagios圖形監控顯示和數據管理
  7. Nagios報警方式選擇及報警實施細節
  8. Nagios自定義插件開發原理及開發實踐
  9. Nagios插件主動和被動方式工做原理及實施部署細節。
相關文章
相關標籤/搜索