Nagios監控系統安裝及配置文檔

3. 前言

做爲系統管理員,管理着幾十臺或幾百臺服務器在運行。一個非常迫切的需求就是希望瞭解服務器及服務器上運行的服務的運行狀況,在服務器或服務出現當機或停止的時候能夠第一時間知道,及時處理。以便最小的減少由此帶來的影響和損失。Nagios就是用來解決這個問題的,在目前的一些監控軟件中,Nagios 以其良好的穩定性,強大的功能等,已成爲業界監控軟件的首選。

Nagios官方網站的描述:
Nagios is an open source host, service and network monitoring program. Who uses it? Lots of people, including many big companies and organizations:Nagios是一個用來監控主機、服務和網絡的開放源碼軟件,很多大的公司或組織都在使用它。

4. Nagios監控原理



上圖爲Nagios監控原理圖。Nagios監控可以使用主動模式(Action)和被動模式 (Passive)。

主動模式主要是自身插件或結合Nrpe實現,由Nagios在定義的時間去主動監測被監控端的服務器或服務是否正常。被動模式結合Naca實現,由Nsca定時監控服務器或服務,再由Nasa把結果傳至Nagios。

被動模式適合大規模服務器(一般在最少100臺以上)需要監控的情況,可有效減少監控服務器的壓力。在服務器數量比較少的情況下用主動模式比較方便,因爲主要的配置在監控主機的設置就好了,無需在被監控端做過多設置。

我們的監控是使用Nagios結合Nrpe的主動模式。

5. Nagios的安裝

5.1. YUM方式安裝

我們的監控服務器是Centos linux 4.8,可用yum方式安裝:

# wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el4.rf.i386.rpm
# rpm –ivh rpmforge-release-0.3.6-1.el4.rf.i386.rpm
# yum install nagios*
# chkconfig –level 2345 nagios on
# service nagios start

注:本文後面的配置都是按yum安裝後的環境來配置的。

5.2. 源代碼方式安裝


1)安裝Nagios

# wget http://jaist.dl.sourceforge.net/sourceforge/nagios/nagios-3.0.6.tar.gz
# tar zxvf nagios-3.0.6.tar.gz
# cd nagios-3.06
# ./configure -prefix=/usr/local/nagios
# make install                  //安裝主要的程序、CGI及HTML文件
# make install-commandmode      //給外部命令訪問nagios配置文件的權限
# make install-config           //把配置文件的例子複製到nagios的安裝目錄
# make install-init             //把nagios做成一個運行腳本,使nagios隨系統開機啓動
或者上面四步可用一行令代替:
# make all

2) 安裝nagios的插件

# wget http://nchc.dl.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.13.tar.gz
# cd nagios-plugins-1.4.13
# tar zxvf nagios-3.0.6.tar.gz
# ./configure -prefix=/usr/local/nagios
# make
# make install

6. Nagios配置文件


其實Nagios只有一個配置文件,就是/etc/nagios/nagios.cfg,其它的配置文件都是以include的方式包括進nagios.cfg的。如:
# You can specify individual object config files as shown below:
cfg_file=/etc/nagios/objects/commands.cfg
cfg_file=/etc/nagios/objects/contacts.cfg
cfg_file=/etc/nagios/objects/timeperiods.cfg
cfg_file=/etc/nagios/objects/templates.cfg

# Definitions for monitoring the local (Linux) host
cfg_file=/etc/nagios/objects/hosts.cfg
cfg_file=/etc/nagios/objects/services.cfg

commands.cfg是監控命令的配置文件,contacts.cfg是監控報警聯繫人的配置文件,timeperiods.cfg是時間定義配置文件,templates.cfg是模板配置文件,這裏面定義了一些模板以方便用戶使用。Hosts.cfg是被監控主機的配置文件,services.cfg是被監控服務的配置文件。
唯一的例外是cgi.cfg,這個文件是與WEB相關的。

6.1. Nagios的WEB配置

# htpasswd -c /etc/nagios/htpasswd.users nagiosadmin 123456
建一個WEB訪問的用戶之後,在瀏覽器輸入http://ip/nagios/,輸入相應的用戶和密碼就可以就看到Nagios的web界面了。

WEB用到的配置文件是/etc/nagios/cgi.cfg,更改配置可修改這個配置文件。
# vi /etc/nagios/cgi.cfg
use_authentication=1                         #使用用戶認證
authorized_for_system_information=nagiosadmin
authorized_for_configuration_information=nagiosadmin
authorized_for_system_commands=nagiosadmin #多個用戶之間用逗號隔開
authorized_for_all_services=nagiosadmin
authorized_for_all_hosts=nagiosadmin
authorized_for_all_service_commands=nagiosadmin
authorized_for_all_host_commands=nagiosadmin

6.2.  hosts.cfg

define host{            #這段是用來定義一個被監控的主機。
host_name             #這一項是用來定義標識主機的名字。我們用這個名字在host group和service裏標識這個主機。一個主機能定義多個服務。使用適當時,宏$HOSTNAME$裏存放了這一項的值。
alias                 #這一項用來定義主機的一個完整名字或描述。主要是和使你能理容易的標識一個主機。使用適當時,宏$HOSTALIAS$裏存放了這一項的值。
address               #這一項是用來定義主機的地址。一般而言是主機的IP。當然,你也能夠使用一個FQDN來標識你的主機,在沒有可訪問DNS服務器服務的情況下這種方法會引起問題。使用適當時,宏$ HOSTADDRESS $裏存放了這一項的值。
max_check_attempts    #這一項用來定義在檢測返回結果不是OK時,nagios重試檢測命令的次數。設置這個值爲1會導致nagios一次也不重試就報警。
check_period          #這一項用一個time period項的名字來定義在哪段時間內激活對這臺主機的主動檢測。time period是定義在別的文件裏的配置項,我們可以在這裏用名字來引用她。
contact_groups        #這是一個聯繫組列表。我們用聯繫組的名字來引用她們。多個聯繫組間用“,”來分隔。
notification_interval #這一項用來定義當一個服務仍然down或unreachable時,我們間隔多久重發一次通知給聯繫組。
notification_period   #這一項用一個time period定義來標識什麼時間段內給聯繫組送通知。這裏我們用time period定義的名字來引用她。
notification_options  #這一項用來決定發送通知的時機。選項有:d = 當有down狀態時發送通知,u = 當有unreachable狀態時發送通知, r = 當有服務recoveries時發送通知,f = 當主機啓動或停機時發送通知。如果你給一個n選項,那麼永遠不會發送通知。
}

define hostgroup{     #這段是用來定義一個被監控的主機組。
hostgroup_name  #主機組名稱,通常定義得較短
alias           #主機組別名,通常定義得較長
members         #主機組成員
}


6.3. services.cfg

define service{                      #這段是用來定義一個被監控的服務。
host_name             #主機名稱
service_description   #服務描述
check_command         #執行命令
max_check_attempts    #最大失敗嘗試次數,值爲1時只報警不重新檢測
normal_check_interval #常規檢測間隔時間,默認爲60分鐘(常規檢測是指無論服務狀態是否正常,檢測次數達到“最大次數”時)
retry_check_interval  #失敗嘗試間隔時間,默認爲60分鐘(失敗嘗試是指服務狀態不正常,檢查次數達到“最大次數”時)
check_period          #檢測時間段
notification_interval #當服務狀態不正常時通知聯繫人的間隔時間,值爲0時不通知聯繫人
notification_period   #通知聯繫人時間段
notification_options  #通知聯繫人選項,w警告,u未知,c危急,f啓動和停止,n不發送通知
contact_groups        #聯繫人組
}


define servicegroup{                 #這段是用來定義一個被監控的服務組。
servicegroup_name     #服務組名稱,通常定義得較短       
alias                 #服務組別名,通常定義得較長
members               #服務組成員
}


6.4. contacts.cfg

define contact{              #這段是用來定義一個聯繫人。
contact_name                 #這個指令用來定義一個聯繫人的簡稱。他會在定義contactgroup時被引用到。在相應的環境中,宏定義$CONTACTNAME$會包含這個值。
alias                        #這個指令是爲了定義一個聯繫人的具體的描述。在相應的環境中,宏定義$CONTACTALIAS$會包含這個值。
host_notification_period     #這個指令是爲了定義,能夠通知Contact中定義的那個簡稱聯繫人,關於主機有問題或者恢復正常狀態的時間段。你可以把他想象成能夠通知Contact關於主機的在線時間。
service_notification_period  #這個指令是爲了定義,能夠通知Contact中定義的那個簡稱聯繫人,關於服務的問題或恢復正常的時間段。
host_notification_options    #這個指令爲了定義主機在什麼狀態下會給聯繫人發通知。各個參數的描述如下:d=當主機的狀態處於down時,發送通知;f=當主機狀態處於stop時發送通知。r=當主機恢復up狀態時發送通知。n=什麼狀態下都不發送通知(w-warning , u-unknown,c-critical,r-recovery;d-down,u-unreachable)。
service_notification_options #這個指令爲了定義服務在什麼狀態下會給聯繫人發通知。各個參數的描述如下:w=當服務處於警告狀態時發送通知 u=當服務的狀態處於unknown時,發送通知;f=當服務狀態處於啓動和停止時發送通知。c=當服務處於Critical狀態時發送通知。n=什麼狀態下都不發送通知。
host_notification_commands   #這個指令是爲了定義一個通知聯繫人關於主機問題或恢復正常的聯繫手段的一個列表。多個手段之間用逗號隔開。
service_notification_commands#這個指令是爲了定義一個通知聯繫人關於服務問題或恢復正常的聯繫手段的一個列表。多個手段之間用逗號隔開。
email                        #這個指令是爲了定義聯繫人的email地址。這個將取決於你是如何定義你的notification commands.它可以用來給聯繫人發送緊急郵件。在相應的環境中。宏定義$CONTACTEMAIL$將會包含它的值。
}

define contactgroup{         #這段是用來定義一個聯繫人組。
contactgroup_name   #聯繫組名稱,通常定義得較短
alias               #聯繫組別名,通常定義得較長
members             #聯繫組成員
}


6.5. timeperiods.cfg

define timeperiod{
timeperiod_name  #時間段名稱,通常定義得較短
alias            #時間段別名,通常定義得較長
sunday           #星期日時間段
monday           #星期一時間段
tuesday          #星期二時間段
wednesday        #星期三時間段
thursday         #星期四時間段
friday           #星期五時間段
saturday         #星期六時間段
}


6.6. commands.cfg


define command{
command_name        #定義命令的簡稱
command_line        #定義當服務進行時Nagios要執行的動作。在命令執行以前,所有合法的宏都要被他們的值代替。
}


7. 用Nrpe監控Linux主機

7.1. 安裝Nrpe

# wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el4.rf.i386.rpm
# rpm –ivh rpmforge-release-0.3.6-1.el4.rf.i386.rpm
# yum -y install nagios-nrpe
# chkconfig –level 2345 nrpe on
# service nrpe start

7.2. 配置Nrpe

修改Nrpe配置文件:

#  vi /etc/nagios/nrpe.cfg

command開頭只保留兩行:
command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20
command[check_disk]=/usr/lib/nagios/plugins/check_disk -w 20 -c 10 -p /

第一行是監控系統負載,第二行是監控磁盤空間的。
command[check_load]內的check_load是定義的Nrpe命令,在監控端的Nrpe插件可用這個命令來取得執行結果。

7.3. 配置nagios

1) 增加nagios命令

# vi commands.cfg
最後增加:
define command{
command_name check_nrpe
command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}

2) 增加被監控服務器

# vi /etc/nagios/objects/hosts.cfg
define host{                   
use                     linux-server
host_name               mysql.server
alias                   10.11.12.80
address                 10.11.12.80
}

3) 增加被監控服務

# vi /etc/nagios/objects/services.cfg
define service{
use                     local-service
host_name               mysql.server
service_description     nrpe_disk
check_command           check_nrpe!check_disk
notifications_enabled   1
}

define service{
use                     local-service
host_name               mysql.server
service_description     nrpe_load
check_command           check_nrpe!check_load
notifications_enabled   1
}
上面配置內的check_load和check_disk是被監控端Npre的配置文件(command[check_load])內定義好的命令。最後使配置生效:
# nagios –v /etc/nagios/nagios.cfg  #配置文件的語法檢查
# service nagios reload

8. 監控Web及Tomcat服務

監控Web用Tomcat服務可用nagios自帶的插件check_http。
# vi commands.cfg
增加:
# 'check_tomcat' command definition
define command{
command_name    check_tomcat
command_line    $USER1$/check_http -I $HOSTADDRESS$ -p 8080 $ARG1$
}
# 'check_http' command definition
define command{
command_name    check_http
command_line    $USER1$/check_http -I $HOSTADDRESS$ -H $HOSTADDRESS$ $ARG1$
}

# vi services.cfg
增加:
define service{
use                     local-service
host_name               web1.ihompy.com
hostgroup_name          web-servers
service_description     check-http
check_command           check_http
max_check_attempts      3
normal_check_interval   3
retry_check_interval    1
check_period            24x7
notification_interval   60
notification_period     24x7
notification_options    w,u,c,r
}
define service{
use                     local-service
host_name               l7ejb,l7admin,l7web,l7ds
#        hostgroup_name          l7-servers
service_description     check-tomcat
check_command           check_tomcat
max_check_attempts      3
normal_check_interval   3
retry_check_interval    1
check_period            24x7
notification_interval   60
notification_period     24x7
notification_options    w,u,c,r
}
被監控端無需配置,讓nagios使修改後的配置生效便可。


9. 監控squid


9.1. 下載squid檢測腳本

# wget http://workaround.org/squid/nagios-plugin/check_squid
# chmod  755 check_squid
# cp check_squid /usr/lib/nagios/plugins/
這個腳本我用的時候有點問題,出現:
Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/lib/perl5/vendor_perl/5.8.5/LWP/Protocol.pm line 114.
原因是:
HTML::HeadParser模塊在使用parse()方法時,對沒有編碼的UTF-8會弄混,要保證在傳值之前進行適當的編碼。
參考:http://www.xinjiezuo.com/blog/?p=43
解決方式是在my $ua = new LWP::UserAgent;下面加入一行:
$ua->parse_head(0);

跳過去就好了。

9.2. 修改配置文件

# vi commands.cfg
增加:
# 'squid' command definition
define command {
command_name check_squid
command_line $USER1$/check_squid '$ARG1$' '$ARG2$' '$ARG3$' $HOSTADDRESS$ '$ARG4$' '$ARG5$' '$ARG6$' '$ARG7$'
}

# vi services.cfg
增加:
define service {
use                     local-service
host_name               squid1.ihompy.com
service_description     check-squid
check_command           check_squid!http://www.ihompy.com!-!-!80!-!-!2
max_check_attempts      3
normal_check_interval   3
retry_check_interval    1
check_period            24x7
notification_interval   60
notification_period     24x7
notification_options    w,u,c,r
}
被監控端無需配置,讓nagios使修改後的配置生效便可。

10. 監控mysql及mssql服務

監控mysql服務可用nagios自帶的插件check_mysql。Nagios也帶有一個check_mssql用來監控sql server,不過要先安裝freetds。
# yum install freetds
# vi commands.cfg
增加:
# 'mysql'  command definition
define command{
command_name check_mysql
command_line $USER1$/check_mysql -H $HOSTADDRESS$ -u $ARG1$ -p $ARG2$
}
# 'check_mssql' command definition
define command{
command_name    check_mssql
command_line    $USER2$/check_mssql.sh $HOSTADDRESS$ $ARG1$ $ARG2$ $ARG3$
}

# vi services.cfg
增加:

define service{
use                     local-service
host_name               mysql.ihompy.com
hostgroup_name          mysql-servers
service_description     check-mysql
check_command           check_mysql!root!1qaz2wsx
max_check_attempts      3
normal_check_interval   3
retry_check_interval    1
check_period            24x7
notification_interval   60
notification_period     24x7
notification_options    w,u,c,r
}
define service{
use                     local-service
host_name               sqlserver
#        hostgroup_name          backup-servers
service_description     check_sqlserver
check_command           check_mssql!sa!''!2000
notifications_enabled   1
}
被監控端無需配置,讓nagios使修改後的配置生效便可。


11. 配置報警方式及聯繫人

Nagios可以有很多報警方式,比如:E-mail,短信,MSN等。
目前短信方式主要是用中國移動的飛信客戶端及購買短信貓兩種方式。前者目前是免費的,後者需一點費用買短信貓及手機卡,不過代價也不高,一共不到200RMB。
MSN因爲其自身的原因,不太穩定。
我們使用的是一個折中的方式,在Nagios上配置的是E-mail方式,但使用的是中國移動的139郵箱,139郵箱在收到郵件後可免費發短信給用戶。這樣就郵箱和短信就都有了,目前觀察下來穩定性還不錯。

11.1. 配置聯繫人

# vi contacts.cfg
define contact{
contact_name                    luohui         
use                             generic-contact
alias                           Nagios Admin   
email                           [email protected] 
pager                           13761802324324
address1                        [email protected]
}

define contact{
contact_name                    xuyong       
use                             generic-contact
alias                           Nagios Admin   
email                           [email protected]
pager                           133434323443
address1                        [email protected]
}
define contactgroup{
contactgroup_name       admins
alias                   Nagios Administrators
members                 luohui,xuyong
}
先定義兩個聯繫人luohui和xuyong,再把它們加入到聯繫人組admins。

11.2 配置報警命令

默認已經配置好了,在command.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$\n
State: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /bin/mail -s "** $NOTIFICATI
ONTYPE$ 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: $SERVIC
EDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n
$SERVICEOUTPUT$" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTAC
TEMAIL$
}

11.3. 在主機和服務中啓用E-mail報警

因爲我們配置的主機及服務都是使用了模板方式的,所以只要改了模板文件的配置,所有的主機和服務就都改了。
# vi templates.cfg
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
host_notification_commands      notify-host-by-email   
register                        0                      
}

在主機及服務模板內,把contact_groups都改成聯繫人組admins:
contact_groups                  admins 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章