Скрипт + Шаблон для Windows LLD Hardware Monitor
Как это работает API Zabbix через Bash и Curl
СКАЧАТЬ Предварительно к узлам должен быть подключен шаблон, обнаружены элементы данных для Hardware Monitor!
Работает с шаблонами 3.0-3.4 как с портом так и без, так же версией 3.5 PORT
Что делают данные скрипты и как это работает?
Первый Скрипт hmitemapi.sh
Запускается через шаблон в заббиксе
В шаблоне 3.0-3.4
Создание Триггеров и Графиков запуск скрипта API hmitemapi.sh[{HOST.CONN},{HOST.HOST},{HOST.NAME}]
Ошибки API попадают в
Ошибки API Триггеры 1 apitriggercreateerror В шаблоне 3.0-3.4 PORT
Создание Триггеров и Графиков запуск скрипта API hmitemapi.sh[{HOST.CONN},{HOST.HOST},{HOST.NAME},{$HOST.PORTS}]
Ошибки API попадают в
Ошибки API Триггеры 1 apitriggercreateerror В шаблоне 3.5 PORT
Создание Триггеров и Графиков запуск скрипта API hmitemapi.sh[{HOST.CONN},{HOST.HOST},{HOST.NAME},{$HOST.PORTS},{$PUTHM},{$FILTRHM},{$HIDEHM}]
Ошибки API Триггеры 1 apitriggercreateerror
Ошибки Правила Обнаружения HM errordiscoveryhm Макросы в ключе
{HOST.CONN} - IP или DNS имя узла сети
{HOST.HOST} - Имя узла сети
{HOST.NAME} - Видимое имя узла сети
{$HOST.PORTS} - Порт (10050)
{$PUTHM} - название используемой программы на хосте или сразу несколько через ;
{$FILTRHM} - Показать
{$HIDEHM} - Скрыть
1. По имени Узла узнаем ID Узла (host.get)
2. Получаем список Элементов данных из Узла для Hardware Monitor (item.get)
3. Если не было зависимости триггера от NoPingAgent к Процессу проставим (через скрипт triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "" "" "" "" "${namepo}" "NoPingAgent {HOST.NAME}")
4. Если не было Зависимость от Процесса, для Нет Данных
(через скрипт triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "" "" "" "" "Нет Данных HM-LLD-JSON-data" "${namepo}")
5. Сортируем Элементы данных По Типу и Формируем Триггеры (массовые выражения в один триггер группу элементов) и Формируем данные для Создания Графиков
6. Для Температуры CPU 60 и 70 градусов
Создание графика через скрипт graphcreatezbxapi.sh
После создания графика запросим его ID и в момент создания триггера добавим URL на график (graph.get)
Формируем Триггеры и Создаем через скрипт triggercreatezbxapi.sh
Создадим отдельный триггер на проверку что Значение не 0 и не пустое на любой элемент по температуре CPU
Зависимость от Нет Данных HM-LLD-JSON-data, для Нет Данных HM-Temp-CPU (api)
Добавим в триггер "Ошибки API для HM" URL последних данных по элементу
Для Температуры кроме CPU 60 и 70 градусов
Создание графика
Формирование триггеров для создания в узлах через API
Зависимость HighTemp {HOST.NAME}=({ITEM.VALUE}) от ExtremHighTemp {HOST.NAME}=({ITEM.VALUE})
Аналогично для:
Для кулеров CPU
Для кулеров Кроме CPU
hmitemapi.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}
# Имя ПО для поиска Элемента данных (по ключу)
PUT="${5:-root\OpenHardwareMonitor}"
# Фильтр Отобразить
FILTR=${6:-.*}
# Фильтр Скрыть
HIDE=${7:-^$}
# Получим текущий путь откуда запущен скрипт
#currentpath=$(readlink -f $0)
#currentpath="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")"
currentpath="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
TRS='\\'
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Для создания ключа нам надо название ПО
shopt -s nocasematch #shopt - приводим к одному регистру
if [[ ${puti} == *Open* ]]; then trput="root"${TRS}"OpenHardwareMonitor"
elif [[ ${puti} == *Libre* ]]; then trput="root"${TRS}"LibreHardwareMonitor"
elif [[ ${puti} == *HWM* ]]; then trput=Emkey="root"${TRS}"HMMonitor"
shopt -u nocasematch
else Emkey="${puti}"; fi
# Получаем Искомый ключ в узле
key="wmi.get["${trput}",SELECT Value FROM Sensor WHERE InstanceId="
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 apitriggercreateerror -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}"
#------------------------------------------------------
# Получение узлов сети в соответствии с заданными параметрами 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/item/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить Элемент(ы) данных'
json="{\"jsonrpc\": \"2.0\",\"method\":\"item.get\",\"params\": {\"selectApplications\": [\"name\"],\"filter\": {\"status\": 0,\"type\": 0},\"host\": \""${HOSTHOST}"\",\"search\": {\"key_\": \"$key\"},\"output\": [\"key_\",\"units\",\"name\",\"applications\"]},\"auth\":\"$auth\", \"id\": 1 }"
#json="{\"jsonrpc\": \"2.0\",\"method\":\"item.get\",\"params\": {\"filter\": {\"status\": 0,\"type\": 0,\"units\": \"°C\"},\"host\": \""${HOSTHOST}"\",\"application\": \"OHM Temperature\",\"search\": {\"key_\": \"$key\",\"name\": \"CPU\",\"application\": \"Temperature\"},\"output\": [\"key_\"]},\"auth\":\"$auth\", \"id\": 1 }"
#json="{\"jsonrpc\": \"2.0\",\"method\":\"item.get\",\"params\": {\"filter\": {\"status\": 0,\"type\": 0,\"units\": \"°C\"},\"host\": \""${HOSTHOST}"\",\"application\": \"OHM Temperature\",\"search\": {\"key_\": \"wmi.get\",\"name\": \"CPU\",\"application\": \"Temperature\"},\"output\": [\"key_\"], \"selectApplications\": [\"name\"]},\"auth\":\"$auth\", \"id\": 1 }"
#json="{\"jsonrpc\": \"2.0\",\"method\":\"item.get\",\"params\": {\"output\": [\"key_\"], \"filter\": {\"status\": 0,\"type\": 0}, \"host\": \""${HOSTHOST}"\", \"group\": \"Сервера ЭСРН\"},\"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
# Элементы данных
PO=$(echo $trput|sed 's/.*\\//g')
item=$(echo -e $result|egrep -i 'itemid":"[0-9]+"'|sed 's|.*result":||'|sed 's/,"id.*//g'|sed 's/","key_"://g'|sed 's/}]},{/\n/g'|sed 's/\[{"applicationid":"[0-9]\+","name":"'$PO'"},{"applicationid":"[0-9]\+","name"://g'|sed 's/^\[{\|}\]}\]$//g')
#echo "Найденые элементы данных:" $result
#echo "Ключи Элементов данных" "${item}"
FR=$FR"${item}"
errorMessage="";json="";result="";check="" # Очистка переменных
# Если не было зависимости от нет пинга к процессу проставим
namepo=$(echo Процесс $trput |sed 's|root\\\\||')
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "" "" "" "" "${namepo}" "NoPingAgent {HOST.NAME}"
#echo "Зависимость" "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "" "" "" "" "${namepo}" "NoPingAgent {HOST.NAME}"
#"${HOSTNAME}""
# Зависимость от процесса, для Нет Данных
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "" "" "" "" "Нет Данных HM-LLD-JSON-data" "${namepo}"
done
# Построчно
IFS=$'\n'
for element in $(echo "${FR}" 2>/dev/null);
do
#echo "${element}"
# Уберем вначале ID элемента для выражения
#element=$(echo $element |sed 's/"itemid":"[0-9]\+//g')
# Получаем key |Убираем ID элемента|убираем все оствшееся
keydefault=$(echo $element |sed 's/"itemid":"[0-9]\+//g'|sed 's/^"\|","units".*//g'|sed 's/\\/\\\\/g')
# Получаем key |Убираем ID элемента|Элементы без CPU|убираем все оствшееся
keynocpu=$(echo $element |sed 's/"itemid":"[0-9]\+//g'|grep -iv "CPU"|sed 's/^"\|","units".*//g'|sed 's/\\/\\\\/g')
# Получаем key |Убираем ID элемента|Элементы с CPU|убираем все оствшееся
keyscpu=$(echo $element |sed 's/"itemid":"[0-9]\+//g'|grep -i "CPU"|sed 's/^"\|","units".*//g'|sed 's/\\/\\\\/g')
# Имя Элемента
nameitem=$(echo "${element}"|sed 's/.*name":"\|","applications.*//g')
# Оставим только ID элемента для графиков
itemidgraph=$(echo $element |sed 's/"itemid":"//g'|sed 's/"wmi.get.*//g')
# Имя ПО для зависимости триггеров
namehw=$(echo Процесс $element |sed 's/"itemid":"[0-9]\+//g' |sed 's/"wmi.get\[root\\\|,SELECT.*//g')
#namehw=$(echo Процесс $namepo)
# Рассортируем по типам
case $element in
*MHz*Clock*)
triggermhz="{"${HOSTHOST}":$keydefault"
#echo $triggermhz
;;
*%*Load*)
triggerload="{"${HOSTHOST}":$keydefault"
;;
*%*Control*)
;;
*°C*Temperature*)
# Для Температуры CPU
triggertempcpu="{"${HOSTHOST}":$keyscpu"
#echo $triggertempcpu
# Формируем триггеры:
if [[ "$keyscpu" != "" ]]; then
extrtemptrigexpcpu=$extrtemptrigexpcpu"$ilitempcpu$triggertempcpu.avg(#3)}>70" # Условие: Для 70 градусов
hightemptrigexpcpu=$hightemptrigexpcpu"$ilitempcpu$triggertempcpu.avg(#3)}>60" # Условие: Для 60 градусов
ilitempcpu=' or\n'
doptrigtempcpu="$triggertempcpu" # Для общего условия
# Название Элемента в описание триггера (из каких эл-ов состоит триггер)
destrigtempcpu=$destrigtempcpu$(echo "${nameitem}")\\n
# Формируем список ID элементов для Графика
tempgraphcpuid=$tempgraphcpuid"$gpaphtempcpu$itemidgraph"
gpaphtempcpu=';'
fi # присваиваем переменные если есть данные данного блока.
# Для Температуры Кроме CPU
triggertemp="{"${HOSTHOST}":$keynocpu"
#echo $triggertemp
# Формируем триггеры:
if [[ "$keynocpu" != "" ]]; then
extrtemptrigexp=$extrtemptrigexp"$ilitemp$triggertemp.avg(#3)}>70" # Условие: Для 70 градусов
hightemptrigexp=$hightemptrigexp"$ilitemp$triggertemp.avg(#3)}>60" # Условие: Для 60 градусов
ilitemp=' or\n'
doptrigtemp="$triggertemp" # Для общего условия
# Название Элемента в описание триггера (из каких эл-ов состоит триггер)
destrigtemp=$destrigtemp$(echo "${nameitem}")\\n
# Формируем список ID элементов для Графика
tempgraphnocpuid=$tempgraphnocpuid"$gpaphtempnocpu$itemidgraph"
gpaphtempnocpu=';'
fi # присваиваем переменные если есть данные данного блока.
;;
*GB*Data*)
;;
*RPM*Fan*)
# Кулера CPU
triggerfancpu="{"${HOSTHOST}":$keyscpu"
#echo $triggerfancpu
if [[ "$keyscpu" != "" ]]; then
fantrigcpu=$fantrigcpu"$ilifancpu$triggerfancpu.avg(#3)}=0 or\n$triggerfancpu.avg(#3)}>2500" # Условие: Кулер неработает 0 или обороты выше 2500
ilifancpu=' or\n'
doptrigfancpu="$triggerfancpu" # Для общего условия
# Название Элемента в описание триггера (из каких эл-ов состоит триггер)
destrigfancpu=$destrigfancpu$(echo "${nameitem}")\\n
# Формируем список ID элементов для Графика
fancpugraphid=$fancpugraphid"$gpaphfancpu$itemidgraph"
gpaphfancpu=';'
fi # присваиваем переменные если есть данные данного блока.
# Для Кулеров Кроме CPU
triggerfan="{"${HOSTHOST}":$keynocpu"
#echo $triggerfan
if [[ "$keynocpu" != "" ]]; then
fantrig=$fantrig"$ilifan$triggerfan.avg(#3)}=0 or\n$triggerfan.avg(#3)}>2500" # Условие: Кулер неработает 0 или обороты выше 2500
ilifan=' or\n'
doptrigfan="$triggerfan" # Для общего условия
# Название Элемента в описание триггера (из каких эл-ов состоит триггер)
destrigfan=$destrigfan$(echo "${nameitem}")\\n
# Формируем список ID элементов для Графика
fangraphid=$fangraphid"$gpaphfan$itemidgraph"
gpaphfan=';'
fi # присваиваем переменные если есть данные данного блока.
;;
*V*Voltage*)
;;
*KB/s*Throughput*)
;;
esac
keydefault=""
keyscpu=""
keynocpu=""
done
function getgrap(){
# После создания графика запросим его ID и в момент создания триггера добавим URL на график
#------------------------------------------------------
# Получение графики в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/graph/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить график'
json="{\"jsonrpc\": \"2.0\",\"method\":\"graph.get\",\"params\": {\"output\": [\"graphids\",\"name\"],\"filter\": {\"host\": \"$HOSTHOST\",\"name\": \"$namegraph\"}},\"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
idgrap=$(echo "${result}"|sed 's|.*graphid":"||'|sed 's|".*||')
#echo "Найденый график ID для триггера" $idgrap
urlgrap=$(echo "http://$zabbixServer/zabbix/charts.php?hostid=$idhost&graphid=$idgrap") # IP-заббикс, ID-Хоста ID-графика
#echo "URL На График" $urlgrap
errorMessage="";json="";result="";check="";idgrap="" # Очистка переменных
}
function getlatestdata(){
# URL для триггера "Ошибки API для HM" последние данные
#------------------------------------------------------
# Получение элементов в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/item/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается получить Элемент(ы) данных: Ошибки API'
json="{\"jsonrpc\": \"2.0\",\"method\":\"item.get\",\"params\": {\"filter\": {\"status\": 0,\"type\": 2},\"host\": \""${HOSTHOST}"\",\"search\": {\"key_\": \"$elementkey\"},\"output\": [\"itemid\"]},\"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 "Найденые элементы данных:" $result
iditem=$(echo $result|egrep -i 'itemid":"[0-9]+"'|sed 's|.*itemid":"||'|sed 's|".*||')
#echo "ИД Элемента данных Ошибки API для HM:" "${iditem}"
urllatest=$(echo "http://$zabbixServer//zabbix/history.php?action=showvalues&itemids[]=$iditem") # IP-заббикс, ID-Элемента
#echo "URL На Последние данные Элемента:" $urllatest
errorMessage="";json="";result="";check="";iditem="" # Очистка переменных
}
# Для Температуры CPU
if [[ "$extrtemptrigexpcpu" != "" ]]; then
# Создание графика
bash "${currentpath}"/graphcreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "CPU Temperature" "900" "200" "0" "1" "1" "1" "0" "0" "0" "0" "0" "" "0" "100" "" "$tempgraphcpuid" "7" "0" "0"
namegraph="CPU Temperature" &&getgrap
#echo "${extrtemptrigexpcpu}" # Тестовый вывод формирования триггера
EXTRTEMPTRIGGERCPU="$extrtemptrigexpcpu" #or\n$doptrigtempcpu.avg(#3)}=0 or\n$doptrigtempcpu.nodata(1h)}=1" # К последнему элементу добавим условие 0 или нет данных более 1 часа
# Формирование триггеров для создания в узлах через API
NAMEEXTREMHIGHTEMPCPU="ExtremHighTemp CPU {HOST.NAME}=({ITEM.VALUE})" # Имя триггера для 70 градусов
prioritextrtempcpu="5" # Важность Черезвычайная
commentsextremcpu="Слишком высокая температура\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\n\n\nИспользуемые элементы:\n$destrigtempcpu" #\n\nОшибка Если температура 0\nОшибка Если нет данных более 1 часа" # Описание триггерра для 70 градусов
echo -e $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEEXTREMHIGHTEMPCPU}" $prioritextrtempcpu "${EXTRTEMPTRIGGERCPU}" "${commentsextremcpu}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEEXTREMHIGHTEMPCPU}" $prioritextrtempcpu "${EXTRTEMPTRIGGERCPU}" "${commentsextremcpu}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
# Создадим отдельный триггер на проверку что Значение не 0 и не пустое на любой элемент по температуре CPU
valuecputemp="$doptrigtempcpu.avg(#3)}=0 or\n$doptrigtempcpu.nodata(1h)}=1"
commentsvaluecpu="Ошибка Если температура 0\nОшибка Если нет данных более 1 часа\n\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})"
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "Нет Данных HM-Temp-CPU (api)" "3" "${valuecputemp}" "${commentsvaluecpu}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
# Зависимость от Нет Данных HM-LLD-JSON-data, для Нет Данных HM-Temp-CPU (api)
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "" "" "" "" "Нет Данных HM-Temp-CPU (api)" "Нет Данных HM-LLD-JSON-data"
# Добавим в триггер "Ошибки API для HM" URL последних данных по элементу
elementkey="apitriggercreateerror" &&getlatestdata
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "Ошибки API для HM" "" "" "" "" "" "${urllatest}" "1"
fi
if [[ "$hightemptrigexpcpu" != "" ]]; then
#echo "${hightemptrigexpcpu}" # Тестовый вывод формирования триггера
HIGHTEMPTRIGGERCPU="$hightemptrigexpcpu" #or\n$doptrigtempcpu.avg(#3)}=0 or\n$doptrigtempcpu.nodata(1h)}=1" # К последнему элементу добавим условие 0 или нет данных более 1 часа
# Формирование триггеров для создания в узлах через API
NAMEHIGHTEMPCPU="HighTemp CPU {HOST.NAME}=({ITEM.VALUE})" # Имя триггера для 60 градусов
priorithightempcpu="4" # Важность высокая
commentshighcpu="Высокая температура\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\n\n\nИспользуемые элементы:\n$destrigtempcpu" #\n\nОшибка Если температура 0\nОшибка Если нет данных более 1 часа" # Описание триггерра для 60 градусов
echo -e $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEHIGHTEMPCPU}" $priorithightempcpu "${HIGHTEMPTRIGGERCPU}" "${commentshighcpu}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEHIGHTEMPCPU}" $priorithightempcpu "${HIGHTEMPTRIGGERCPU}" "${commentshighcpu}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
# Зависимость HighTemp CPU {HOST.NAME}=({ITEM.VALUE}) от ExtremHighTemp CPU {HOST.NAME}=({ITEM.VALUE})
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "" "" "" "" "HighTemp CPU {HOST.NAME}=({ITEM.VALUE})" "ExtremHighTemp CPU {HOST.NAME}=({ITEM.VALUE})"
fi
# Для Температуры кроме CPU
if [[ "$extrtemptrigexp" != "" ]]; then
# Создание графика
bash "${currentpath}"/graphcreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "Temperature" "900" "200" "0" "1" "1" "1" "0" "0" "0" "0" "0" "" "0" "100" "" "$tempgraphnocpuid" "7" "0" "0"
namegraph="Temperature" &&getgrap
#echo "${extrtemptrigexp}" # Тестовый вывод формирования триггера
EXTRTEMPTRIGGER="$extrtemptrigexp" #or\n$doptrigtemp.avg(#3)}=0 or\n$doptrigtemp.nodata(1h)}=1" # К последнему элементу добавим условие 0 или нет данных более 1 часа
# Формирование триггеров для создания в узлах через API
NAMEEXTREMHIGHTEMP="ExtremHighTemp {HOST.NAME}=({ITEM.VALUE})" # Имя триггера для 70 градусов
prioritextrtemp="5" # Важность Черезвычайная
commentsextrem="Слишком высокая температура\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\n\n\nИспользуемые элементы:\n$destrigtemp" #\n\nОшибка Если температура 0\nОшибка Если нет данных более 1 часа" # Описание триггерра для 70 градусов
echo -e $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEEXTREMHIGHTEMP}" $prioritextrtemp "${EXTRTEMPTRIGGER}" "${commentsextrem}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEEXTREMHIGHTEMP}" $prioritextrtemp "${EXTRTEMPTRIGGER}" "${commentsextrem}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
fi
if [[ "$hightemptrigexp" != "" ]]; then
#echo "${hightemptrigexp}" # Тестовый вывод формирования триггера
HIGHTEMPTRIGGER="$hightemptrigexp" #or\n$doptrigtemp.avg(#3)}=0 or\n$doptrigtemp.nodata(1h)}=1" # К последнему элементу добавим условие 0 или нет данных более 1 часа
# Формирование триггеров для создания в узлах через API
NAMEHIGHTEMP="HighTemp {HOST.NAME}=({ITEM.VALUE})" # Имя триггера для 60 градусов
priorithightemp="4" # Важность высокая
commentshigh="Высокая температура\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\n\n\nИспользуемые элементы:\n$destrigtemp" #\n\nОшибка Если температура 0\nОшибка Если нет данных более 1 часа" # Описание триггерра для 60 градусов
echo -e $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEHIGHTEMP}" $priorithightemp "${HIGHTEMPTRIGGER}" "${commentshigh}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEHIGHTEMP}" $priorithightemp "${HIGHTEMPTRIGGER}" "${commentshigh}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
# Зависимость HighTemp {HOST.NAME}=({ITEM.VALUE}) от ExtremHighTemp {HOST.NAME}=({ITEM.VALUE})
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "" "" "" "" "HighTemp {HOST.NAME}=({ITEM.VALUE})" "ExtremHighTemp {HOST.NAME}=({ITEM.VALUE})"
fi
# Для кулеров CPU
if [[ "$fantrigcpu" != "" ]]; then
# Создание графика
bash "${currentpath}"/graphcreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "FAN CPU" "900" "200" "0" "1" "1" "1" "0" "0" "0" "0" "0" "" "0" "100" "" "$fancpugraphid" "7" "0" "0"
namegraph="FAN CPU" &&getgrap
#echo "${fantrigcpu}" # Тестовый вывод формирования триггера
FANTRIGGERCPU="$fantrigcpu" #or\n$doptrigfancpu.nodata(1h)}=1" # К последнему элементу добавим условие нет данных более 1 часа
# Формирование триггеров для создания в узлах через API
NAMEFANCPU="RPM FAN CPU {HOST.NAME}=({ITEM.VALUE})" # Имя триггера для 60 градусов
prioritfancpu="2" # Важность предупреждение
commentsfancpu="Большие Обороты Кулера\n\nОшибка Если Обороты 0\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\n\n\nИспользуемые элементы:\n$destrigfancpu" #\nОшибка Если нет данных более 1 часа"
echo -e $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEFANCPU}" $prioritfancpu "${FANTRIGGERCPU}" "${commentsfancpu}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEFANCPU}" $prioritfancpu "${FANTRIGGERCPU}" "${commentsfancpu}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
fi
# Для кулеров Кроме CPU
if [[ "$fantrig" != "" ]]; then
# Создание графика
bash "${currentpath}"/graphcreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "FAN" "900" "200" "0" "1" "1" "1" "0" "0" "0" "0" "0" "" "0" "100" "" "$fangraphid" "7" "0" "0"
namegraph="FAN" &&getgrap
#echo "${fantrig}" # Тестовый вывод формирования триггера
FANTRIGGER="$fantrig" #or\n$doptrigfan.nodata(1h)}=1" # К последнему элементу добавим условие нет данных более 1 часа
# Формирование триггеров для создания в узлах через API
NAMEFAN="RPM FAN {HOST.NAME}=({ITEM.VALUE})" # Имя триггера для 60 градусов
prioritfan="2" # Важность предупреждение
commentsfan="Большие Обороты Кулера\n\nОшибка Если Обороты 0\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\n\n\nИспользуемые элементы:\n$destrigfan" #\nОшибка Если нет данных более 1 часа" # Описание триггерра
echo -e $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEFAN}" $prioritfan "${FANTRIGGER}" "${commentsfan}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
bash "${currentpath}"/triggercreatezbxapi.sh $IP "${HOSTHOST}" "${HOSTNAME}" "${NAMEFAN}" $prioritfan "${FANTRIGGER}" "${commentsfan}" "${namehw}" "NoPingAgent {HOST.NAME}" "${urlgrap}"
fi
urlgrap=""
outapi
Например: CPU 1 и на его создать множественное выражение Триггера и График по всем ядрам и потокам, дальше аналогично создаем CPU 2
Так же данные по Чипу, не просто объединяем оставшиеся данные в кучу по виду данных, а делим их по устройству.
Напряжение взять из имени сколько должно быть и создать триггер +-2 вольта.
Так же что касаемо Скриптов создания Триггеров и графиков более универсально можно сделать все раздельно как это реализуется например в php / html Например: (Content-Type: application/json, Accept: application/json для формата JSON или другой формат Content-Type: application/xml),
Пример
Показать
Тип JSON
{
"name": "Иван",
"age": 37,
"mother": {
"name": "Ольга",
"age": 58
},
"children": [
"Маша",
"Игорь",
"Таня"
],
"married": true,
"dog": null
}
Еще пример
XML
<font color="#069"><person></font>
<font color="#069"><firstname></font>Subbu<font color="#069"></firstname></font>
<font color="#069"><lastname></font>Allamaraju<font color="#069"></lastname></font>
<font color="#069"></person></font>
JSON
({
<font color="#069">"firstName"</font> : <font color="#069">"Subbu"</font>,
<font color="#069">"lastName"</font> : <font color="#069">"Allamaraju"</font>
});
JSON и XML. Что лучше?
И другие различные форматы.
{
"name": "Иван",
"age": 37,
"mother": {
"name": "Ольга",
"age": 58
},
"children": [
"Маша",
"Игорь",
"Таня"
],
"married": true,
"dog": null
}
Еще пример
XML
<font color="#069"><person></font>
<font color="#069"><firstname></font>Subbu<font color="#069"></firstname></font>
<font color="#069"><lastname></font>Allamaraju<font color="#069"></lastname></font>
<font color="#069"></person></font>
JSON
({
<font color="#069">"firstName"</font> : <font color="#069">"Subbu"</font>,
<font color="#069">"lastName"</font> : <font color="#069">"Allamaraju"</font>
});
JSON и XML. Что лучше?
И другие различные форматы.
Не нужно будет по несколько раз прописывать одно и то же в разных скриптах.
Вместо Аргументов (переменных) В Виде $1 $2 $3 и так далее, использовать Имя передаваемого элемента = Значение и дальше уже их разбирать формат JSON (JavaScript Object Notation) не нужно будет передавать пустые данные в виде "" так же порядок передачи аргументов не важен, они распарсяться тем же регулярками и подставятся переменными куда нужно в скрипте.
Указать все возможные Аргументы для данного метода , если есть входное значение используем если нет то пропускаем.
Так же если вместо значения пришел готовый массив например Выражение триггера из множества элементов, значение подставлять не нужно а используем сразу готовый массив. Либо передавать какое то доп условие что из этих значений создать множественное выражение.
Все приходит в момент создания более универсальные методы)