使用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阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容