Защита от отключения оповещений в Zabbix

Защита от отключения оповещений в Zabbix

Иногда заббикс штормит и приходится на время отключать оповещения. Я думаю, что так делал не только я, потому что пока выясняешь в чём проблема, то почта и телега разрываются от тонны сообщений. Иногда я забывал включить оповещения обратно и это нехорошо. Чтобы обезапасить себя от забытого отключенного поовещения, я реализовал следующее.

Прежде всего заббиксу нужно самому понять, что у него отключены оповещения и показать это. Такой волшебной кнопки у него нет и я реализовал это через API. Вот этот скрипт подключается к заббикс серверу черз API и проверяет статус оповещений:

#!/bin/bash
zabbixServer='zabbix.domain.com' # Или localhost 127.0.0.1

zabbixUsername='zabbix'
zabbixPassword='xxxxxxxxx'


header='Content-Type:application/json-rpc'
zabbixApiUrl="https://$zabbixServer/api_jsonrpc.php"


function exit_with_error() {
echo '**********************************'
echo "$errorMessage"
echo '----------------------------------'
echo 'Сформированная Команда выполнения'
echo '----------------------------------'
echo curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl
echo '----------------------------------'
echo 'Выходные данные'
echo '----------------------------------'
echo "$result"
echo '**********************************'
}

function outapi(){
#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
logout=$(echo "${result}" |sed -e 's|.*result":||' -e 's/,"id.*//g')
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo 'Успешно вышел из Zabbix' "${logout}"
errorMessage="";json="";result="";check="" # Очистка переменных
exit 1
}

#Подключение к Zabbix.
json=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\"},\"id\": 1 }`
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`

echo '* * * *'
echo $result
echo '* * * *'

auth=$(echo "${result}" |sed -e 's|.*result":"||' -e 's/","id.*//g')
check=$(echo "${auth}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')

if [[ ${check} == *ERROR* ]]; then exit_with_error &&exit 1 ; fi
echo "Вход в систему выполнен успешно - Идентификатор авторизации: $auth"
errorMessage="";json="";result="";check="" # Очистка переменных

json="{
\"jsonrpc\": \"2.0\",
\"method\": \"action.get\",
\"params\": {
\"output\": \"extend\",
\"selectOperations\": \"extend\",
\"selectRecoveryOperations\": \"extend\",
\"selectAcknowledgeOperations\": \"extend\",
\"selectFilter\": \"extend\",
\"filter\": {
\"eventsource\": 0
}
},
\"auth\": \"$auth\",
\"id\": 1
}"

result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`

echo 'Write to result.data'
echo $result > actions_api.data
cat actions_api.data | jq --raw-output '.result [] | .name , .status' > result.data

echo 'Send to Zabbix server'

JSON_OUTPUT="result.data"

index=0
while read line; do
array[$index]="$line"
index=$(($index+1))
done < $JSON_OUTPUT

echo "Action name: "${array[0]}
echo "Action status: "${array[1]}

zabbix_sender -z zabbix.domain.com -s zabbix.domain.com -k alert_status_all_admin -o ${array[1]}

Этот скрипт ежеминутно выполняется в кроне:

* * * * *  bash api_actions_get_zabbix.sh

Основу скрипта я тиснул вот тут — https://diyit.ru/viewtopic.php?t=1946.

Для работы скрипта нужна утилита jq — https://stedolan.github.io/jq/.

Что делет скрипт? Он подключается к заббикс серверу, смотрит статус оповещений и отправляет эти значения в заббик сервер. Если статус сменится на 1 (оповещения отключены), то по настроенным item и триггерам в заббикс сработает оповещение.

Но такой способ по крывает не все варианты о забытом выключенном оповещении. В дашборд проблем не все смотрят постоянно, а может никто и не сомотри совсем, пока не слуится проблема. Поэтому я настроил отправку сообщений в почту и телеграмм через скрипты, которые время от времени дёргаются в кроне:

20 7,14,19 * * *  bash post_alert.sh && bash teleg_alert.sh

Самый первый скрипт, который генерирует данные через Zabbix API, генерирует файл result.data. В нём хранятся результаты опроса статуса Action:

Report problems to Zabbix administrators
0

Этими результатами пользуются сприпты, которые отправят самостоятельно данные по почте и в телеграмм.

post_alert.sh

#!/bin/bash

JSON_OUTPUT="result.data"

index=0
while read line; do
array[$index]="$line"
index=$(($index+1))
done < $JSON_OUTPUT

echo "Action name: "${array[0]}
echo "Action status: "${array[1]}

if (( ${array[1]}==1 )); then
echo "Send message via Post to the mail"

MESSAGE="Report problems to Zabbix administrators \
Disabled. Check Configuration -> Actions in Zabbix"

echo "$MESSAGE" | mail -s "Report problems to Zabbix administrators
Disabled" email@mail.ru

else
echo "Action state (${array[0]}): Enable"
fi

teleg_alert.sh (у меня настроена отправка в два чата)

#!/bin/bash

JSON_OUTPUT="result.data"

index=0
while read line; do
array[$index]="$line"
index=$(($index+1))
done < $JSON_OUTPUT

echo "Action name: "${array[0]}
echo "Action status: "${array[1]}

#zabbix_sender -z zabbix.domain.com -s zabbix.domain.com -k alert_status_all_admin -o ${array[1]}

if (( ${array[1]}==1 )); then
echo "Send message via Telegram to the chat"

TOKEN='xxxxx'
TOKEN2='xxxxx'

CHAT_ID="-xxxx"
CHAT_ID_domain_bot="-xxxx"
SUBJECT="PROBLEM: ${array[0]}"
MESSAGE="Disabled trigger action! Check Configuration -> Actions in Zabbix."

curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${CHAT_ID}\",\"text\":\"${SUBJECT}\n${MESSAGE}\"}" "https://api.telegram.org/bot${TOKEN}/sendMessage" | grep -q '"ok":false,'
curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${CHAT_ID_domain_bot}\",\"text\":\"${SUBJECT}\n${MESSAGE}\"}" "https://api.telegram.org/bot${TOKEN2}/sendMessage" | grep -q '"ok":false,'
if [ $? -eq 0 ] ; then exit 1 ; fi

else
echo "Action state (${array[0]}): Enable"
fi

Итого, как это всё работает у меня. Если оповещения в Actions отключены, то в дашборде сразу идёт оповещение. Если я забываю и про него, то три раза в сутки приходит напоминание по почте и в телеграмм, что оповещения выключены (итого 6 сообщений в сутки). Практика показала, что метод эффективный и рабочий.

Скрипты не вылизывались, их можно сделать лучше.

Добавить комментарий