Авторизуемся получим токен аунтификации
curl --silent --show-error --insecure --header 'Content-Type: application/json-rpc' --data '{"jsonrpc": "2.0","method":"user.login","params":{"user": "Admin","password": "zabbix"},"id": 1 }'
http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ: {"jsonrpc":"2.0","result":"b48eb8095081e0786acca369e60b9f19","id":1}
Создание триггера в узле test
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method":"trigger.create","params": [{"description": "HighTemp CPU123", "expression": "{test:wmi.get[root\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3849].avg(#3)}>800"}], "auth":"b48eb8095081e0786acca369e60b9f19", "id": 1 }'
http://192.168.175.111/zabbix/api_jsonrpc.php
Для Windows cmd (не отработал в триггере с параметром > изменил на = )
curl --silent --show-error --insecure --header "Content-Type:application/json-rpc" --data "{\"jsonrpc\": \"2.0\",\"method\":\"trigger.create\",\"params\": [{\"description\": \"HighTemp CPU123\", \"expression\": \"{test:wmi.get[root\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3849].avg(#3)}=800\"}], \"auth\":\"b48eb8095081e0786acca369e60b9f19\", \"id\": 1 }"
http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ: {"jsonrpc":"2.0","result":{"triggerids":["74877"]},"id":1}
cmd Windows Символ "^" используется для экранирования специальных символов.
curl --silent --show-error --insecure --header "Content-Type:application/json-rpc" --data "{\"jsonrpc\": \"2.0\",\"m
ethod\":\"trigger.create\",\"params\": [{\"description\": \"HighTemp CPU123\", \"expression\": \"{test:wmi.get[root\\OpenHardw
areMonitor,SELECT Value FROM Sensor WHERE InstanceId=3849].avg(#3)}^>800\"}], \"auth\":\"b48eb8095081e0786acca369e60b9f19\", \"id\
": 1 }"
http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ: {"jsonrpc":"2.0","result":{"triggerids":["74879"]},"id":1}
Запрос триггера: на узле test , Имя HighTemp CPU {HOST.NAME}=({ITEM.VALUE}) , получаемые данные: triggerid, description, priority, status
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"output": ["triggerid","description","priority","status"],"filter": {"host": "test","description": "HighTemp CPU {HOST.NAME}=({ITEM.VALUE})"}},"auth":"b48eb8095081e0786acca369e60b9f19", "id": 1 }'
http://192.168.175.111/zabbix/api_jsonrpc.php
Добавлено active": 1 вывод только активированных триггеров
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"active": 1, "output": ["triggerid","description","priority","status"],"filter": {"host": "test","description": "HighTemp CPU {HOST.NAME}=({ITEM.VALUE})"}},"auth":"b48eb8095081e0786acca369e60b9f19", "id": 1 }'
http://192.168.175.111/zabbix/api_jsonrpc.php
Аналогично "active": true
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method": "trigger.get","params": {"active": true, "output": ["triggerid","description","priority","status"],"filter": {"host": "test","description": "HighTemp CPU {HOST.NAME}=({ITEM.VALUE})"}},"auth":"b48eb8095081e0786acca369e60b9f19", "id": 1 }'
http://192.168.175.111/zabbix/api_jsonrpc.php
Активировать триггер
curl --silent --show-error --insecure --header 'Content-Type:application/json-rpc' --data '{"jsonrpc": "2.0","method":"trigger.update","params": {"triggerid": "74212","status": "0" }, "auth":"b48eb8095081e0786acca369e60b9f19", "id": 1 }'
http://192.168.175.111/zabbix/api_jsonrpc.php
Для Windows cmd
curl --silent --show-error --insecure --header "Content-Type:application/json-rpc" --data "{\"jsonrpc\": \"2.0\",\"method\":\"trigger.update\",\"params\": {\"triggerid\": \"74212\",\"status\": \"0\" }, \"auth\":\"b48eb8095081e0786acca369e60b9f19\", \"id\": 1 }"
http://192.168.175.111/zabbix/api_jsonrpc.php
Ответ: {"jsonrpc":"2.0","result":{"triggerids":["74212"]},"id":1}
Выход из API
curl --silent --show-error --insecure --header 'Content-Type: application/json-rpc' --data '{"jsonrpc": "2.0","method":"user.logout","params": [],"id": 1, "auth": "b48eb8095081e0786acca369e60b9f1"}'
http://192.168.175.111/zabbix/api_jsonrpc.php
"dependencies":[{"triggerid": "17368"}],
"tags": [{"tag": "service",
"value": "{{ITEM.VALUE}.regsub(\"Service (.*) has stopped\", \"\\1\")}"},
{"tag": "error","value": ""}]}
Для создания триггера:
trigger.create
description - Имя триггера
expression - Выражение триггера в сжатом виде
comments - описание к триггеру
priority - Важность триггера от 0 не классифицировано до 5 чрезвычайный
status - 0 активирован 1 - деактивирован
type - множественные события 0 - нет 1 - Да
url - Назначенный триггеру URL.
recovery_mode - формирования OK 0 -(по умолчанию) Выражение; 1 -Выражение восстановления; 2 -Нет
recovery_expression - Выражение восстановления триггера
correlation_mode - OK событие закрывает 0 -Все проблемы 1 - Все проблемы, при совпадения значений тегов
correlation_tag - Тег совпадения.
manual_close - закрывать вручную 0 -нет 1 -Да
dependencies - от которых будет зависеть создаваемый триггер, должно быть задано свойство triggerid
triggerid - ID зависимого триггера.
dependsOnTriggerid - ID триггера, от которого зависит этот триггер
tags - Теги триггера
Тестовый скрипт для узла test уже с элементами данных.
triggercreatezbxapi.sh
Код: Выделить всё
#!/bin/bash
#2022/01/18 v1.0 test
# Автор Мамзиков Артём Андреевич Описание по скрипту https://diyit.ru/viewtopic.php?t=1946
# Входные атрибуты для отправки информации об ошибке
HOSTCONN=$1
#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************
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 "${HOSTCONN}" -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/trigger/create
#------------------------------------------------------
errorMessage='*ERROR* - Не удается создать триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.create\",\"params\":
[{\"description\": \"HighTemp Датчик {#SensorType} Имя {#Name} {HOST.NAME}=({ITEM.VALUE})\",
\"expression\":
\"{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3845].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3846].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3847].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3848].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3860].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3861].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3862].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3863].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3845].nodata(1h)}=1\", \
\"priority\": 4 ,\
\"status\": 0 ,\
\"manual_close\": 1,\
\"comments\": \"Высокая температура;\n\
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME});\n\
\n\
Ошибка Если температура 0;\n\
Ошибка Если нет данных более 1 часа\"}],
\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
triggerids=$(echo "${result}" |sed -e 's|.*result":{"triggerids":\["||' -e 's/\"]},"id.*//g')
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Создание триггера: $triggerids"
errorMessage="";json="";result="";check="" # Очистка переменных
outapi # Запустим блок Выхода
Добавлено: Получение триггеров в соответствии с заданными параметрами
Код: Выделить всё
#!/bin/bash
#2022/01/18 v1.0 test
# Автор Мамзиков Артём Андреевич Описание по скрипту https://diyit.ru/viewtopic.php?t=1946
# Входные атрибуты для отправки информации об ошибке
# IP или DNS узла по умолчанию
HOSTCONN=$1
# Имя узла сети
HOSTHOST=$2
# Видимое имя
#HOSTNAME=$
#Входные данные для триггеров:
# Имя
# Важность
# Выражение
# Разрешить закрывать вручную
# URL
# Описание
# Активировано
# Зависимости
#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************
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 "${HOSTCONN}" -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/trigger/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"active\": true, \"output\": [\"triggerid\",\"description\",\"priority\",\"status\"],\"filter\": {\"host\": \"$HOSTHOST\",\"description\": \"HighTemp CPU {HOST.NAME}=({ITEM.VALUE})\"}},\"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
errorMessage="";json="";result="";check="" # Очистка переменных
#------------------------------------------------------
# Создание триггера https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/create
#------------------------------------------------------
errorMessage='*ERROR* - Не удается создать триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.create\",\"params\":
[{\"description\": \"HighTemp Датчик {#SensorType} Имя {#Name} {HOST.NAME}=({ITEM.VALUE})\",
\"expression\":
\"{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3845].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3846].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3847].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3848].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3860].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3861].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3862].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3863].avg(#3)}>60 or\n\
{test:wmi.get[root\\\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3845].nodata(1h)}=1\", \
\"priority\": 4 ,\
\"status\": 0 ,\
\"manual_close\": 1,\
\"comments\": \"Высокая температура;\n\
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME});\n\
\n\
Ошибка Если температура 0;\n\
Ошибка Если нет данных более 1 часа\"}],
\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
triggerids=$(echo "${result}" |sed -e 's|.*result":{"triggerids":\["||' -e 's/\"]},"id.*//g')
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Создание триггера: $triggerids"
errorMessage="";json="";result="";check="" # Очистка переменных
outapi # Запустим блок Выхода
Пример при обнаружении датчиков температуры создаем в узле 2 триггера на 60 и 70 градусов срабатывания, в триггер прописываем множественное условие или все элементы группы температуры.
Тестовая версия будет добавлено триггеры для всех групп и зависимости, графики по граппам.
HM3.6.sh
Код: Выделить всё
#!/bin/bash
#2022/01/20 v3.6
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для HardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту https://diyit.ru/viewtopic.php?f=48&t=71&p=121#p121
#Автообнаружение параметров из HardwareMonitor и его разновидностей (OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor)
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
PUT="${4:-root\OpenHardwareMonitor}"
FILTR=${5:-.*}
HIDE=${6:-^$}
KODR="${7:-cp866}"
HOSTHOST=$8
# Проверка входных переменных, вывод в лог что пришло с узлов
STV=$(date "+%F %T")
#echo $STV $IP $PORT $BLOCSCRIPT $PUT $FILTR $HIDE $KODR >> HWLog
IFS=$'\n'
SL='\\\'
TRS='\\' # Для триггера создания через API
if [[ $BLOCSCRIPT = "discovery" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Для создания ключа нам надо название ПО
shopt -s nocasematch #shopt - приводим к одному регистру
if [[ ${puti} == *Open* ]]; then Emkey="root"${SL}"OpenHardwareMonitor";trput="root"${TRS}"OpenHardwareMonitor"
elif [[ ${puti} == *Libre* ]]; then Emkey="root"${SL}"LibreHardwareMonitor";trput="root"${TRS}"LibreHardwareMonitor"
elif [[ ${puti} == *HWM* ]]; then Emkey="root"${SL}"HMMonitor";trput=Emkey="root"${TRSS}"HMMonitor"
shopt -u nocasematch
else Emkey="${puti}"; fi
get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor |Сетевые карточки могут содержать русское название по этому декодируем из cp866 или cp1251
# Запрос имен и типа железа
gethd=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Hardware"]|iconv -f "${KODR}" -t utf8`
# Оставляем нужные нам столбцы по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')
# Пришлось сделать отдельную переменую так как в родитель попадает параметр Процесс ИД когда столбец родитель пустой
# С последним столбцом по железу (делаем между ними 2 пробела)
obrhartabl=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4" "$5" "$6}')
# Выбираем родителя датчика который показывает параметры смотрим 2 и 5 таблицу
tablparent=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$5}')
# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')
# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')
# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')
#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"
#fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-2)}'`
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ(
Processid=`echo "${element}"|awk '{print $(NF-1)}'`
# Получаем Тип оборудования работа со 2 таблицей
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3)
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 5 столбец (хотя в 5 попадет 6) в сравнении со столбцом-7 1-таблицы получаем ответ 5 столбца 2 таблицы
sopost=`echo "${tablparent}"|grep -E "${Parent}"|awk '{print $2}'`
# Во второй таблице ищем соответствие к имени из параметра выше
roditel=$(echo "${obrtablhd}"|grep -E "${sopost}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Тип родителя
rodtip=`echo "${obrtablhd}"|grep -E "${sopost}"|awk '{print $1}'`
# Модель Материнской платы выводить всегда mainboard
#mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*/Motherboard.*/motherboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi
case $SensorType in
*Clock*)
UINTS="MHz"
;;
*Load*)
UINTS="%"
;;
*Control*)
UINTS="%"
;;
*Temperature*)
UINTS="°C"
triggerexpressiontemp="{"${HOSTHOST}":wmi.get["${trput}",SELECT Value FROM Sensor WHERE InstanceId=$InstanceId]"
hightemptrigfun=".avg(#3)}>60"
extremhightemptrigfun=".avg(#3)}>70"
;;
*Data*)
UINTS="GB"
;;
*Fan*)
UINTS="RPM"
;;
*Voltage*)
UINTS="V"
;;
*Throughput*)
UINTS="KB/s"
;;
esac
JSON=$JSON"$SEP\n{\"{#EMKEY}\":\"$Emkey\", \"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#UINTS}\":\"$UINTS\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\", \"{#MAINBOARD}\":\"$mainboard\"}"
SEP=", "
# Формируем триггеры
if [[ "$triggerexpressiontemp" != "" ]]; then
hightemptriggerexpression=$hightemptriggerexpression"$ili$triggerexpressiontemp$hightemptrigfun" # Для 60 градусов условие
extremhightemptriggerexpression=$extremhightemptriggerexpression"$ili$triggerexpressiontemp$extremhightemptrigfun" # Для 70 градусов условие
ili=' or\n'
doptriggerexpressiontemp="$triggerexpressiontemp" # Для общего условия
fi # присваиваем переменные если есть данные данного блока.
triggerexpressiontemp=""
done
#echo "${hightemptriggerexpression}" # Тестовый вывод формирования триггера
HIGHTEMPTRIGGER="$hightemptriggerexpression or\n$doptriggerexpressiontemp.nodata(1h)}=1" # К последнему элементу добавим условие нет данных более 1 часа
EXTREMHIGHTEMPTRIGGER="$extremhightemptriggerexpression or\n$doptriggerexpressiontemp.nodata(1h)}=1" # К последнему элементу добавим условие нет данных более 1 часа
# Прверка на ошибки, так как для 1 узла одновременно могут быть указаны несколько программ одна из них может давать ошибку в этом случае от другой программы JONS не примется, поэтому скрываем ошибки
# Ответы с хоста|Преобразуем в 1 строку|Ищем регуляркой ошибки, если найдено выводим ERROR и убираем из вывода HW с ошибкой. А ошибки отправляем траппером в элемент "Ошибки Правила Обнаружения HM"|Скрыть вывод
check=$(echo "${get}""${gethd}"|tr -d '\r\n'| sed -n 's/No Instance(s) Available.*\|Node.*\|ERROR.*\|Invalid.*\|fatal:.*\|команда не найдена.*/ERROR/Ip')
# Указывем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
IPZBXSERVER=localhost
# Очистить строки если ошибка в ПО, по имени программы удалим строки из вывода содержащие ее.; отправить траппер с ошибкой.
if [[ ${check} == *ERROR* ]]; then hwnamep=$(echo "${Emkey}"|sed -e 's/^.*\\//g');JSON=$(echo -e $JSON|sed -e '/'$hwnamep.*'/d');zabbix_sender -z $IPZBXSERVER -p 10051 -s "${HOSTCONN}" -k errordiscoveryhm -o ""${hwnamep}" "${get}"" > /dev/null;fi
done
# Выводим результат в json
JSON="["$JSON"\n]"
echo -e "${JSON}"
# Формирование триггеров для создания в узлах через API
NAMEHIGHTEMP="HighTemp CPU {HOST.NAME}=({ITEM.VALUE})" # Имя триггера для 60 градусов
priorityhightemp="4" # Важность высокая
commentshigh="Высокая температура\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\n\nОшибка Если температура 0\nОшибка Если нет данных более 1 часа" # Описание триггерра для 60 градусов
#echo $IP $HOSTHOST "${NAMEHIGHTEMP}" $priorityhightemp "${HIGHTEMPTRIGGER}" "${commentshigh}"
bash triggercreatezbxapi.sh $IP $HOSTHOST "${NAMEHIGHTEMP}" $priorityhightemp "${HIGHTEMPTRIGGER}" "${commentshigh}"
NAMEEXTREMHIGHTEMP="ExtremHighTemp CPU {HOST.NAME}=({ITEM.VALUE})" # Имя триггера для 70 градусов
priorityextremtemp="5" # Важность Черезвычайная
commentsextrem="Слишком высокая температура\nПоследнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})\n\nОшибка Если температура 0\nОшибка Если нет данных более 1 часа" # Описание триггерра для 70 градусов
#echo $IP $HOSTHOST "${NAMEEXTREMHIGHTEMP}" $priorityextremtemp "${EXTREMHIGHTEMPTRIGGER}" "${commentsextrem}"
bash triggercreatezbxapi.sh $IP $HOSTHOST "${NAMEEXTREMHIGHTEMP}" $priorityextremtemp "${EXTREMHIGHTEMPTRIGGER}" "${commentsextrem}"
elif [[ $BLOCSCRIPT = "processes" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Для создания ключа нам нужно название ПО
shopt -s nocasematch #shopt - приводим к одному регистру
if [[ ${puti} == *Open* ]]; then namehw="OpenHardwareMonitor"
elif [[ ${puti} == *Libre* ]]; then namehw="LibreHardwareMonitor"
elif [[ ${puti} == *HWM* ]]; then namehw="HMMonitor";fi
shopt -u nocasematch
# Накопительная переменная для нескольки циклов имен процесса.
HWNAME=$HWNAME"$SEP\n{\"{#NAMEHW}\":\"$namehw\"}"
SEP=", "
done
# Выводим результат
HWNAME="["$HWNAME"\n]"
echo -e "${HWNAME}"
fi
# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)
if [[ $BLOCSCRIPT = "info" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
out=$out echo -e "\n${puti}\n""${get}"
done
echo -e "${out}"
elif [[ $BLOCSCRIPT = "maxtemp" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Запрашиваем таблицу|перекодируем|выбираем строки с температурой|Исключаем обратную температуру|показать столбец значения|Вывод только числового значения|Оставляем целое число|Сортировка от меньшего к большему|вывод последней строки
maxtemperature=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8|sed -n '/'Temperature'/Ip'|sed -e '/'TjMax'/d'|awk '{print $(NF-1)}'|sed -E 's/\.[0-9]+|\,[0-9]+//g'|egrep -o '[0-9]+'|sort -n| tail -n1`
# Для нескольких ПО
maxtemp=$maxtemp"\n${maxtemperature}"
done
# Выводим максимальный результат
echo -e "${maxtemp}"|sort -n| tail -n1
fi
Передаем аргументы в скрипт создания триггеров
triggercreatezbxapi.sh
Код: Выделить всё
#!/bin/bash
#2022/01/18 v1.0 test
# Автор Мамзиков Артём Андреевич Описание по скрипту https://diyit.ru/viewtopic.php?t=1946
# Входные атрибуты для отправки информации об ошибке
# IP или DNS узла по умолчанию
HOSTCONN=$1
# Имя узла сети
HOSTHOST=$2
# Видимое имя
#HOSTNAME=$
#Входные данные для триггеров:
# Имя
description=$3
# Важность
priority=$4
# Выражение
expression=$5
# Разрешить закрывать вручную
manual_close="1"
# URL
url=""
# Описание
comments=$6
# Активировано
status="0"
# Зависимости
#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111' # Или localhost 127.0.0.1
zabbixUsername='Admin'
zabbixPassword='zabbix'
#Конец пользовательских переменных
#***********************************************************************
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 "${HOSTCONN}" -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/trigger/get
#------------------------------------------------------
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"active\": true, \"output\": [\"triggerid\",\"description\",\"priority\",\"status\"],\"filter\": {\"host\": \"$HOSTHOST\",\"description\": \"$description\"}},\"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
# Поиск триггера
checktriggers=$(echo $result|egrep -i 'triggerid":"[0-9]+"'|sed 's|.*result":||'|sed 's/,"id.*//g'|sed 's|.*description":"||'|sed 's/","priority":"'$priority'.*//g')
echo "Найденые триггеры:" $result
#echo "Находим строку по соответствию" $checktriggers
if [[ "$description" == "$checktriggers" ]]; then echo "Триггер существует:" $checktriggers &&outapi ; fi # Если триггер существует завершаем цикл скрипта
errorMessage="";json="";result="";check="" # Очистка переменных
#------------------------------------------------------
# Создание триггера https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/create
#------------------------------------------------------
errorMessage='*ERROR* - Не удается создать триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.create\",\"params\":\
[{\"description\": \"$description\",\
\"expression\": \"$expression\", \
\"priority\": $priority ,\
\"status\": $status ,\
\"manual_close\": $manual_close ,\
\"comments\": \"$comments\"}],\
\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
triggerids=$(echo "${result}" |sed -e 's|.*result":{"triggerids":\["||' -e 's/\"]},"id.*//g')
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Создание триггера: $triggerids"
errorMessage="";json="";result="";check="" # Очистка переменных
outapi # Запустим блок Выхода
Раскрытие Макросов при запросе API
Для разных запросов свои методы например
для
triggerprototype.get
expandExpression флаг Раскрытие функций и макросов в выражении триггера.
для
map.get
expandUrls флаг Добавление глобальных URL карты в соответствующие элементы карты и раскрытие макросов во всех URL элементах карты сети.
Объект карты сети
expand_macros Необходимо ли раскрывать макросы в подписях при настройке карты сети.
0 - (по умолчанию) не раскрывать макросы; 1 - раскрывать макросы.
для
graph.get
expandName флаг Раскрытие макросов в имени графика.
для
trigger.get
expandComment флаг Раскрытие макросов в описании к триггеру.
expandDescription флаг Раскрытие макросов в имени триггера.
expandExpression флаг Раскрытие функций и макросов в выражении триггера.
\"expandComment\": \"True\", \"expandDescription\": \"True\", \"expandExpression\": \"True\",
для
httptest.get
expandName флаг Раскрытие макросов в имени веб-сценария.
expandStepName флаг Раскрытие макросов в именах шагов сценария.
для
graphitem.get
"expandData": 1
для
Карты сети
expandproblem целое число 0 - нет1 - да Отображение триггера с проблемой у элементах с одной проблемой.
Больше Ищем в инструкции поиском по слову
expand