Мунинское оповещение / уведомление не выполняется
У меня есть собственный скрипт уведомлений, который я хочу предоставлять с данными от munin всякий раз, когда происходит критическое событие. К сожалению, я не смог заставить его работать, следуя официальным документам. Сам скрипт уведомления протестирован и работает нормально при вызове из оболочки с поддельными данными. Это разрешения на 755, поэтому выполнение не должно быть проблемой. Следовательно, контактный хук, вероятно, не вызывается. Что я сделал, это:
# /etc/munin/munin-conf.d/custom.cnf
[...]
contact.slack.command MUNIN_SERVICESTATE="${var:worst}" MUNIN_HOST="${var:host}" MUNIN_SERVICE="${var:graph_title}" MUNIN_GROUP=${var:group} /usr/local/bin/notify_slack_munin
contact.slack.always_send warning critical
contact.slack.text ${if:cfields \u000A* CRITICALs:${loop<,>:cfields ${var:label} is ${var:value} (outside range [${var:crange}])${if:extinfo : ${var:extinfo}}}.}${if:wfields \u000A* WARNINGs:${loop<,>:wfields ${var:label} is ${var:value} (outside range [${var:wrange}])${if:extinfo : ${var:extinfo}}}.}${if:ufields \u000A* UNKNOWNs:${loop<,>:ufields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}${if:fofields \u000A* OKs:${loop<,>:fofields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}
Над этими линиями определены узлы и каталоги, что прекрасно работает. Но уведомление не выходит. Ты хоть представляешь, что это может быть?
1 ответ
Я просто поиграл с тем же сценарием, который изначально был в gist, и запустил его после исправления двух тривиальных ошибок:
- убедитесь, что вы положили контакты в конфигурации перед деревом хоста. Я поместил его в конец файла конфигурации, и он вообще не вызывался, пока я не переместил его туда, где размещены образцы контактов
- убедитесь, что команда в конфигурации Munin использует полное имя файла, поэтому если вы поместите скрипт в
/usr/local/bin/notify_slack_munin
затем убедитесь, что в файле нет расширения
Как написано в Munin Guide, смотрите munin-limit.log, чтобы увидеть, что происходит.
Последнее замечание, если у вас есть contact.slack.always_send warning critical
он будет выдвигать уведомление повторно, а не только об изменениях серьезности.
Для справки (в случае торможения основной ссылки) скрипт, вызывающий веб-крючок Slack, выглядит следующим образом (немного изменен для пояснения):
#!/bin/bash
# Slack notification script for Munin
# Mark Matienzo (@anarchivist)
# https://gist.github.com/anarchivist/58a905515b2eb2b42fe6
#
# To use:
# 1) Create a new incoming webhook for Slack
# 2) Edit the configuration variables that start with "SLACK_" below
# 3) Add the following to your munin configuration before the host tree
# in the part where sample contacts are listed:
#
# # -- Slack contact configuration
# # notify_slack_munin.sh is the full file name
# contact.slack.command MUNIN_SERVICESTATE="${var:worst}" MUNIN_HOST="${var:host}" MUNIN_SERVICE="${var:graph_title}" MUNIN_GROUP=${var:group} /usr/local/bin/notify_slack_munin.sh
# # This line will spam Slack with notifications even if no state change happens
# contact.slack.always_send warning critical
# # note: This has to be on one line for munin to parse properly
# contact.slack.text ${if:cfields \u000A* CRITICALs:${loop<,>:cfields ${var:label} is ${var:value} (outside range [${var:crange}])${if:extinfo : ${var:extinfo}}}.}${if:wfields \u000A* WARNINGs:${loop<,>:wfields ${var:label} is ${var:value} (outside range [${var:wrange}])${if:extinfo : ${var:extinfo}}}.}${if:ufields \u000A* UNKNOWNs:${loop<,>:ufields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}${if:fofields \u000A* OKs:${loop<,>:fofields ${var:label} is ${var:value}${if:extinfo : ${var:extinfo}}}.}
SLACK_CHANNEL="#insert-your-channel"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/insert/your/hookURL"
SLACK_USERNAME="munin"
SLACK_ICON_EMOJI=":munin:"
# If you want to test the script, you may have to comment this out to avoid hanging console
input=`cat`
#Set the message icon based on service state
if [ "$MUNIN_SERVICESTATE" = "CRITICAL" ]
then
ICON=":exclamation:"
COLOR="danger"
elif [ "$MUNIN_SERVICESTATE" = "WARNING" ]
then
ICON=":warning:"
COLOR="warning"
elif [ "$MUNIN_SERVICESTATE" = "ok" ]
then
ICON=":white_check_mark:"
COLOR="good"
elif [ "$MUNIN_SERVICESTATE" = "OK" ]
then
ICON=":white_check_mark:"
COLOR="good"
elif [ "$MUNIN_SERVICESTATE" = "UNKNOWN" ]
then
ICON=":question:"
COLOR="#00CCCC"
else
ICON=":white_medium_square:"
COLOR="#CCCCCC"
fi
# Generate the JSON payload
PAYLOAD="{\"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${SLACK_USERNAME}\", \"icon_emoji\": \"${SLACK_ICON_EMOJI}\", \"attachments\": [{\"color\": \"${COLOR}\", \"fallback\": \"Munin alert - ${MUNIN_SERVICESTATE}: ${MUNIN_SERVICE} on ${MUNIN_HOST}\", \"pretext\": \"${ICON} Munin alert - ${MUNIN_SERVICESTATE}: ${MUNIN_SERVICE} on ${MUNIN_HOST} in ${MUNIN_GROUP} - <http://central/munin/|View Munin>\", \"fields\": [{\"title\": \"Severity\", \"value\": \"${MUNIN_SERVICESTATE}\", \"short\": \"true\"}, {\"title\": \"Service\", \"value\": \"${MUNIN_SERVICE}\", \"short\": \"true\"}, {\"title\": \"Host\", \"value\": \"${MUNIN_HOST}\", \"short\": \"true\"}, {\"title\": \"Current Values\", \"value\": \"${input}\", \"short\": \"false\"}]}]}"
#Send message to Slack
curl -sX POST -o /dev/null --data "payload=${PAYLOAD}" $SLACK_WEBHOOK_URL 2>&1