Защита от отключения оповещений в 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 сообщений в сутки). Практика показала, что метод эффективный и рабочий.
Скрипты не вылизывались, их можно сделать лучше.