使用nagios發送通知郵件


前言
上一篇已經介紹了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頁面監控信息如下:  

   ![nagios監控到http不可用觸發critical告警](http://upload-images.jianshu.io/upload_images/1920135-e4340ab63145d92c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  
時間上可以看到是:2017-04-09 16:15:51,嘗試了1/4即檢測到了一次失敗,此時還不會發送通知郵件,只有連續檢測到了4次失敗才會發送通知郵件。    
接著當檢測到了4次以后情況如下:  

![連續檢測到4次critical](http://upload-images.jianshu.io/upload_images/1920135-b315619006055d33.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  

   此時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部分配置的。示例如下:      

![nagios通知郵件微信推送](http://upload-images.jianshu.io/upload_images/1920135-92c9e9f0c91b60d7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  

  當處理完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操作,特殊情況下可以臨時關閉對某主機或某些服務的通知操作,便于維護工作的展開。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容