如何實現(xiàn)nagios發(fā)送通知郵件
前言
上一篇已經(jīng)介紹了nagios如何實現(xiàn)對主機(jī)及服務(wù)的監(jiān)控,盡可能實現(xiàn)對系統(tǒng)運行狀態(tài)的全面監(jiān)控只是初級目標(biāo),nagios還可以借助smtp服務(wù)發(fā)送通知信息給指定的聯(lián)系人。
本文所用到系統(tǒng)環(huán)境OS:CentOS release 6.8 (Final) 2.6.32-642.el6.x86_64還有一個重要環(huán)境:互聯(lián)網(wǎng)(yum、百度、Google)。各軟件包:

nagios發(fā)送通知郵件的配置過程如下:
1. nagios服務(wù)配置內(nèi)容
- 修改templates.cfg要讓nagios能夠發(fā)送郵件,首先要定義什么情況下可以觸發(fā)nagios來發(fā)送郵件通知,郵件的接收對象,以及通知郵件發(fā)送的時間段及頻率等,這些參數(shù)都需要事先在templates.cfg文件中定義好。示例如下:
- 修改services.cfg首先要注意的是筆者的services.cfg文件中對有些服務(wù)的監(jiān)控是沒有使用check_nrpe指令的,如ping測試,ssh,http服務(wù)都是直接使用的相應(yīng)的plugin來監(jiān)測的。所以如果要修改這些服務(wù)的監(jiān)控告警閾值需要修改這個services.cfg文件,而對于其它調(diào)用了check_nrep指令的服務(wù)則同樣需要修改/usr/local/nagios/etc/nrpe.cfg,并且確保兩者中的指令名稱一樣。services.cfg示例如下:
- 對于使用check_nrpe指令來啟動的監(jiān)控對象則需要修改/usr/local/nagios/etc/nrpe.cfg中的命令參數(shù),來配置相應(yīng)的warinning和critical閾值。示例如下:
- 實際工作中,根據(jù)業(yè)務(wù)需求進(jìn)行配置,上述數(shù)值只作為示例。
- 修改commands.cfg在上面的配置模板templates.cfg中可以看到分別針對主機(jī)和服務(wù)的通知發(fā)送引用了兩個命令:notify-host-by-email和notify-service-by-email,這兩個命令具體是什么樣的,它是在commands.cfg文件中定義的。示例如下:
- 修改contracts.cfg修改contracts.cfg文件的目的是為了定義當(dāng)nagios需要發(fā)送通知時nagios知道要將通知發(fā)給誰。示例如下:
2. 郵件服務(wù)配置
- 檢查nagios server的smtp服務(wù)是否正常Linux主機(jī)上可以通過sendmail或者postfix來啟動smtp服務(wù),使用ss -tnl來檢查25端口是否開啟即可。如果則檢查是否安裝了sendmail或者postfix軟件包,二者有其一即可,如果安裝了,手動將服務(wù)啟動即可service sendmail start或者service postfix start。
- 配置nagios server本機(jī)發(fā)件賬戶因為這臺nagios服務(wù)器沒有郵件域名注冊在公網(wǎng)上,nagios系統(tǒng)默認(rèn)情況下會使用名為nagios@nagios-server-name的郵件地址給contracts.cfg中定義的郵件地址發(fā)送通知郵件,這個地址不是合法的,所以要么郵件發(fā)送不出去,要么發(fā)送出去了,會被收件者郵件服務(wù)器放到垃圾箱中,如果沒有公司郵件可以使用,那么可以配置如網(wǎng)易這類公共郵箱來進(jìn)行郵件的發(fā)送。
需要注意1. 登錄網(wǎng)頁郵箱設(shè)置中確認(rèn)已開啟smtp服務(wù)。2. 為郵箱啟用授權(quán)碼,在設(shè)置中可以找到,163郵箱的授權(quán)碼是自己設(shè)定的的,并記好在第三方的郵件客戶端軟件中配置163郵箱時要用到。3. QQ郵箱同樣可以設(shè)置授權(quán)碼,但它是隨機(jī)變化的,每次設(shè)置時都不一樣,且它的smtp連接需要使用ssl,在Linux中筆者沒搞定,所以建議不要將QQ郵箱作為nagios通知郵件的發(fā)送方。
給本機(jī)配置發(fā)件時使用的郵箱服務(wù)是通過修改mail.rc文件完成的,在其最后加上如下內(nèi)容:
- 修改完成以后,重啟一下smtp服務(wù),sendmail或者postfix。
- 使用mail發(fā)送測試郵件使用mail指令來發(fā)送測試郵件,以驗證nagios server是否已可以使用剛才配置的163郵箱往指定的郵箱發(fā)送郵件了。mail指令由mailx軟件包提供,其路徑要和commands.cfg里定義的路徑一致,即/bin/mail。測試方式:
- 測試nagios發(fā)送通知郵件在確保nagios服務(wù)器可以通過配置的163郵箱往外成功發(fā)送郵件以后,接著測試nagios發(fā)送通知郵件的功能是否正常。制造告警測試環(huán)境中,筆者人為將一臺名為server1上的http服務(wù)down掉nginx -s stop,然后觀察naginx web頁面監(jiān)控,及查看是否能夠收到通知郵件。觀察到的nagios web頁面監(jiān)控信息如下:
nagios監(jiān)控到http不可用觸發(fā)critical告警
時間上可以看到是:2017-04-09 16:15:51,嘗試了1/4即檢測到了一次失敗,此時還不會發(fā)送通知郵件,只有連續(xù)檢測到了4次失敗才會發(fā)送通知郵件。接著當(dāng)檢測到了4次以后情況如下:

連續(xù)檢測到4次critical
此時nagios日志會記錄這一情況,從日志可以清楚的看到,4次 檢測間隔時間為1分鐘(以下為/var/log/messages中的情況,nagios會同時將日志記錄到syslog和它自己的日志中,默認(rèn)如此,可以改變設(shè)置):

從上面最后一條日志可以看到nagios觸發(fā)了發(fā)送通知的操作。與此同時,筆者的QQ郵箱也收到了這一通知郵件,時間相差只有3秒,反應(yīng)非常迅速。筆者開啟了微信上的QQ郵箱通知功能,雖然不具備讓nagios直接調(diào)用微信平臺公眾號推送通知的能力,但這個方式感覺也很方便。 下圖是郵件的相關(guān)信息,其中包括郵件主題,正文內(nèi)容及格式,都是可以在commands.cfg的mail部分配置的。示例如下:

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