I mucked with their provided perl script quite a bit but I simply could not get it to work. It just kept posting empty messages. Being impatient and a do-it-yourselfer I set about trying to find another way to accomplish this. I looked through the list of integrations and noticed that they had a custom one called Incoming WebHooks which is an easy way to get messages from external sources posted into Slack. The simplest way to utilize Incoming WebHooks is to use curl to post the message to Slack's API. I wrote a little bash script that provides a detailed Nagios alert, a link back to the Nagios web page and conditional emoji's! Each warning level (OK, WARNING, CRITICAL and UNKNOWN) has it's own emoji icon. Here are some example messages in my Slack client:
Here is my bash script that posts to Slack. I placed it in /usr/local/bin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# This script is used by Nagios to post alerts into a Slack channel | |
# using the Incoming WebHooks integration. Create the channel, botname | |
# and integration first and then add this notification script in your | |
# Nagios configuration. | |
# | |
# All variables that start with NAGIOS_ are provided by Nagios as | |
# environment variables when an notification is generated. | |
# A list of the env variables is available here: | |
# http://nagios.sourceforge.net/docs/3_0/macrolist.html | |
# | |
# More info on Slack | |
# Website: https://slack.com/ | |
# Twitter: @slackhq, @slackapi | |
# | |
# My info | |
# Website: http://matthewcmcmillan.blogspot.com/ | |
# Twitter: @matthewmcmillan | |
#Modify these variables for your environment | |
MY_NAGIOS_HOSTNAME="nagios.yourdomain.com" | |
SLACK_HOSTNAME="yourslack.slack.com" | |
SLACK_TOKEN="xyxyxyourslackkey" | |
SLACK_CHANNEL="#alerts" | |
SLACK_BOTNAME="nagios" | |
#Set the message icon based on Nagios service state | |
if [ "$NAGIOS_SERVICESTATE" = "CRITICAL" ] | |
then | |
ICON=":exclamation:" | |
elif [ "$NAGIOS_SERVICESTATE" = "WARNING" ] | |
then | |
ICON=":warning:" | |
elif [ "$NAGIOS_SERVICESTATE" = "OK" ] | |
then | |
ICON=":white_check_mark:" | |
elif [ "$NAGIOS_SERVICESTATE" = "UNKNOWN" ] | |
then | |
ICON=":question:" | |
else | |
ICON=":white_medium_square:" | |
fi | |
#Send message to Slack | |
curl -X POST --data "payload={\"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${SLACK_USERNAME}\", \"text\": \"${ICON} HOST: ${NAGIOS_HOSTNAME} SERVICE: ${NAGIOS_SERVICEDISPLAYNAME} MESSAGE: ${NAGIOS_SERVICEOUTPUT} <https://${MY_NAGIOS_HOSTNAME}/cgi-bin/nagios3/status.cgi?host=${NAGIOS_HOSTNAME}|See Nagios>\"}" https://${SLACK_HOSTNAME}/services/hooks/incoming-webhook?token=${SLACK_TOKEN} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################### | |
# Slack notifications | |
############################### | |
# 'notify-service-by-slack' command definition | |
define command { | |
command_name notify-service-by-slack | |
command_line /usr/local/bin/slack_nagios.sh > /tmp/slack.log 2>&1 | |
} | |
# 'notify-host-by-slack' command definition | |
define command { | |
command_name notify-host-by-slack | |
command_line /usr/local/bin/slack_nagios.sh > /tmp/slack.log 2>&1 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
define contact { | |
contact_name slack | |
alias Slack | |
service_notification_period 24x7 | |
host_notification_period 24x7 | |
service_notification_options w,u,c,r | |
host_notification_options d,r | |
service_notification_commands notify-service-by-slack | |
host_notification_commands notify-host-by-slack | |
} | |
define contactgroup{ | |
contactgroup_name admins | |
alias Nagios Administrators | |
members root,slack | |
} | |
define contactgroup{ | |
contactgroup_name admins-page | |
alias Nagios Administrators | |
members root,slack | |
} |