我已经安装了Icinga 1.10,我正在使用NagiosQL来configuration它。 我有点在调整警报和通知。
Icinga暗示inheritance。 假设我们有一个名为prodweb01的生产Web服务器。 它有两个服务检查运行在它上面。 一个检查Apache是否正在工作,另一个检查JVM是否正在工作。 没有为任何检查设置警报设置,因此它从主机inheritance这些设置。 主机inheritance两个主机模板 – 通用Linux主机(其中有系统pipe理员的联系人)和通用networking主机(其中有开发人员的联系人)。 有没有办法编写逻辑,以便如果Apache停机,系统pipe理员会得到警报,如果JVM停机,开发人员会收到警报?
这甚至是做事的最好方式吗? 这种方法对于我们来说会很乏味,因为我们有一些被环境和angular色分隔的主机。 所以我们必须为每个服务器angular色(例如api,app,web等)创buildprod / non-prod通用Linux主机模板和prod / non-prod模板。 我们将不得不这样做,以便非prod通知不去短信,而prod的人做,因为我还没有看到一种方式告诉Icinga通过短信警报通过电子邮件prod和通过电子邮件非prod 。 要做到这一点的唯一方法似乎是为同一个人创build两个不同的联系人,一个使用SMS,一个使用电子邮件并根据环境将其应用于模板或主机。
编辑:我知道有人可能会指出,为什么我不只是在服务本身定义的警报/通知设置? 是的,可以做到这一点,但仍然没有解决如何分离产品和非产品警报的问题。 在这种情况下,解决scheme是创build两个版本的相同的服务检查,并在一个设置短信提醒和另一个电子邮件。
解决了我的问题。
Create two separate notification scripts in Icinga in commands.cfg define command { command_name Custom-Host-Notify command_line /etc/icinga/Custom-Host-Notify "$HOSTNAME$" "$HOSTSTATE$" "$SHORTDATETIME$" "$HOSTOUTPUT$" "$HOSTADDRESS$" "$NOTIFICATIONTYPE$" "$HOSTDISPLAYNAME" "$NOTIFICATIONAUTHOR$" "$NOTIFICATIONCOMMENT$" "$HOSTNOTESURL$" "$CONTACTPAGER$" "$CONTACTEMAIL$" register 1 } define command { command_name Custom-Service-Notify command_line /etc/icinga/Custom-Service-Notify "$HOSTNAME$" "$HOSTALIAS$" "$SERVICEDESC$" "$SERVICESTATE$" "$SHORTDATETIME$" "$SERVICEOUTPUT$" "$HOSTADDRESS$" "$NOTIFICATIONTYPE$" "$SERVICEDISPLAYNAME$" "$NOTIFICATIONAUTHOR$" "$NOTIFICATIONNAME$" "$SERVICENOTESURL$" "$CONTACTPAGER$" "$CONTACTEMAIL$" register 1 }
定义contacts.cfg
define contact { contact_name John Doe alias Senior Systems Engineer contactgroups SystemAdministrators host_notifications_enabled 1 service_notifications_enabled 1 host_notification_period 24x7 service_notification_period 24x7 host_notification_options d,u,r,f,s service_notification_options w,u,c,r,f,s host_notification_commands Custom-Host-Notify service_notification_commands Custom-Service-Notify email [email protected] ##This is how we send SMS to verizon phones using email. pager [email protected] register 1 }
在icinga.cfg中,启用这个 –
enable_environment_macros=1
在/ etc / icinga /中,创build被调用的两个脚本 –
定制主机通知
#!/bin/bash ##Icinga passes variables in this format - Custom-Host-Notify "$HOSTNAME$" "$HOSTSTATE$" "$SHORTDATETIME$" "$HOSTOUTPUT$" "$HOSTADDRESS$" "$NOTIFICATIONTYPE$" "$HOSTDISPLAYNAME" "$NOTIFICATIONAUTHOR$" "$NOTIFICATIONCOMMENT$" $HOSTNOTESURL$" "$CONTACTPAGER$" "$CONTACTEMAIL$" ##The quotes are essential since some of the variables have spaces and we need to capture the variable as a single variable. Bash sees space separated words as separate variables. #Define variables HOSTNAME="$1" HOSTSTATE="$2" SHORTDATETIME="$3" HOSTOUTPUT="$4" HOSTADDRESS="$5" NOTIFICATIONTYPE="$6" HOSTDISPLAYNAME="$7" NOTIFICATIONAUTHORS="$8" NOTIFICATIONCOMMENT="$9" HOSTNOTESURL="${10}" CONTACTPAGER="${11}" CONTACTEMAIL="${12}" ENV=`echo $1 | awk '{print substr($0,8,1)}'` ##Evaluate if the environment is Production.Please note, your logic may differ here. This is based on our naming convention. if [ "$ENV" == "p" ];then ##If Production, then send SMS /usr/bin/printf "%b" "$NOTIFICATIONTYPE - $HOSTNAME is $HOSTSTATE $SHORTDATETIME - Info:$HOSTOUTPUT ($HOSTADDRESS$)" | /bin/mail $CONTACTPAGER$ else /usr/bin/printf "%b" "$SHORTDATETIME - Info:\n\n$HOSTOUTPUT\n\n$NOTIFICATIONTYPE - Host $HOSTNAME is $HOSTSTATE\n\n(Address: $HOSTADDRESS Displayname: $HOSTDISPLAYNAME)\n\nNotes: $NOTIFICATIONAUTHOR $NOTIFICATIONCOMMENT\n$HOSTNOTESURL\n\nUrl:\nhttps://icinga-tech.apartmentsext.com/icinga/cgi-bin/extinfo.cgi?type=1&host=$HOSTNAME\n\n" | /bin/mail -s "$NOTIFICATIONTYPE - $HOSTNAME is $HOSTSTATE" $CONTACTEMAIL fi
定制服务的通知
#!bin/bash ##Icinga passes variables in this format - Custom-Service-Notify "$HOSTNAME$" "$HOSTALIAS$" "$SERVICEDESC$" "$SERVICESTATE$" "$SHORTDATETIME$" "$SERVICEOUTPUT$" "$HOSTADDRESS$" "$NOTIFICATIONTYPE$" "$SERVICEDISPLAYNAME" "$NOTIFICATIONAUTHOR$" "$NOTIFICATIONNAME$" $SERVICENOTESURL$" "$CONTACTPAGER$" "$CONTACTEMAIL$" ##The quotes are essential since some of the variables have spaces and we need to capture the variable as a single variable. Bash sees space separated words as separate variables. #Define variables HOSTNAME="$1" HOSTALIAS="$2" SERVICEDESC="$3" SERVICESTATE="$4" SHORTDATETIME="$5" SERVICEOUTPUT="$6" HOSTADDRESS="$7" NOTIFICATIONTYPE="$8" SERVICEDISPLAYNAME="$9" NOTIFICATIONAUTHORS="${10}" NOTIFICATIONNAME="${11}" SERVICENOTESURL="${12}" CONTACTPAGER="${13}" CONTACTEMAIL="${14}" ENV=`echo $1 | awk '{print substr($0,8,1)}'` ##Evaluate if the environment is Production.Please note, your logic may differ here. This is based on our naming convention. if [ "$ENV" == "p" ];then ##If Production, then send SMS echo "$NOTIFICATIONTYPE - $HOSTALIAS/$SERVICEDESC is $SERVICESTATE on $HOSTADDRESS at $SHORTDATETIME ($SERVICEOUTPUT)" | /bin/mail $CONTACTPAGER else ##If not production, send email /usr/bin/printf "%b" "$SHORTDATETIME - Info:\n\n$SERVICEOUTPUT\n\n$NOTIFICATIONTYPE - Service $SERVICEDESC on Host $HOSTALIAS is $SERVICESTATE\n\n(Address: $HOSTADDRESS Displayname: $SERVICEDISPLAYNAME)\n\nNotes: $NOTIFICATIONAUTHOR $NOTIFICATIONCOMMENT\n$SERVICENOTESURL\n\nUrl:\nhttps://icinga-tech.apartmentsext.com/icinga/cgi-bin/status.cgi?host=$HOSTNAME\n\n" | /bin/mail -s "$NOTIFICATIONTYPE - $HOSTALIAS/$SERVICEDESC is $SERVICESTATE" $CONTACTEMAIL fi
您可以随时根据自己的喜好自定义消息和variables。
重新启动Icinga,你很好去。
编辑:我决定放弃隐含inheritance,只需在服务模板中设置通知。 您可以在服务本身中设置通知。