O alerta do ⛔ PROBLEMA ⛔ no momento do incidente | O alerta de ✅ OK ✅ depois que o incidente foi resolvido |
---|---|
(1) O gráfico referente ao item | |
(2) Algumas informações referente ao HOST |
Quando escrevi este script procurei torná-lo o mais simples possível e ser totalmente parametrizável, ou seja nenhuma alteração no código precisa ser feita. Mas isso não impede que você o altere para suas necessidades.😎
#!/bin/bash
#
# Generates a graphic of a zabbix object in .png format to be sent by email, telegram, whatsapp, etc.
# Note: In this case telegram is used
# jarbas.junior@gmail, 30/Mar/2022, initial implementation
# 20/Dez/2023, now is possible utilize parameters
# 22/Dez/2023, Improvised Solution for Zabbix < 6.4
# Licence: GPL ;)
#
# required packages: curl
#
# Force the user to pass the necessary parameters
[ $# -ne 8 ] && {
echo "Usage: $0 {URL} {User} {Password} {Item} {MSG} {Token} {Chat} {Parse}
Example:
========
$0 https://zabbix.seudominio.com Admin zabbix 12345 'Msg from Telegram' 'xxx:yyy' zzz HTML"
exit 1;
}
# Extra parameters for the graphic
_from="now-6h" # initial time
_to="now" # final time
_with="1024" # with of graphic
_height="220" # height of graphic
_type="0" # 0=simple line 1=stacked when there is more than one parameter in the same graph
_profileIdx="web.item.graph.filter" # the graphic function
# read the mandatory parameters
_ZABBIX_BASE="${1:-https://zabbix.seudominio.com}" # Base URL of Zabbix
_ZABBIX_USER="${2:-Admin}" # user with "read power" all
_ZABBIX_PASSWORD="${3:-zabbix}" # user password
_ZABBIX_ITEM_ID="${4:-12345}" # 12345 - Zabbix Server (CPU Utilization %)
_TELEGRAM_MSG="${5:-Generated by Zabbix $_ZABBIX_BASE:\n$_with x $_height from $_from to $_to}"
_TELEGRAM_BOT_TOKEN="${6:-XXXXXXXXXX:YYYYYYYYYYYYYY_ZZZZZZZZZZZZZZZZZZZZ}" # Token Telegram
_TELEGRAM_CHAT_ID="${7:--000000000}" # Chat ID Telegram
_TELEGRAM_PARSE_MOD="${8:-HTML}" # Telegram Parse Mod
# turn \n into line break
_TELEGRAM_MSG=`echo -e "$_TELEGRAM_MSG"`
# Improvised Solution for Zabbix < 6.4
NUMBERS='^[0-9]+$'
if ! [[ "$_ZABBIX_ITEM_ID" =~ $NUMBERS ]] ; then
_ZABBIX_ITEM_ID=`echo "$_TELEGRAM_MSG" | grep '^ID=' | tr -dc '0-9'`
fi
# Telegram API to send images
_TELEGRAM_API_URL="https://api.telegram.org/bot$_TELEGRAM_BOT_TOKEN/sendPhoto"
# set connection details
_ZABBIX_INDEX="$_ZABBIX_BASE/index.php" # Index of Zabbix
# Temporary files
_GRAPHICAL_FILE="$(mktemp /tmp/graphic.XXXXXXXXXX)" # File to output the graphics
_COOKIES_FILE="$(mktemp /tmp/cookies.XXXXXXXXXX)" # File to store coockies
# Full URL of graphic
_ZABBIX_CHART="$_ZABBIX_BASE/chart.php?from=$_from&to=$_to&itemids[0]=$_ZABBIX_ITEM_ID&type=$_type&profileIdx=$_profileIdx&width=$_with&height=$_height"
echo "## Login...................: $_ZABBIX_INDEX?user=$_ZABBIX_USER"
_RESULT=`curl -s -g -L -X POST -c $_COOKIES_FILE -d "name=$_ZABBIX_USER&password=$_ZABBIX_PASSWORD&enter=Sign in" $_ZABBIX_INDEX`
_SESSION_ID=`echo -e $_RESULT | grep -E -o -m 1 '(csrf_token: "[0-9a-z]{64})"' | cut -d\" -f2`
echo "## Download graphical file.: $_ZABBIX_CHART"
curl -s -g -L -X POST -b $_COOKIES_FILE "$_ZABBIX_CHART" -o $_GRAPHICAL_FILE
echo "## Graphical file generated: $_GRAPHICAL_FILE " [ `file -b $_GRAPHICAL_FILE` ]
echo "## Logout..................: $_ZABBIX_INDEX?sid=$SESSION_ID&reconnect=1"
curl -s -g -L -X POST -b $_COOKIES_FILE -c $_COOKIES_FILE "$_ZABBIX_INDEX?sid=$SESSION_ID&reconnect=1" >/dev/null
echo "## Send MSG................: $_TELEGRAM_MSG"
curl -s -g -L -X POST -F parse_mode="$_TELEGRAM_PARSE_MOD" -F caption="$_TELEGRAM_MSG" -F chat_id="$_TELEGRAM_CHAT_ID" -F photo=@"$_GRAPHICAL_FILE" "$_TELEGRAM_API_URL" >/dev/null
_RESULT=$?
# Remove temporary files
rm -f "$_COOKIES_FILE" "$_GRAPHICAL_FILE"
if [ $_RESULT -eq 0 ]; then echo "Message sent successfully"; else echo "Message failed"; fi
exit $_RESULT
Acesse seu servidor Zabbix como
root
.
Grave este script com o nometelegram-graph.sh
no diretório/usr/lib/zabbix/alertscripts/
Dê permissão de execução.
Teste o script sem parâmetros e veja um mini HELP
ssh root@ip-do-servidor-zabbix
cd /usr/lib/zabbix/alertscripts/
vim telegram-graph.sh
:set paste <-- isso evita que o VIM faça uma formatação bagunçando o código
<-- Pressione i para entrar em modo de inserção. Uma mensagem de rodapé irá aparecer -- INSERÇÃO (colar) --
<-- Cole o código previamente copiado
<-- Pressione ESC para sair do modo de inserção
:wq
chmod +x telegram-graph.sh
./telegram-graph.sh
Usage: ./telegram-graph.sh {URL} {User} {Password} {Item} {MSG} {Token} {Chat} {Parse}
Example:
========
./telegram-graph.sh https://zabbix.seudominio.com Admin zabbix 12345 'Msg from Telegram' 'xxx:yyy' zzz HTML"
Parâmetro | Descrição |
---|---|
1 - URL | endereço IP ou DNS do seu Zabbix |
2 - User | usuário Zabbix que tem poderes para leitura de todos HOSTS |
3 - Password | senha do usuário Zabbix |
4 - Item | normalmente um alerta emitido tem um numero que identifica unicamente o item que causou o alerta |
5 - MSG | mensagem a ser enviada pelo Telegram que pode conter MACROS do Zabbix |
6 - Token | token único do Bot do Telegram |
7 - Chat | identificação única do grupo/usuário do Telegram |
8 - Parse | como o Telegram tratará a formatação (HTML ou Markdown) |
Os menus do Zabbix 6.0 e 6.4 são um pouco diferentes, mas as telas são equivalentes.
😔 Nota: Script parameters support {ALERT.SENDTO}, {ALERT.SUBJECT}, {ALERT.MESSAGE} macros, and, since Zabbix 6.4.0, all macros that are supported in notifications, as well as user macros. Veja mais detalhes
Para versões do Zabbix < 6.4 o Fernando Almondes - Linkedin no vídeo no Youtube da Bee Solutions demonstra como fazer 👏👏👏
Notificações de triggers com gráficos no Telegram
com um script no google drive em seu canal no Telegram.A solução demonstrada pelo Fernando é que na dentro do Message templates do Media Type (tanto do Problem quanto do Recovery) tenha o ID do ITEM que será lido pelo script.
Baseando-se nessa estratégia, basta adicionar uma linha inciando com
ID={ITEM.ID}
dentro da MSG.
Se o script não encontrar o esse ID numérico e válido, ao invés do gráfico, você receberá uma imagem assim:
É necessário criar o Tipo de Mídia para o script ser executado.
Zabbix 6.0 -> Administration -> Media types -> Create media type
Zabbix 6.4 -> Alerts -> Media types -> Create media type
Media type Observar a ordem dos parâmetros |
|
Message templates Observar os tamplates |
|
Problem Message template de Problem |
|
Problem recovery Message template de Recovery |
Nem todos as formatações (HTML ou Markdown) são possíveis de serem utilizadas. Veja mais em https://core.telegram.org/bots/api#html-style
HTML para Problem - 🤗 para facilitar o CTRL+C
⛔️ {TRIGGER.STATUS} ⛔️ - {HOST.NAME}
<code>
INFORMAÇÕES DO HOST
=====================
Proxy......: {PROXY.NAME}
Nome.......: {HOST.NAME}
IP.........: {HOST.CONN}
Descrição..: {HOST.DESCRIPTION}
DETALHAMENTO DO INCIDENTE
===========================
Incidente..: {TRIGGER.NAME}
Severidade.: {TRIGGER.SEVERITY}
Status.....: {TRIGGER.STATUS}
Chave......: {ITEM.KEY}
Valor......: {ITEM.VALUE}
Iniciado...: {EVENT.TIME} de {EVENT.DATE}
</code>
ID={ITEM.ID}
HTML para Recovery - 🤗 para facilitar o CTRL+C
✅ {TRIGGER.STATUS} ✅ - {HOST.NAME}
<code>
INFORMAÇÕES DO HOST
=====================
Proxy......: {PROXY.NAME}
Nome.......: {HOST.NAME}
IP.........: {HOST.CONN}
Descrição..: {HOST.DESCRIPTION}
DETALHAMENTO DO INCIDENTE
===========================
Incidente..: {TRIGGER.NAME}
Severidade.: {TRIGGER.SEVERITY}
Status.....: {TRIGGER.STATUS}
Chave......: {ITEM.KEY}
Valor......: {ITEM.VALUE}
Iniciado...: {EVENT.TIME} de {EVENT.DATE}
Terminado..: {EVENT.RECOVERY.TIME} de {EVENT.RECOVERY.DATE}
Duração....: {EVENT.DURATION}
</code>
ID={ITEM.ID}
É preciso configurar as Ações a serem executadas num incidente.
Zabbix 6.0 -> Configuration -> Actions -> Triger Actions -> Create Action
Zabbix 6.4 -> Alerts -> Actions -> Triger Actions -> Create Action
Action | |
Operations | |
Operations Details Problem | |
Operations Details Recovery |
É preciso configurar o tipo de Mídia do usuário que será alertado.
Zabbix 6.0 -> Administration -> Users
Zabbix 6.4 -> Users -> Users
Para dirimir dúvidas e/ou sugestões entre no Grupo Tiozão do Linux
Gostou? Então não deixe de assistir ao vídeo onde explico melhor essa implementação.
https://youtu.be/Ko8CJUqSqws?si=Hasa9xNVvcEL4bx0