首页 男生 其他 跟老男孩学Linux运维:Web集群实战

14.7 实现将Nagios故障报警给管理员

  您可以在百度里搜索“跟老男孩学Linux运维:Web集群实战 艾草文学(www.321553.xyz)”查找最新章节!

  

  14.7 实现将Nagios故障报警给管理员

  要将Nagios故障报警给管理员时,常用的方式包括邮件报警和手机报警,下面分别介绍。

  1.邮件报警

  普通邮件报警就是在故障发生或恢复时,将报警信息发到系统管理员或相关维护人员的信箱中,一般来说最好使用公司内部信箱作为报警信箱。读者线下学习测试时如果用QQ、126等信箱可能会有收不到邮件的情况或者被当做垃圾邮件了,可以采用第三方SMTP服务测试,其测试报警的效果会好很多,前文已经讲过,不再赘述。

  一般白天上班时,邮件报警还算比较及时,但是如果人不在计算机旁(开会、休息时),邮件报警就不行了,因此,邮件报警只适合不是特别重要的业务,或者作为发送大量报警信息中的一个辅助方式,如硬盘、内存、及日志相关等不需要及时解决的服务报警。故而,在生产环境中,邮件报警一般会结合其他报警方式一起使用。

  那么,下面就来看一下邮件报警的基本配置方法。

  首先,添加监控报警的接收Email地址。

  [root@nagios-server nagios]# vi/usr/local/nagios/etc/objects/contacts.cfg +35 修改如下行: emailnagios@localhost改为: email [email protected] #2.快速修改方法:sed -i's#nagios@localhost#[email protected]#'/usr/local/nagios/etc/objects/contacts.cfg保存,退出。

  实现发邮件功能常见有两种方案。

  第一种方案:依赖本机的sendmail或postfix服务,可执行/etc/init.d/postfixstart开启。

  [root@nagios-server ~]# /etc/init.d/postfix restart Shuttingdown postfix: [ OK ] Starting postfix: [ OK ] [root@nagios-server~]# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEmaster 1399 root 12u IPv4 10507 0t0 TCP localhost:smtp (LISTEN)master 1399 root 13u IPv6 10509 0t0 TCP localhost:smtp (LISTEN)

  如果postfix启动比较慢,可以修改/etc/hosts,如下:

  [root@nagios-server ~]# cat /etc/hosts 127.0.0.1 localhostlocalhost.localdomain localhost4 localhost4.localdomain4::1localhost localhost.localdomain localhost6 localhost6.localdomain610.0.0.7 nagios-server #<==增加主机名和IP的解析

  第二种方案:使用第三方的smtp服务(网易、QQ等),即在网易等注册好邮箱,然后通过SMTP服务发送邮件。

  在command.cfg里,Nagios默认的报警配置信息如下:

  [root@nagios-server ~]# cd /usr/local/nagios/etc/objects/[root@nagios-server objects]# sed -n '27,37p' commands.cfg #'notify-host-by-email' command definition #<==主机报警的命令配置 definecommand{ command_name notify-host-by-email command_line/usr/bin/printf "%b" "***** Nagios *****Notification Type:$NOTIFICATIONTYPE$Host: $HOSTNAME$State: $HOSTSTATE$Address:$HOSTADDRESS$Info: $HOSTOUTPUT$Date/Time: $LONGDATETIME$" |/bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is$HOSTSTATE$ **" $CONTACTEMAIL$ #<==这里是具体的调用linux 下mail命令发送的命令 }# 'notify-service-by-email' command definition define command{command_name notify-service-by-email #<==服务报警的命令配置 command_line/usr/bin/printf "%b" "***** Nagios *****Notification Type:$NOTIFICATIONTYPE$Service: $SERVICEDESC$Host: $HOSTALIAS$Address:$HOSTADDRESS$State: $SERVICESTATE$Date/Time:$LONGDATETIME$Additional Info:$SERVICEOUTPUT$" | /bin/mail -s "**$NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is$SERVICESTATE$ **" $CONTACTEMAIL$ #<==这里是具体的调用linux下mail命令发送的命令}

  上述notify-host-by-email和notify-service-by-email在templates.cfg的联系人模板下默认已配置(如果还需要配置短信、飞信、微信等需要在后面追加命令)。

  [root@nagios-server objects]# sed -n '28,37p' templates.cfg|sed-r 's#(.*);.*$#1#g' define contact{ name generic-contactservice_notification_period 24x7 host_notification_period 24x7service_notification_options w,u,c,r,f,s host_notification_optionsd,u,r,f,s service_notification_commands notify-service-by-emailhost_notification_commands notify-host-by-email register 0 }

  只要报警联系人使用了generic-contact作为配置模板(这也是默认的配置),那么就可以进行主机和服务报警了。

  由于报警信息不仅仅是要通过邮件发送,可能还涉及短信,而短信一般都有字符数限制(70字以内),因此在默认的报警内容比较多的情况下,要优化报警的内容,只报关键的信息,详细的信息让其查看邮件正文。调整如下:

  # 'notify-host-by-email' command definition define command{command_name notify-host-by-email command_line /usr/bin/printf "%b""***** Nagios *****Notification Type: $NOTIFICATIONTYPE$Host:$HOSTNAME$State: $HOSTSTATE$Address: $HOSTADDRESS$Info:$HOSTOUTPUT$Date/Time: $LONGDATETIME$" | /bin/mail -s"Host$HOSTSTATE$ alert for $HOSTNAME$!" $CONTACTEMAIL$ }

  经过上述修改后,报警邮件的标题就简化了,例如:某主机的报警“Host DOWN alert foridc-11-200”,意思是idc-11-200主机宕机了,清晰明了。

  # 'notify-service-by-email' command definition define command{command_name notify-service-by-email command_line /usr/bin/printf"%b" "***** Nagios *****Notification Type:$NOTIFICATIONTYPE$Service: $SERVICEDESC$Host: $HOSTALIAS$Address:$HOSTADDRESS$State: $SERVICESTATE$Date/Time:$LONGDATETIME$Additional Info:$SERVICEOUTPUT$" | /bin/mail -s"$HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ " $CONTACTEMAIL$

  同样,若服务报警的邮件标题为“10-web01/80_url isCRITICAL”,则意思是10-web01主机80_url有严重故障了。

  说明:工作中的报警需要遵循一个原则,“该报的一定要报出来,不该报的就一定不要报出来”。这句话的要求可能太完美,难以做到,但是我们可以无限接近。

  2.手机短信报警

  手机短信报警可采用139、126、189等信箱,或者飞信、SMS网关。一般用于紧急的业务报警。

  ·飞信报警:装个飞信客户端,把对方手机加为好友(需要对方确认),然后就可以给对方发短信了。

  ·邮件转短信报警:实现信箱邮件通知手机的一个功能。

  ·http短信网关:此为收费项目。

  购买后的http短信网关地址类似如下:

  http://s.ccme.cc/qxt/send.jspcircle=oldboy&pwd=oldboy123&mobile=$CONTACT&service=abcd546-eee6-gg69-gg40-3gg0524c1f88d&msgid=23224&message=$TITLE[${alert_date}sa]

  ·购买短信猫:这是类似手机终端一样的客户端硬件设备,监控服务器调用短信猫实现发短信报警,图14-29就是短信猫设备。

  说明:其实开发任何程序对于Nagios来说都只是一个插件而已,因此,监控内存,短信报警,以及其他业务类插件的开发和部署方法是一样的。仅仅是功能和名字不同而已。

  图14-29 短信猫设备图

  经过多年的实践,对Nagios报警的使用,老男孩推荐采用HTTP短信网关接口方式,有专门的公司提供直接发送信息到手机的短信网关,常用的报警命令就是一个URL地址携带传参信息的形式,报警执行的命令展示如下。

  curl -d cdkey=3ADK-DFY-3430-MADQK -d password=52324235 -dphone=$CONTACT -d message="$TITLE[${ALERT_DATE} oldboy]" http://sdkhttp.eucp.b2m.cn/sdkproxy/sendsms.action

  这里的curl-d用于把参数传给后面的URL,URL是花钱购买的短信发送接口。

  在赋予执行权限后,手工执行“/usr/local/nagios/libexec/sms_send内容加手机号”来进行测试。

  推荐原因:

  1)收费合理,报警比较及时,服务有保证。

  2)设置简单,一个简单脚本搞定。

  部分公司为了省钱,使用139和飞信、微信等短信报警方式,老男孩认为除非业务宕机确实没关系,最好还是不要采用这种方式。适当的花费,很好的解决报警问题才是最好的运维策略,不花钱的报警,服务上和收费的相比还是差距不小的,作为辅助方式可以。下面针对HTTP短信网关的报警进行介绍。

  在购买短信服务后,除了有界面可以发送报警(一般市场人员用)外,还会有一个URL地址,地址后面携带账号、密码、及报警信息。URL地址如下面的形式:

  http://s.ccme.cc/qxt/send.jspcircle=oldboy&pwd=oldboy123&mobile=$CONTACT&service=abcd546-eee6-gg69-gg40-3gg0524c1f88d&msgid=23224&message=$TITLE[${alert_date}sa]

  在这个地址中的信息如表14-6所示。

  表14-6 HTTP短信网关携带的信息列表

  实际发送命令演示如下:

  #curl方式 curl -d cdkey=3RTY-EMY-0980-MTUQ2 -d password=189162 -dphone=$CONTACT -d message="$TITLE[${alert_date} oldboysa]" http://sdkhttp.eucp.b2m.cn/sdkproxy/sendsms.action #wget --quiet "http://s.ccme.cc/qxt/send.jspcircle=159net_131&pwd=oldboy123&mobile=18911718229&service=f1fb0546-ebb6-0987-8f20-560524c1f88d&msgid=3956724&message=$TITLE[${alert_date}oldboysa n]"

  下面介绍一下实现短信网关设备报警的细节。首先,开发报警脚本sms_send放在libexec目录下面,授权755。

  [root@nagios-server ~]# cd /usr/local/nagios/libexec/[root@nagios-server libexec]# cat -n sms_send 1#!/bin/sh2PROGNAME=`basename $0` 3PROGPATH=`dirname $0` 4print_usage() { 5echo "Usage: /bin/sh $PROGNAME title contact" 6 exit 1 7} 8if [ $#-ne 2 ];then 9 print_usage 10fi 11alert_date=$(date +%y-%m-%d""%H:%M) 12TITLE=$1 #<==发送主题,即短信内容 13CONTACT=$2 #<==发送地址,手机号14#FORMAT "Host $HOSTSTATE$ alert for $HOSTNAME$" 15curl -dcdkey=3RTY-EMY-0980-MTUQ2 -d password=189162 -d phone=$CONTACT -dmessage="$TITLE[${alert_date} oldboysa]" http://sdkhttp.eucp.b2m.cn/sdkproxy/sendsms.action [root@nagios-serverlibexec]# chmod +x sms_send

  然后在command.cfg中定义报警脚本。

  #command.cfg # 'notify-host-by-pager' command definition definecommand{ command_name notify-host-by-pager command_line$USER1$/sms_send "Host $HOSTSTATE$ alert for $HOSTNAME$"$CONTACTPAGER$#$USER1$/sms_send就是调用上面/usr/local/nagios/libexec/sms_send脚本 #"Host$HOSTSTATE$ alert for $HOSTNAME$" 是主机报警标题,即短信内容#$CONTACTPAGER$是报警联系人,即手机号 } # 'notify-service-by-pager' commanddefinition define command{ command_name notify-service-by-pagercommand_line $USER1$/sms_send "$HOSTALIAS$/$SERVICEDESC$ is$SERVICESTATE$" $CONTACTPAGER$#$USER1$/sms_send就是调用上面/usr/local/nagios/libexec/sms_send脚本#"$HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" 是服务报警标题,即短信内容#$CONTACTPAGER$是报警联系人,即手机号 }

  接着在模板templates.cfg中增加如下配置,即在command.cfg中定义报警脚本里短信报警的命令名,编辑templates.cfg里的定义内容为:

  define contact{ name generic-contact service_notification_period24x7 host_notification_period 24x7 service_notification_optionsw,u,c,r,f,s host_notification_options d,u,r,f,sservice_notification_commandsnotify-service-by-email,notify-service-by-pagerhost_notification_commandsnotify-host-by-email,notify-service-by-pager register 0 }

  最后在联系人contact.cfg里做如下联系人定义。

  define contact{ contact_name oldboy-pager use generic-contactalias Nagios users pager 18911111111 } define contactgroup{contactgroup_name admins alias Nagios Administrators membersnagiosadmin,oldboy-pager }

  这样就可以实现通过HTTP短信网关报警了。 跟老男孩学Linux运维:Web集群实战

目录
设置
手机
书架
书页
评论