前言
上一篇已經介紹了nagios如何實現對主機及服務的監控,盡可能實現對系統運行狀態的全面監控只是初級目標,nagios還可以借助smtp服務發送通知信息給指定的聯系人。
本文所用到系統環境
OS:CentOS release 6.8 (Final) 2.6.32-642.el6.x86_64
還有一個重要環境:互聯網(yum、百度、Google)。
各軟件包:
組件 | 軟件包名 |
---|---|
nagios daemon | nagios-4.3.1.tar.gz |
nrpe | nrpe-2.15.tar.gz |
nagios plugin | nagios-plugins-2.2.0.tar.gz |
1. nagios發送通知郵件的配置過程
1.1 nagios服務配置內容
-
修改templates.cfg
要讓nagios能夠發送郵件,首先要定義什么情況下可以觸發nagios來發送郵件通知,郵件的接收對象,以及通知郵件發送的時間段及頻率等,這些參數都需要事先在templates.cfg文件中定義好。示例如下:
define contact{
name generic-contact ; 調用名為generic-contact的聯系人模板
service_notification_period 24x7 ; 什么時間段可以發送關于服務的通知,這里調用的是名為24x7的時間段模板
host_notification_period 24x7 ; 什么時間段可以發送關于主機的通知,同樣調用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 ; 通過哪個指令來
發送關于服務的通知,這里是調用名為notify-service-by-email的命令來
發送,它在commands.cfg里有定義
host_notification_commands notify-host-by-email ; 通過哪個指令來
發送關于主機的通知,這里調用名為notify-host-by-email的命令來發
送,同樣在commands.cfg里有定義
register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL CONTACT, JUST A TEMPLATE!
}
define host{
name linux-server ; 主機模板的名稱
notification_period workhours ; 針對主機的通知只
要workhours時間段發送,此處的配置優先于上面contract定義的
notification_interval 120 ; 故障沒有解決時,多長時間重發一次通知,單位為分鐘
notification_options d,u,r ; 只在主機處于d,u,r狀態時發送通知,此處配置優先于上面contract處定義的。
contact_groups admins ; 將通知發給哪些人
register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
}
關于服務類通知的條件定義和上述配置方法一樣。
-
修改services.cfg
首先要注意的是筆者的services.cfg文件中對有些服務的監控是沒有使用check_nrpe指令的,如ping測試,ssh,http服務都是直接使用的相應的plugin來監測的。所以如果要修改這些服務的監控告警閾值需要修改這個services.cfg文件,而對于其它調用了check_nrep指令的服務則同樣需要修改/usr/local/nagios/etc/nrpe.cfg
,并且確保兩者中的指令名稱一樣。services.cfg示例如下:
define service{
use local-service ; Name of service template to use
hostgroup_name web-servers,loadblance-servers,database-servers
service_description PING
check_command check_ping!50.0,10%!100.0,20% ;設定ping包平均響應時長
50ms,丟包率10%觸發w告警;平均響應時長
100ms,丟包率20%,觸發c告警
check_interval 1
}
對于使用check_nrpe指令來啟動的監控對象則需要修改/usr/local/nagios/etc/nrpe.cfg
中的命令參數,來配置相應的warinning和critical閾值。示例如下:
command[check_local_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200
#設定名為check_local_total_procs的監控項,執行
# check_procs來獲取系統當前的總進程數,如果達到150,則
# 觸發w告警;如果達到200則觸發critical告警
實際工作中,根據業務需求進行配置,上述數值只作為示例。
- **修改commands.cfg**
在上面的配置模板templates.cfg中可以看到分別針對主機和服務的通知發送引用了兩個命令:`notify-host-by-email`和`notify-service-by-email`,這兩個命令具體是什么樣的,它是在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$ ;前面的printf指令是在指定郵件正文內容,然后調用mail指令發送-s后面指定主題的郵件
}
# '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: $HOSTA
DDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS
$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ ; ;前面的printf指令是在指定郵件正文內
容,然后調用mail指令發送-s后面指定主題的郵件
}
- **修改contracts.cfg**
修改contracts.cfg文件的目的是為了定義當nagios需要發送通知時nagios知道要將通知發給誰。
示例如下:
define contact{
contact_name nagiosadmin ; 聯系人名稱
use generic-contact ; 調用在
;templates.cfg中定義的名為generic-contract聯系人模板
alias Nagios Admin ; 聯系人別名
email xxx@qq.com ; nagios通知郵件接收者的郵件地址
}
define contactgroup{ ;定義聯系人組
contactgroup_name admins ;聯系人組名
;admins,在templates.cfg中通知即是發給這一聯系人組的
alias Nagios Administrators
members nagiosadmin ;將nagiosadmin加入這一聯系人組中
}
### 1.2 郵件服務配置
**借助外部的smtp來發送通知郵件,不需要本機啟用smtp服務,啟用了也不影響。**
- **配置nagios server本機發件賬戶**
因為這臺nagios服務器沒有郵件域名注冊在公網上,nagios系統默認情況下會使用名為nagios@nagios-server-name的郵件地址給contracts.cfg中定義的郵件地址發送通知郵件,這個地址不是合法的,所以要么郵件發送不出去,要么發送出去了,會被收件者郵件服務器放到垃圾箱中,如果沒有公司郵件可以使用,那么可以配置如網易這類公共郵箱來進行郵件的發送。
**需要注意**
**1. 登錄網頁郵箱設置中確認已開啟smtp服務。**
**2. 為郵箱啟用授權碼,在設置中可以找到,163郵箱的授權碼是自己設定的的,并記好在第三方的郵件客戶端軟件中配置163郵箱時要用到。**
** 3. QQ郵箱同樣可以設置授權碼,但它是隨機變化的,每次設置時都不一樣,且它的smtp連接需要使用ssl,在linux中筆者沒搞定,所以建議不要將QQ郵箱作為nagios通知郵件的發送方。**
給本機配置發件時使用的郵箱服務是通過修改mail.rc文件完成的,在其最后加上如下內容:
set from=nagios-admin@163.com
set smtp=smtp.163.com
set smtp-auth-user=nagios-admin
set smtp-auth-password=aggjiek3DbVv #此處為之前給
#nagios-admin@163郵箱設置的授權碼,此處它的意思 相當于授權linux
#中的mail程序(這一第三方程序)來登錄這個郵箱。
set smtp-auth=login
- **使用mail發送測試郵件**
使用`mail`指令來發送測試郵件,以驗證nagios server是否已可以使用剛才配置的163郵箱往指定的郵箱發送郵件了。mail指令由mailx軟件包提供,其路徑要和commands.cfg里定義的路徑一致,即`/bin/mail`。測試方式:
mail -s "Mail Tittle" xxx@qq.com #按下回車然后直接按下Ctrl+D來結束輸入,發送郵件,會出現如下提示:
EOT
Null message body; hope that's ok #因為沒有輸入郵件正文,等待一會去xxx@qq.com郵箱中收郵件看是否成功收到郵件。
- **測試nagios發送通知郵件**
在確保nagios服務器可以通過配置的163郵箱往外成功發送郵件以后,接著測試nagios發送通知郵件的功能是否正常。
*制造告警*
測試環境中,筆者人為將一臺名為server1上的http服務down掉`nginx -s stop`,然后觀察naginx web頁面監控,及查看是否能夠收到通知郵件。
觀察到的nagios web頁面監控信息如下:

時間上可以看到是:2017-04-09 16:15:51,嘗試了1/4即檢測到了一次失敗,此時還不會發送通知郵件,只有連續檢測到了4次失敗才會發送通知郵件。
接著當檢測到了4次以后情況如下:

此時nagios日志會記錄這一情況,從日志可以清楚的看到,4次 檢測間隔時間為1分鐘(以下為/var/log/messages中的情況,nagios會同時將日志記錄到syslog和它自己的日志中,默認如此,可以改變設置):
Apr 9 16:15:51 monitor-server1 nagios: SERVICE ALERT: server1;HTTP;CRITICAL;SOFT;1;connect to address 192.168.249.11 and port 80: Connection refused
Apr 9 16:16:51 monitor-server1 nagios: SERVICE ALERT: server1;HTTP;CRITICAL;SOFT;2;connect to address 192.168.249.11 and port 80: Connection refused
Apr 9 16:17:51 monitor-server1 nagios: SERVICE ALERT: server1;HTTP;CRITICAL;SOFT;3;connect to address 192.168.249.11 and port 80: Connection refused
Apr 9 16:18:51 monitor-server1 nagios: SERVICE ALERT: server1;HTTP;CRITICAL;HARD;4;connect to address 192.168.249.11 and port 80: Connection refused
Apr 9 16:18:51 monitor-server1 nagios: SERVICE NOTIFICATION: nagiosadmin;server1;HTTP;CRITICAL;notify-service-by-email;connect to address 192.168.249.11 and port 80: Connection refused
從上面最后一條日志可以看到nagios觸發了發送通知的操作。
與此同時,筆者的QQ郵箱也收到了這一通知郵件,時間相差只有3秒,反應非常迅速。筆者開啟了微信上的QQ郵箱通知功能,雖然不具備讓nagios直接調用微信平臺公眾號推送通知的能力,但這個方式感覺也很方便。 下圖是郵件的相關信息,其中包括郵件主題,正文內容及格式,都是可以在commands.cfg的mail部分配置的。示例如下:

當處理完server1 http這一critical后,nagios會在第一次檢測成功后即發送服務恢復的郵件。這些郵件發送的時機,檢測的次數這些都是在templates.cfg中定義好的。之所以連續檢測4次失敗才會發送通知郵件是由`max_check_attempts `決定的,默認配置為3,表示第一次檢測失敗后,最多再嘗試3次,如果還是檢測失敗,則即刻發送通知消息。失敗之后每次間隔一分鐘檢測一次,是由`retry_interval`參數定義的。
## 1.3 nagios對故障的反應時間小結
經過實際測試現對nagios故障反應時間做如下總結:
* nagios默認情況下會按照事先定義好的`check_interval`來檢測,主機或服務狀態變化那刻如果沒到相應監測項目的下一個檢測時間點,nagios server是不會去檢測的,默認情況下`check_interval`為5分鐘。
* nagios server要監控到主機或服務失敗最長的間隔是距離故障發生了一個檢測周期,取決于針對這一主機或服務所配置的檢測間隔。
* 相關人員收到nagios消息通知的時間最短也得距離故障發生有`retry_interval`*`max_retry_attempts`的時長了。
針對nagios server對故障反應的時長問題,應該可以通過用于主動監控的NSCA組件可以縮短,NSCA組件是用于實現更大規模的分布式監控體系的,它可以讓被監控端主動發送監控信息給nagios server。這一部分還有待后續學習實踐。
另外在nagios wed頁面中也可以很方便地對各個服務的郵件通知進行Disable或者Enable操作,特殊情況下可以臨時關閉對某主機或某些服務的通知操作,便于維護工作的展開。