Авто-закрытие триггеров

Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Авто-закрытие триггеров

Сообщение Артём Мамзиков »

Авто-закрытие триггеров
Множественные одинаковые
Триггер открыт более дней (времени)
Авто-закрытие триггеров
Авто-закрытие триггеров
Авто-закрытие триггеров Элементы данных Триггеры
Авто-закрытие триггеров Элементы данных Триггеры
Макросы
{HOST.CONN} - IP-Узла
{HOST.HOST} - Имя-Узла
{HOST.NAME} - Имя-видимое
{$HOST.PORTS} - Порт (10050)
{$OLDNEW} - Сортировка (ASC - по возрастанию, DESC - по убыванию, влияет на закрытие старых и новых триггеров)
{$NAMETRIG} - Имя-триггера (не обязательно)
{$SOVPAD} - Вид-Совпадения (тега и имени триггера -1; имени триггера -2; тегу -3; любое другой число правило выполняться не будет)
{$CLOSETIME} - Время в секундах (Закрыть триггер открытый больше чем по времени) 86400 - сутки можно задать пустым не будет выполняться

Проверка скрипта
cd /usr/local/share/zabbix/externalscripts/
./duplicate-triggers-close.sh 192.168.XXX.XXX "hostname" "" "10050" "ASC" "" "1" "86400"
./duplicate-triggers-close.sh IP-Узла "Имя-Узла" "Имя-видимое" "Порт" "Сортировка" "Имя-триггера" "Вид-Совпадения" "Время"

СКАЧАТЬ
Авто-закрытие триггеров.7z
Авто-закрытие триггеров.7z
(6.32 КБ) 12 скачиваний

duplicate_triggers_close.sh

Код: Выделить всё

#!/bin/bash

#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
# Имя узла сети
HOSTHOST=$2
# Видимое имя
HOSTNAME=$3
# Порт
PORT=${4:-10050}
# Оставить старый триггер новый закрыть=ASC (по умолчанию) - по возрастанию, Зкрыть старый оставить новый=DESC - по убыванию.
OLDNEW=${5:-ASC}
# Имя триггера
NAMETRIG=$6
if [[ "$NAMETRIG" != "" ]]; then nametriggers="\"description\": \"$NAMETRIG\",";else nametriggers=""; fi
# Закрыть по совпадению: тега и имени триггера -1; имени триггера -2; тегу -3.
SOVPAD=${7:-1}
# Закрыть триггер открытый больше чем по времени
CLOSETIME=$8

#echo $IP $HOSTHOST $HOSTNAME $PORT $OLDNEW $NAMETRIG $SOVPAD $CLOSETIME >> triggclos.log

# Закрытие одинаковых триггеров в узле из режима множественный или подвиших триггеров более цать дней
# По имени узла получаем ID узла, запрашиваем триггеры в состоянии проблема

header='Content-Type:application/json-rpc'
zabbixApiUrl="http://$zabbixServer/zabbix/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 '**********************************'
  zabbix_sender -z $zabbixServer -p 10051 -s "${HOSTHOST}" -k errordupltriggers -o "ERROR $errorMessage Команда выполнения: curl --silent --show-error --insecure --header $header --data $json $zabbixApiUrl Результат $result"
}


#------------------------------------------------------
# Аутентификация пользователя. https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/login
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить токен авторизации 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`
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="" # Очистка переменных


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
}


# Запрос информации об авторизовавшемся пользователе
#usinfo=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\": \"$zabbixUsername\",\"password\": \"$zabbixPassword\",\"userData\": true},\"id\": 1 }`
#infouser=`curl --silent --show-error --insecure --header $header --data "$usinfo" $zabbixApiUrl`
#echo "${infouser}"


function close_trigger(){
#------------------------------------------------------
# Событие https://www.zabbix.com/documentation/4.2/ru/manual/api/reference/event/acknowledge
#------------------------------------------------------
# Закрыть событие. Если событие уже решено, это действие будет пропущено.
# Подтвердить событие. Если событие уже подтверждено, это действие будет пропущено.
# Добавление комментария
# Изменение важности события. Если событие уже с такой же важностью, это действие будет пропущено.
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"event.acknowledge\",\"params\": {\"eventids\": \"$eventid\",\"action\": 6,\"message\": \"Авто-закрытие-api.\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
json="{\"jsonrpc\": \"2.0\",\"method\":\"event.acknowledge\",\"params\": {\"eventids\": \"$eventid\",\"action\": 1,\"message\": \"Авто-закрытие-api.\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
echo "Авто-закрытие-триггеров-api :" $result
errorMessage="";json="";result="";check="" # Очистка переменных
}

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

#------------------------------------------------------
# Получение триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"selectTriggerDiscovery\": [\"parent_triggerid\"], \"active\": true, \"monitored\": \"True\", \"output\": [\"triggerid\",\"description\",\"priority\",\"status\",\"value\"], \"expandComment\": \"True\", \"expandDescription\": \"True\",  \"expandExpression\": \"True\", \"filter\": {$nametriggers\"host\": \"$HOSTHOST\", \"value\": 1},\"sortfield\": \"priority\", \"sortorder\": \"DESC\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
# Разделим на строки
resultn=$(echo $result|sed 's/{"triggerid/\\n{"triggerid/g')
# Поиск триггера и получение его ID
triggerid=$(echo -e $resultn|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*"triggerid":"||'|sed 's/","description.*/;/g')
# Имя триггера
triggername=$(echo -e $resultn|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*"description":"||'|sed 's/","priority.*/;/g')
# Если триггер создан из прототипа, получаем ID прототипа триггера в узле
prototypetrigid=$(echo -e $resultn|egrep -i '"parent_triggerid":"[0-9]+"'|sed 's|.*"parent_triggerid":"||'|sed 's/"}.*/;/g')
#echo "Найденые триггеры :" $result
echo "Получаем ID триггера :" $triggerid
echo "Получаем ID прототипа триггера :" $prototypetrigid
echo "Получаем имя триггера :" $triggername
#echo "Важность триггера :"
#echo "Получаем тег :"
#echo "Время открытия триггера :"
errorMessage="";json="";result="";check="" # Очистка переменных

# Цикл переберм id пораздельности
IFS=';' read -ra razbivkatrigid < <(echo $triggerid$prototypetrigid|sed 's/\s//g')
for zavtrigid in "${razbivkatrigid[@]}"
do
#------------------------------------------------------
# Получение триггеров в статусе проблема https://www.zabbix.com/documentation/4.2/ru/manual/api/reference/problem/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить проблемы'
json="{\"jsonrpc\": \"2.0\",\"method\":\"problem.get\",\"params\": \
{\"output\": \"extend\",\
\"acknowledged\": false,\
\"selectAcknowledges\": \"extend\",\
\"selectTags\": \"extend\",\
\"selectSuppressionData\": \"extend\",\
\"objectids\": \"$zavtrigid\",\
\"recent\": \"true\",\
\"sortfield\": [\"eventid\"],\
\"sortorder\": \"$OLDNEW\"},\
\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error ; fi
# Собираем данные
problem=$problem$result
errorMessage="";json="";result="";check="" # Очистка переменных
done

# Цикл | Разделим на строки
IFS=';' read -ra razproblem < <(echo $problem|sed 's/{"eventid/;{"eventid/g')
for strproblem in "${razproblem[@]}"
do
# Разберем значения в отдельные переменные
echo -e "Найденые Проблемы :" $strproblem
# ID Проблемы
eventid=$(echo $strproblem|egrep -i '"eventid":"[0-9]+"'|sed 's|.*"eventid":"||'|sed 's/","source.*//g')
# Тип проблемы 0 - событие создано на триггер;3 - внутреннее событие.
#sources=$(echo $strproblem|egrep -i '"source":"[0-9]+"'|sed 's|.*"source":"||'|sed 's/","object.*//g')
# Тип объекта проблемы 0 - триггер; 4 - элемент данных;5 - правило LLD.
#object=$(echo $strproblem|egrep -i '"object":"[0-9]+"'|sed 's|.*"object":"||'|sed 's/","objectid.*//g')
# ID связанного объекта триггера (узла,шаблона).
#objectid=$(echo $strproblem|egrep -i '"objectid":"[0-9]+"'|sed 's|.*"objectid":"||'|sed 's/","clock.*//g')
# Время, проблеме было создано.
clock=$(echo $strproblem|egrep -i '"clock":"[0-9]+"'|sed 's|.*"clock":"||'|sed 's/","ns.*//g')
# Наносекунды, проблеме было создано.
#ns=$(echo $strproblem|egrep -i '"ns":"[0-9]+"'|sed 's|.*"ns":"||'|sed 's/","r_eventid.*//g')
# ID события восстановления.
#r_eventid=$(echo $strproblem|egrep -i '"r_eventid":"[0-9]+"'|sed 's|.*"r_eventid":"||'|sed 's/","r_clock.*//g')
# Время, восстановления было создано.
#r_clock=$(echo $strproblem|egrep -i '"r_clock":"[0-9]+"'|sed 's|.*"r_clock":"||'|sed 's/","r_ns.*//g')
# Наносекунды, восстановления было создано.
#r_ns=$(echo $strproblem|egrep -i '"r_ns":"[0-9]+"'|sed 's|.*"r_ns":"||'|sed 's/","correlationid.*//g')
# ID правила корреляции, если событие было решено при помощи глобального правила корреляции.
#correlationid=$(echo $strproblem|egrep -i '"correlationid":"[0-9]+"'|sed 's|.*"correlationid":"||'|sed 's/","userid.*//g')
# ID пользователя, если проблема была закрыта вручную.
#userid=$(echo $strproblem|egrep -i '"userid":"[0-9]+"'|sed 's|.*"userid":"||'|sed 's/","name.*//g')
# Имя проблемы.
name=$(echo -e $strproblem|egrep -i '"name":".*"'|sed 's|.*"name":"||'|sed 's/","acknowledged.*//g'|sed -e '/\s+$/d')
# Состояние подтверждения проблемы. 0 - не подтверждена; 1 - подтверждена.
#acknowledged=$(echo $strproblem|egrep -i '"acknowledged":"[0-9]+"'|sed 's|.*"acknowledged":"||'|sed 's/","severity.*//g')
# Текущая важность проблемы.
#severity=$(echo $strproblem|egrep -i '"severity":"[0-9]+"'|sed 's|.*"severity":"||'|sed 's/","acknowledges.*//g')
# Обновлений проблемы
#acknowledges=$(echo -e $strproblem|egrep -i '"acknowledges":".*"'|sed 's|.*"acknowledges":"[||'|sed 's/]","suppression_data.*//g')
# Возврат списка обслуживаний в свойстве maintenanceid - (строка) ID обслуживания; suppress_until - (целое число) время, до которого проблема подавлена.
#suppression_data=$(echo -e $strproblem|egrep -i '"suppression_data":".*"'|sed 's|.*"suppression_data":"[||'|sed 's/]","suppressed.*//g')
# Подавлена ли проблема или нет. 0 - нет, 1 - Да
#suppressed=$(echo -e $strproblem|egrep -i '"suppressed":".*"'|sed 's|.*"suppressed":"||'|sed 's/","tags.*//g')
# Если тегов больше 1 нужно делать разбивку
tags=$(echo -e $strproblem|egrep -i '"tag":".*"'|sed 's|.*"tag":||'|sed 's/}].*//g')
# Сброс переменой
strproblem=""

#echo -e "Тест переменых :" $eventid $clock $name $tags

# Если триггер отрыт больше чем * по времени закрываем
data=`date +%c`
echo "Текущая дата :" $data
opendata=`date -d@$clock`
echo "Дата открытия триггера :" $opendata
# Unix, - это количество секунд, прошедших с 1 января 1970 года в 00:00:00 UTC, количество секунд от эпохи до текущего дня.
dataunix=`date +%s`
# Из текущей даты вычитаем дату срабатывания триггера
let "timepblem=$dataunix-$clock"
echo "разница :" $timepblem
if [ -n "${CLOSETIME}" ]; then
if [ -n "${clock}" ]; then
# Закрыть если дата больше или равно $CLOSETIME
if [ $timepblem -ge $CLOSETIME ]; then close_trigger &echo -e "\033[33m"'Авто-закрытие-триггера-eventid :' $eventid"\033[0m";fi
fi;fi


sovpadenname=$(echo $vsename|egrep -i "$name"|sed "s/.*/$name/g")
echo "Совпадения имен :" $sovpadenname
#echo -e "\n"
#echo "Искомое имя"$name
#echo "текст для поиска"$vsename
#echo $vsename|grep -i "$name"
#echo -e "\033[33m"'триггер-eventid :' $eventid"\033[0m"
#echo -e "\n"

sovpadentags=$(echo $vsetags|egrep -i "$tags"|sed "s/.*/$tags/g")
echo "Совпадения тегов :" $sovpadentags

# В самом начале при открытии триггера были какие то ложные срабатывания при 4 парах дублей средние триггеры были как 3шт вместо 2х и закрывались полностью, а нетолько дубль.
# Если проходит 30-60 секунд после открытия все отрабатывает хорошо. Поэтому будем закрывать дубли которые открыти больше 1 минуты.
echo $timepblem "Больше-Равно чем: 40 секунд ?"
if [ $timepblem -ge 40 ]; then
# Если совпадения Имени триггера и Тегов найдены закрываем одинаковые триггеры
if [ $SOVPAD == 1 ]; then
if [ -n "${sovpadenname}" ]; then
if [ -n "${sovpadentags}" ]; then
close_trigger
echo -e "\033[33m"'Авто-закрытие-триггера-eventid :' $eventid"\033[0m"
fi; fi; fi

# Если совпадения Имени триггера найдены закрываем одинаковые триггеры
if [ $SOVPAD == 2 ]; then
if [ -n "${sovpadenname}" ]; then
close_trigger
echo -e "\033[33m"'Авто-закрытие-триггера-eventid :' $eventid"\033[0m"
fi; fi

# Если совпадения Тегов найдены закрываем одинаковые триггеры
if [ $SOVPAD == 3 ]; then
if [ -n "${sovpadentags}" ]; then
close_trigger
echo -e "\033[33m"'Авто-закрытие-триггера-eventid :' $eventid"\033[0m"
fi; fi
fi
vsename=$vsename" $name"
#echo "Совпадает с именем ?" $name
#echo "Накопительная строка имен :" $vsename
vsetags=$vsetags" $tags"
#echo "Накопительная строка тегов :" $vsetags

# Сброс переменых в цикле
strproblem=""
name=""
sovpadenname=""
sovpadentags=""

done

outapi
количество слов: 1360

Вернуться в «API Zabbix»