如何實現nagios發送通知郵件
前言
上一篇已經介紹了nagios如何實現對主機及服務的監控,盡可能實現對系統運行狀態的全面監控只是初級目標,nagios還可以借助smtp服務發送通知信息給指定的聯系人。
本文所用到系統環境OS:CentOS release 6.8 (Final) 2.6.32-642.el6.x86_64還有一個重要環境:互聯網(yum、百度、Google)。各軟件包:
nagios發送通知郵件的配置過程如下:
1. nagios服務配置內容
- 修改templates.cfg要讓nagios能夠發送郵件,首先要定義什么情況下可以觸發nagios來發送郵件通知,郵件的接收對象,以及通知郵件發送的時間段及頻率等,這些參數都需要事先在templates.cfg文件中定義好。示例如下:
- 修改services.cfg首先要注意的是筆者的services.cfg文件中對有些服務的監控是沒有使用check_nrpe指令的,如ping測試,ssh,http服務都是直接使用的相應的plugin來監測的。所以如果要修改這些服務的監控告警閾值需要修改這個services.cfg文件,而對于其它調用了check_nrep指令的服務則同樣需要修改/usr/local/nagios/etc/nrpe.cfg,并且確保兩者中的指令名稱一樣。services.cfg示例如下:
- 對于使用check_nrpe指令來啟動的監控對象則需要修改/usr/local/nagios/etc/nrpe.cfg中的命令參數,來配置相應的warinning和critical閾值。示例如下:
- 實際工作中,根據業務需求進行配置,上述數值只作為示例。
- 修改commands.cfg在上面的配置模板templates.cfg中可以看到分別針對主機和服務的通知發送引用了兩個命令:notify-host-by-email和notify-service-by-email,這兩個命令具體是什么樣的,它是在commands.cfg文件中定義的。示例如下:
- 修改contracts.cfg修改contracts.cfg文件的目的是為了定義當nagios需要發送通知時nagios知道要將通知發給誰。示例如下:
2. 郵件服務配置
- 檢查nagios server的smtp服務是否正常Linux主機上可以通過sendmail或者postfix來啟動smtp服務,使用ss -tnl來檢查25端口是否開啟即可。如果則檢查是否安裝了sendmail或者postfix軟件包,二者有其一即可,如果安裝了,手動將服務啟動即可service sendmail start或者service postfix start。
- 配置nagios server本機發件賬戶因為這臺nagios服務器沒有郵件域名注冊在公網上,nagios系統默認情況下會使用名為nagios@nagios-server-name的郵件地址給contracts.cfg中定義的郵件地址發送通知郵件,這個地址不是合法的,所以要么郵件發送不出去,要么發送出去了,會被收件者郵件服務器放到垃圾箱中,如果沒有公司郵件可以使用,那么可以配置如網易這類公共郵箱來進行郵件的發送。
需要注意1. 登錄網頁郵箱設置中確認已開啟smtp服務。2. 為郵箱啟用授權碼,在設置中可以找到,163郵箱的授權碼是自己設定的的,并記好在第三方的郵件客戶端軟件中配置163郵箱時要用到。3. QQ郵箱同樣可以設置授權碼,但它是隨機變化的,每次設置時都不一樣,且它的smtp連接需要使用ssl,在Linux中筆者沒搞定,所以建議不要將QQ郵箱作為nagios通知郵件的發送方。
給本機配置發件時使用的郵箱服務是通過修改mail.rc文件完成的,在其最后加上如下內容:
- 修改完成以后,重啟一下smtp服務,sendmail或者postfix。
- 使用mail發送測試郵件使用mail指令來發送測試郵件,以驗證nagios server是否已可以使用剛才配置的163郵箱往指定的郵箱發送郵件了。mail指令由mailx軟件包提供,其路徑要和commands.cfg里定義的路徑一致,即/bin/mail。測試方式:
- 測試nagios發送通知郵件在確保nagios服務器可以通過配置的163郵箱往外成功發送郵件以后,接著測試nagios發送通知郵件的功能是否正常。制造告警測試環境中,筆者人為將一臺名為server1上的http服務down掉nginx -s stop,然后觀察naginx web頁面監控,及查看是否能夠收到通知郵件。觀察到的nagios web頁面監控信息如下:
nagios監控到http不可用觸發critical告警
時間上可以看到是:2017-04-09 16:15:51,嘗試了1/4即檢測到了一次失敗,此時還不會發送通知郵件,只有連續檢測到了4次失敗才會發送通知郵件。接著當檢測到了4次以后情況如下:
連續檢測到4次critical
此時nagios日志會記錄這一情況,從日志可以清楚的看到,4次 檢測間隔時間為1分鐘(以下為/var/log/messages中的情況,nagios會同時將日志記錄到syslog和它自己的日志中,默認如此,可以改變設置):
從上面最后一條日志可以看到nagios觸發了發送通知的操作。與此同時,筆者的QQ郵箱也收到了這一通知郵件,時間相差只有3秒,反應非常迅速。筆者開啟了微信上的QQ郵箱通知功能,雖然不具備讓nagios直接調用微信平臺公眾號推送通知的能力,但這個方式感覺也很方便。 下圖是郵件的相關信息,其中包括郵件主題,正文內容及格式,都是可以在commands.cfg的mail部分配置的。示例如下:
nagios通知郵件微信推送
當處理完server1 http這一critical后,nagios會在第一次檢測成功后即發送服務恢復的郵件。這些郵件發送的時機,檢測的次數這些都是在templates.cfg中定義好的。之所以連續檢測4次失敗才會發送通知郵件是由max_check_attempts決定的,默認配置為3,表示第一次檢測失敗后,最多再嘗試3次,如果還是檢測失敗,則即刻發送通知消息。失敗之后每次間隔一分鐘檢測一次,是由retry_interval參數定義的。
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操作,特殊情況下可以臨時關閉對某主機或某些服務的通知操作,便于維護工作的展開。