Nagios и HipChat: выставление acknowledge (ACK) статуса на пробники

Схема функционирования:

  1. Nagios посылает ALARM в комнату Hipchat-а при срабатывании пробника (сервер нагиос)
  2. Пользователь HipChat отвечает на сообщение ACK ответом (через сервер hipchat)
  3. Nagios обрабатывает запрос ACK (сервер нагиос)

Для работы необходим запущенный демон на сервере нагиос: /usr/local/etc/rc.d/hipchat start|stop

Подробности:

В HipChat созданы комнаты: nagios_devops-infra, nagios_devops-core

Каждой комнате, HipChat присваивает уникальный номер. Для доступа к API необходимо получить token через веб-интерфейс (например, для комнаты с номером 216, т.е. для nagios_devops-infra: https://hipchat.local/rooms/tokens/216).

  1. NAGIOS

Для nagios_devops-infra:
Описание контакта:

define contact{
contact_name devops-infra-hipchat
use contact-by-hipchat
alias devops-infra-hipchat
email devops-infra-hipchat:216:token
}

Где 216 - номер комнаты, token - token

Команды, которые нагиос запускает в случае алерта:

Темплейт:

define contact{
name contact-by-hipchat
service_notification_period 24x7
host_notification_period 24x7
service_notification_options c,r
host_notification_options d,r
service_notification_commands notify-service-by-hipchat
host_notification_commands notify-host-by-hipchat
register 0
}

И сами команды:

define command{
command_name notify-host-by-hipchat
command_line $USER2$/notify_to_hipchat.pl $CONTACTEMAIL$ "$HOSTNAME$ $HOSTSTATE$ is $NOTIFICATIONTYPE$ $HOSTSTATE$"
}

define command{
command_name notify-service-by-hipchat
command_line $USER2$/notify_to_hipchat.pl $CONTACTEMAIL$ "$HOSTNAME$ $SERVICEDESC$ is $NOTIFICATIONTYPE$ $SERVICESTATE$"
}

Скрипт notify_to_hipchat.pl на основе полученных данных генерит и отправляет в комнату ответственных админов сообщение, например такое: myserver.local CHECK_HTTP is PROBLEM CRITICAL:

#!/usr/bin/perl -w
use strict;

my @array_hipchat=@ARGV;
my @TO = split(':',$array_hipchat[0]);
my $TEXT = $array_hipchat[1];

my $realtext = $TEXT;

my $url = "https://hipchat.rbc.ru/v2/room/$TO[1]/notification?auth_token=$TO[2]";
use LWP::UserAgent;
my $ua = LWP::UserAgent->new(
ssl_opts => { SSL_verify_mode => 'SSL_VERIFY_NONE'},
);
my $req = HTTP::Request->new(POST=>$url);
$req->content_type('application/json');
my $json = '{
"color":"purple",
"message_format":"text",
"message":"'.$realtext.'"
}';
$req->content( $json );
my $res = $ua->request($req);
print $res->status_line,$!, "\n";
if ($res->is_success) {
my $ticket_res = $res->content;
print "$ticket_res\n";
} 

 

2. HIPCHAT

Пользователь отвечает на сообщение ACK ответом (принимается только один ACK):

для сервисов: /ack myserver.local CHECK_HTTP 2016-08-30 11:55

для хостов: /ack myserver.local 2016-08-30 11:55

Также можно запросить помощь отправив команду /ack в диалог боту.

На пользовательский ответ срабатывает вебхук (собственно /ack и есть вебхук). Хук настраивается собственными средствами HipChat по ссылке https://hipchat.local/rooms/show/216 далее идти в Integrations (216 это номер комнаты).

Хук настроен на POST запрос http://ip_nagios:9090/

3. NAGIOS

На порту 10.14.7.129:9090 (сервер nagios) висит демон (/usr/local/etc/rc.d/HipChat start|stop), принимающий запросы от HipChat.

Файл настроек: /usr/local/etc/server_chat.conf

[Hipchat_room_token]
216=token216
218=token218

[Log]

log_file=/var/log/hipchat.log

Здесь в секции Hipchat_room_token задаются номера комнат и их токены.

Работает приложение так: принял запрос -> обработал -> отправил ACK в командный интерфейс нагиоса (вызов скриптов /usr/local/bin/ack_host и /usr/local/bin/ack_service с необходимыми параметрами) -> отправил нотификацию собеседнику.

Скрипт ack_host:

#!/bin/sh

printfcmd="/usr/bin/printf"
CommandFile="/var/spool/nagios/rw/nagios.cmd"
datetime=`date +%s`

`$printfcmd "[%i] ACKNOWLEDGE_HOST_PROBLEM_EXPIRE;$1;1;1;1;$2;hipchat;ack from bot nagios%i\n" $datetime >> $CommandFile`

 

ack_service:

#!/bin/sh

printfcmd="/usr/bin/printf"
CommandFile="/var/spool/nagios/rw/nagios.cmd"
datetime=`date +%s`

`$printfcmd "[%i] ACKNOWLEDGE_SVC_PROBLEM_EXPIRE;$1;$2;1;1;1;$3;hipchat;ack from bot nagios%i\n" $datetime >> $CommandFile`

Ну и сам бот https://unix-way.ru/files/server_chat.py

 

unix-way