Que o Check_MK é uma das melhores e mais personalizáveis ferramentas de monitoração todos sabem, que o Telegram é o melhor e mais útil programa de comunicação atual vocês também sabem. Mas o que não sabiam ainda, eu acho, é que podemos combinar os dois em um solução personalizada de notificação. Assim temos como receber notificações importantes por um meio mais interessante que e-mail.
Primeiro temos que entender o que é um BOT do Telegram, o BOT é uma conta de sistema que você associa a uma função, geralmente usando a API do Telegram para interagir com um serviço/servidor específico através de comandos no bot, como por exemplo: jogar poker, receber fotos, ler notícias, baixar vídeos, treinar idiomas, o que você quiser associar a um bot. No nosso caso criaremos um para retransmitir as notificações do Check_MK para os usuários que você quiser que recebam as notificações.
Para criar o BOT precisamos do BotFather, o serviço do Telegram que gerencia a criação de BOTs, se você nunca utilizou basta entrar na interface web (web.telegram.org), logar com sua conta e digitar botfather na campo de pesquisa e depois de clicar no BotFather, clique em Começar.
Depois de adicionado, clique em Começar.Depois disto ele vai mostrar a lista de comandos do botfather, para nós interessa no momento o comando de criar um BOT, o /newbot
Ele vai pedir o nome do BOT, como ele vai aparecer na tela e depois vai pedir o username, o nome do usuário que será esse BOT, esse nome obrigatoriamente deve terminar como o sufixo bot , podendo ser _bot.
Eu utilizei monitor_empresa para a conta e monitor_empresa_bot para o username, porque sou muito criativo para nomes.
Então recebemos nosso TOKEN do BOT, esse dado é extremamente importante pois contém o ID do seu BOT e sua chave de autenticação, pois BOT não usa senha.
Depois de criado devemos começar um chat com o BOT para criar uma ID, cada usuário que falar com esse BOT terá uma ID de chat única, o que permite que com um mesmo BOT você envie mensagens diferentes para usuários diferentes através de seus CHAT IDs.
Para começar um chat basta pesquisar pelo nome que você criou, no meu caso monitor_empresa, clicou nele enviou uma mensagem qualquer e pronto, já tem um chat com um id única.
Agora instale o pacote jq, em Debian e derivados basta digitar como root: apt-get install jq
Ou baixe de seu site: https://stedolan.github.io/jq/
Ele vai formatar a saída de dados para melhor visualização.
Para ver os dados desta conversa, digite no sistema:
$ curl --silent "https://api.telegram.org/botAQUI-O-SEU-TOKEN/getUpdates" | jq
Lembrando onde está escrito AQUI-O-SEU-TOKEN é o SEU TOKEN gerado na criação do BOT...
Eu coloquei o meu em uma variável TOKEN, viu como sou criativo? com meu TOKEN e fiz o comando, o resultado foi:
Podem ver que tem a mensagem que enviei pelo chat, a última mensagem na verdade, e o ID do chat, que no meu caso é 296162751
Agora podemos até enviar mensagens via linha de comando para esse chat.
Com isso podemos agora configurar o Check_MK para poder enviar mensagens por este bot no Telegram.
Primeiro vamos baixar o script de notificação do Telegram, ou copie e cole no seu editor preferido:
#!/usr/bin/python # Telegram # Copyright Mathias Kettner 2013 mk@mathias-kettner.de # Stefan Gehn 2016 stefan+cmk@srcxbox.net # check_mk is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation in version 2. check_mk is distributed # in the hope that it will be useful, but WITHOUT ANY WARRANTY; with- # out even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. See the GNU General Public License for more de- # ails. You should have received a copy of the GNU General Public # License along with GNU Make; see the file COPYING. If not, write # to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301 USA. # Telegram notification based on asciimail notification from # check_mk 1.2.6p16. import os, re, sys, urllib, urllib2 ### CHANGE THESE ### telegram_bot_token = '101010101:ChangeMeChangeMeChangeMe' #################### tmpl_host_text = """*Check_MK: $HOSTNAME$ - $EVENT_TXT$* ``` Host: $HOSTNAME$ Alias: $HOSTALIAS$ Address: $HOSTADDRESS$ Event: $EVENT_TXT$ Output: $HOSTOUTPUT$ $LONGHOSTOUTPUT$```""" tmpl_service_text = """*Check_MK: $HOSTNAME$/$SERVICEDESC$ $EVENT_TXT$* ``` Host: $HOSTNAME$ Alias: $HOSTALIAS$ Address: $HOSTADDRESS$ Service: $SERVICEDESC$ Event: $EVENT_TXT$ Output: $SERVICEOUTPUT$ $LONGSERVICEOUTPUT$```""" def substitute_context(template, context): # First replace all known variables for varname, value in context.items(): template = template.replace('$'+varname+'$', value) # Remove the rest of the variables and make them empty template = re.sub("\$[A-Z_][A-Z_0-9]*\$", "", template) return template def construct_message_text(context): notification_type = context["NOTIFICATIONTYPE"] if notification_type in [ "PROBLEM", "RECOVERY" ]: txt_info = "$PREVIOUS@HARDSHORTSTATE$ -> $@SHORTSTATE$" elif notification_type.startswith("FLAP"): if "START" in notification_type: txt_info = "Started Flapping" else: txt_info = "Stopped Flapping ($@SHORTSTATE$)" elif notification_type.startswith("DOWNTIME"): what = notification_type[8:].title() txt_info = "Downtime " + what + " ($@SHORTSTATE$)" elif notification_type == "ACKNOWLEDGEMENT": txt_info = "Acknowledged ($@SHORTSTATE$)" elif notification_type == "CUSTOM": txt_info = "Custom Notification ($@SHORTSTATE$)" else: txt_info = notification_type # Should neven happen txt_info = substitute_context(txt_info.replace("@", context["WHAT"]), context) context["EVENT_TXT"] = txt_info if context['WHAT'] == 'HOST': tmpl_text = tmpl_host_text else: tmpl_text = tmpl_service_text return substitute_context(tmpl_text, context) def fetch_notification_context(): context = {} for (var, value) in os.environ.items(): if var.startswith("NOTIFY_"): context[var[7:]] = value.decode("utf-8") return context def send_telegram_message(token, chat_id, text): url = 'https://api.telegram.org/bot%s/sendMessage' % (token) data = urllib.urlencode({'chat_id':chat_id, 'text':text, 'parse_mode':'Markdown'}) #print("sending telegram message, url '%s', chat id '%s', text '%s'" % (url, chat_id, text)) try: urllib2.urlopen(url, data).read() except urllib2.URLError, e: sys.stdout.write('Cannot send Telegram message: HTTP-Error %s %s\n' % (e.code, e)) def main(): context = fetch_notification_context() telegram_chatid = context.get('CONTACT_TELEGRAM_CHAT_ID') if not telegram_chatid: # e.g. empty field in user database sys.stdout.write("Cannot send Telegram message: Empty destination chat id") sys.exit(2) text = construct_message_text(context) send_telegram_message(telegram_bot_token, telegram_chatid, text) main()
Então salve no local de scripts de notificação do seu servidor Check_MK, no meu caso é em /opt/omd/versions/1.2.8p10.cre/share/check_mk/notifications/ com o nome de telegram
Coloque a permissão padrão de execução: # chmod 755 /opt/omd/versions/1.2.8p10.cre/share/check_mk/notifications/telegram
Pronto, agora basta editar o script onde está escrito:
### CHANGE THESE ### telegram_bot_token = '101010101:ChangeMeChangeMeChangeMe' ####################
E colocar seu TOKEN. Com isso o Check_MK vai poder acessar o Telegram através do seu BOT. Instale o urllib2 do python para o script poder funcionar.
Em Debian e derivados: # apt-get install python3-urllib3
Agora logue na interface web do Check_MK e no WATO clique em Users
Na tela de Users clique no botão Custom Attributes:
Clique em New Attributes
Agora preencha com os dados necessários, o nome do atributo deve ser TELEGRAM_CHAT_ID pois o script busca esse atributo para formar a mensagem a ser enviada, o Topic deve ser Identity. Coloque um título e uma descrição e clique em Save
Lembre de deixar marcado que os usuários podem alterar este atributo em suas configurações pessoais.
Depois de salvar aplique as alterações e basta agora ir no usuário e editar suas propriedades para ele poder receber mensagens enviadas através do seu BOT.
Alterei meu usuário do Check_MK adicionando meu ID do chat com o BOT pelo Telegram na minha conta, assim todas as mensagens enviadas para mim serão feitas através do BOT para aquele chat específico.
Altere os usuários que você precisar, salve e mande aplicar as alterações.
Agora crie uma regra para o sistema utilizar notificações via Telegram e não apenas e-mail. Pelo Wato clique em Notifications depois em New Rule e crie sua regra.
Salve e pronto, habilite as notificações dos serviços que você quer que esse usuário receba de acordo com os Contact Groups que seu usuário está. Quando quiser que tipos de usuários diferentes recebam notificações de sistemas ou serviços diferentes, separe por grupos. Crie grupos de notificações diferentes e coloque seus usuários no grupo mais adequado como por exemplo: desenv, infra, serverLinux, serverWindows, switchs, wireless.
Serviços ou hosts que apresentam muitos problemas de conexão, portanto gerando “falsos positivos”, sugiro que os coloque em Downtime programado para não gerar alertas constantes ou aumente o número de ocorrências do alerta antes de gerar uma notificação.
Espero que este artigo ajude a dar um alcance maior as notificações do seu servidor e tornar seus avisos mais adequados aos meio de comunicação deste século :-)
Baseado no post http://metz.gehn.net/2016/01/monitoring-notifications-via-telegram/
Excelente tópico. Fiz o treinamento com vocês e hoje utilizo o CheckMK com 6 sites remotos e um gerenciamento centralizado. Hoje temos cerca de 690 hosts e 4500 serviços. O que acho mais interessante é a integração com dispositivos que fazem uso do protocolo SNMP onde monitoramos hardware de servidores (Temperatura, discos, fontes, etc) e a integração com a nossa solução VmWare e NetApp.
Vagner gostaria, se possível, de montar um pequeno artigo sobre a utilização da solução em RaspBerry Pi. Tenho implementado mas ainda não em produção, o bacana é a possibilidade de uso em uma TV para exibição do dashboard, integração de diversos sensores e o uso como servidor para site remoto em um cliente.
Paulo, obrigado pela visita. Estou esperando o artigo, eu mesmo utilizei em um OrangePI PC e coloquei para monitorar 145 hosts milhares de serviços.
Boa tarde. Conseguiria me explicar como configurar para aumentar o número de ocorrências do alerta antes de gerar uma notificação? Não estou entendendo como executar esta configuração.