Скрипты API Zabbix для Hardware Monitor

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

Скрипты API Zabbix для Hardware Monitor

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

Дополнение к Скрипт + Шаблон для Windows LLD Open Hardware Monitor и
Скрипт + Шаблон для Windows LLD Hardware Monitor

Как это работает API Zabbix через Bash и Curl

СКАЧАТЬ
API -Скрипты.zip
API -Скрипты.zip
(37.22 КБ) 53 скачивания
Предварительно к узлам должен быть подключен шаблон, обнаружены элементы данных для 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
Шаблон LLD V3.0-3.4
Шаблон LLD V3.0-3.4
В шаблоне 3.0-3.4 PORT
Создание Триггеров и Графиков запуск скрипта API hmitemapi.sh[{HOST.CONN},{HOST.HOST},{HOST.NAME},{$HOST.PORTS}]
Ошибки API попадают в
Ошибки API Триггеры 1 apitriggercreateerror
Шаблон LLD V3.0-3.4 PORT
Шаблон LLD V3.0-3.4 PORT
В шаблоне 3.5 PORT
Создание Триггеров и Графиков запуск скрипта API hmitemapi.sh[{HOST.CONN},{HOST.HOST},{HOST.NAME},{$HOST.PORTS},{$PUTHM},{$FILTRHM},{$HIDEHM}]
Ошибки API Триггеры 1 apitriggercreateerror
Ошибки Правила Обнаружения HM errordiscoveryhm
Шаблон LLD V3.5-PORT
Шаблон LLD V3.5-PORT
Макросы в ключе
{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

Правильнее сделать в момент обнаружения Элементов данных в скрипте после передачи JSON на создание элементов данных разделить их на группы по устройствам.
Например: 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
}
json-vs-xml
json-vs-xml
Еще пример
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) не нужно будет передавать пустые данные в виде "" так же порядок передачи аргументов не важен, они распарсяться тем же регулярками и подставятся переменными куда нужно в скрипте.

Указать все возможные Аргументы для данного метода , если есть входное значение используем если нет то пропускаем.
Так же если вместо значения пришел готовый массив например Выражение триггера из множества элементов, значение подставлять не нужно а используем сразу готовый массив. Либо передавать какое то доп условие что из этих значений создать множественное выражение.

Все приходит в момент создания более универсальные методы)
количество слов: 2297
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 866
Стаж: 5 лет 9 месяцев
Откуда: Вологодская область
Поблагодарили: 41 раз
Контактная информация:

Скрипты API Zabbix для Hardware Monitor

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

Вначале будет проверятся создан ли у нас триггер так как скрипт выполняется каждые 6 часов то в целом уже на 2 проверку везде все будет создано, но отключать не льзя так как где то может отвалится обнаружение LLD и после нахождения элементов данных необходимо создать
триггеры, зависимости и графики, где то обновилось или дополнилось железо это новые элементы данных, либо вовсе появился новый узел.
Но если сразу давать команду на создание, а триггер уже есть мы будем получать ошибки по API поэтому сперва запрос проверка, а после уже создание или обновление).

Что у нас происходит в скрипте по созданию Триггеров?
1. Зависимость для триггера (зависимый триггер), получаем ID (Получение триггеров trigger.get)
2. Триггер для зависимости (от кого зависимость), получаем ID (Получение триггеров trigger.get)
3. Получение уже существующих зависимостей триггера (trigger.get)
Проверка существует уже зависимость или нет, если несколько поочередно через ;
4. Если нет какой то зависимости то делаем через обновление: Формируем массив Текущие зависимости +(новая для обновления в самом блоке обновления)
Добавляем зависимость (trigger.adddependencies)
5. Если получаем что триггер из Прототипа триггера зависимость указать нельзя
БЛОК ДЛЯ ПРОТОТИПОВ ТРИГГЕРОВ
Проверка на прототип триггера, если есть прототип триггера в узле добавляем к нему зависимость (проставится после повторного обнаружения)
6. Получаем данные о прототипе триггера в узле (triggerprototype.get)
7. Получение уже существующих зависимостей прототипа триггера (triggerprototype.get)
8. Если зависимости нет, то Обновить существующие прототипы триггеров (triggerprototype.update)
9. Проверка Перед Созданием существует триггер или нет (по имени), если да выходим (trigger.get)
10. Создание триггера (trigger.create)
11. Добавим URL в уже созданный триггер (trigger.update)


triggercreatezbxapi.sh

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

#!/bin/bash

#2022/06/14 v2.3 test
# Автор Мамзиков Артём Андреевич Описание по скрипту https://diyit.ru/viewtopic.php?t=1946

# Входные атрибуты для отправки информации об ошибке
# IP или DNS узла по умолчанию
HOSTCONN=$1
# Имя узла сети
HOSTHOST=$2
# Видимое имя
HOSTNAME=$3

#Входные данные для триггеров:
# Имя
description=$4
# Важность
priority=$5
# Выражение
expression=$6
# Разрешить закрывать вручную
manual_close="1"
# URL если есть ссылка пропишем
linku=${10}
if [[ "$linku" != "" ]]; then url="\"url\": \"$linku\",";else url=""; fi
# Описание
comments=$7
# Активировано
status="0"
# Зависимость для триггера Имя (зависимый триггер)
nametriggerslave=$8
# Триггер для зависимости Имя (от кого зависимость)
nametriggermaster=$9
# Обновить триггер 1
obn=${11}


#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
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 "${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}"


# Зависимость для триггера (зависимый триггер), получаем ID
#------------------------------------------------------
# Получение триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/get
#------------------------------------------------------
if [[ "$nametriggerslave" != "" ]]; then
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"selectTriggerDiscovery\": [\"parent_triggerid\"],\"active\": true, \"output\": [\"triggerid\",\"description\",\"priority\",\"status\"], \"expandComment\": \"True\", \"expandDescription\": \"True\", \"expandExpression\": \"True\", \"filter\": {\"host\": \"$HOSTHOST\",\"description\": \"$nametriggerslave\"}},\"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
# Поиск триггера и получение его ID
triggeridslave=$(echo $result|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*"triggerid":"||'|sed 's/","description.*//g')
# Если триггер создан из прототипа, получаем ID прототипа триггера в узле
prototypetrigidslave=$(echo $result|egrep -i '"parent_triggerid":"[0-9]+"'|sed 's|.*"parent_triggerid":"||'|sed 's/"}.*//g')
#echo "Найденые триггеры (зависимый):" $result
echo "Получаем ID триггера (зависимый):" $triggeridslave
echo "Получаем ID прототипа триггера (зависимый):" $prototypetrigidslave
errorMessage="";json="";result="";check="" # Очистка переменных
fi


# Триггер для зависимости (от кого зависимость), получаем ID
#------------------------------------------------------
# Получение триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/get
#------------------------------------------------------
if [[ "$nametriggermaster" != "" ]]; then
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"active\": true, \"output\": [\"triggerid\",\"description\",\"priority\",\"status\"], \"expandComment\": \"True\", \"expandDescription\": \"True\", \"expandExpression\": \"True\", \"filter\": {\"host\": \"$HOSTHOST\",\"description\": \"$nametriggermaster\"}},\"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
# Поиск триггера и получение его ID
triggeridmaster=$(echo $result|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*triggerid":"||'|sed 's/","description.*//g')
#echo "Найденые триггеры (зависимость от):" $result
echo "Получаем ID триггера (зависимость от):" $triggeridmaster
errorMessage="";json="";result="";check="" # Очистка переменных
fi


# Получение уже существующих зависимостей триггера
#------------------------------------------------------
# Получение триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/get
#------------------------------------------------------
if [[ "$triggeridslave$nametriggerslave" != "" ]]; then
errorMessage='*ERROR* - Не удается проверить зависимости  триггера'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"triggerids\": \"$triggeridslave\",\"active\": true,\"selectDependencies\": [\"triggerid_up\"],\"output\": [\"triggerid\",\"description\",\"priority\",\"status\"],\"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 ; fi
# Поиск триггера и получение его ID
triggerzavid=$(echo $result|egrep -i 'dependencies":\[{"triggerid":"[0-9]+"'|sed 's|.*dependencies":\[{"triggerid":"||'|sed 's|"}\]}\].*||'|sed 's/"},{"triggerid":"/;/g')
#echo -e "Найденые зависимости:" $result
echo -e "Получаем ID триггеров от которых уже есть зависимость:" $triggerzavid
errorMessage="";json="";result="";check="";masstrigupdat="" # Очистка переменных
# Проверка существует уже зависимость или нет, если несколько по очередно через ;
chekzavisimtrig="no" # Изначальное значение переменной нет зависимостей
masstrigupdat="" # Нет массива зависимостей
if [[ "$triggerzavid" != "" ]]; then # Если зависимостей нет пропускаем блок
IFS=';' read -ra razbivkatrigid < <(echo "${triggerzavid}")
for zavtrigid in "${razbivkatrigid[@]}"
do
if [[ ${zavtrigid} == ${triggeridmaster} ]]; then chekzavisimtrig="yes"
echo "Зависимость существует ${zavtrigid} == ${triggeridmaster}"
else
# Если делаем через обновление: Формируем массив Текущие зависимости +(новая для обновления в самом блоке обновления)
masstrigupdat=$masstrigupdat"{\"triggerid\": \"$zavtrigid\"},"
fi
done
fi
fi
echo $chekzavisimtrig "Массив текущих зависимостей:" $masstrigupdat


# Добавляем зависимость
#------------------------------------------------------
# Создавать новые зависимости триггеров https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/adddependencies
#------------------------------------------------------
if [[ "$chekzavisimtrig" == "no" ]]; then # если зависимости нет идем дальше, если есть пропускаем данный блок
if [[ "$nametriggerslave$nametriggermaster" != "" ]]; then # проверяем что переменные не пустые, есть id триггеров для создания зависимостей
errorMessage='*ERROR* - Не удается Создать зависимости триггера $nametriggerslave от $nametriggermaster'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.adddependencies\",\"params\": {\"triggerid\": \"$triggeridslave\",\"dependsOnTriggerid\": \"$triggeridmaster\"},\"auth\":\"$auth\", \"id\": 1 }"
result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
checkr=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
duplicate=$(echo "${result}"|tr -d '\r\n'|grep -Eci "Duplicate dependencies in trigger") # Проверка на дубль что уже есть зависимость, чтоб не высылало ошибку по дублю
if [[ "$duplicate" == "0" ]]; then


# БЛОК ДЛЯ ПРОТОТИПОВ ТРИГГЕРОВ ---------------------------
# Проверка на прототип триггера, если есть прототип триггера в узле добавляем к нему зависимость (проставится после повторного обнаружения)
prototypetrig=$(echo "${result}"|tr -d '\r\n'|grep -Eci "No permissions to referred object or it does not exist|for a discovered trigger")
if [[ "$prototypetrig" == "1" ]]; then
# Проверяем получен ли ID прототипа триггера, если нет пробуем найти по имени триггера (макросы не раскрываются! при поиске по имени учитывать)
if [[ "$prototypetrigidslave" == "" ]]; then
# Зависимость для прототипа триггера (зависимый прототип триггер), получаем ID
#------------------------------------------------------
# Получение прототипов триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/triggerprototype/get
#------------------------------------------------------
if [[ "$nametriggerslave" != "" ]]; then
errorMessage='*ERROR* - Не удается проверить прототип триггера $nametriggerslave'
json="{\"jsonrpc\": \"2.0\",\"method\":\"triggerprototype.get\",\"params\": {\"active\": true, \"output\": [\"triggerid\",\"description\",\"priority\",\"status\"],\"filter\": {\"host\": \"$HOSTHOST\",\"description\": \"$nametriggerslave\"}},\"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
# Поиск прототипа триггера и получение его ID
prototypetrigidslave=$(echo $result|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*triggerid":"||'|sed 's/","description.*//g')
#echo "Найденые прототипы триггеры:" $result
echo "Получаем ID прототипа триггера:" $prototypetrigidslave
errorMessage="";json="";result="";check="" # Очистка переменных
fi
fi

# Получение уже существующих зависимостей прототипа триггера
#------------------------------------------------------
# Получение прототипы триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/triggerprototype/get
#------------------------------------------------------
if [[ "$prototypetrigidslave" != "" ]]; then
errorMessage='*ERROR* - Не удается проверить зависимости  триггера'
json="{\"jsonrpc\": \"2.0\",\"method\":\"triggerprototype.get\",\"params\": {\"triggerids\": \"$prototypetrigidslave\",\"active\": true,\"selectDependencies\": [\"triggerid_up\"],\"output\": [\"triggerid\",\"description\",\"priority\",\"status\"],\"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 ; fi
# Поиск прототипа триггера в узле и получение его ID
triggerzavid=$(echo $result|egrep -i 'dependencies":\[{"triggerid":"[0-9]+"'|sed 's|.*dependencies":\[{"triggerid":"||'|sed 's|"}\]}\].*||'|sed 's/"},{"triggerid":"/;/g')
#echo "Найденые зависимости у прототипа в узле:" $result
echo "Получаем ID триггеров от которых уже есть зависимость:" $triggerzavid
errorMessage="";json="";result="";check="" # Очистка переменных
# Проверка существует уже зависимость или нет, если несколько по очередно через ;
chekzavisimtrig="no" # Изначальное значение переменной нет зависимостей
masstrigupdat="" # Нет массива зависимостей
if [[ "$triggerzavid" != "" ]]; then # Если зависимостей нет пропускаем блок
IFS=';' read -ra razbivkatrigid < <(echo "${triggerzavid}")
for zavtrigid in "${razbivkatrigid[@]}"
do
if [[ ${zavtrigid} == ${triggeridmaster} ]]; then chekzavisimtrig="yes"
echo "Прототип Зависимость существует ${zavtrigid} == ${triggeridmaster}"
else
# Если делаем через обновление: Формируем массив Текущие зависимости +(новая для обновления в самом блоке обновления)
masstrigupdat=$masstrigupdat"{\"triggerid\": \"$zavtrigid\"},"
fi
done
fi
echo $chekzavisimtrig "массив уже существующих зависимостей:" $masstrigupdat

if [[ "$chekzavisimtrig" == "no" ]]; then # если зависимости нет идем дальше, если есть пропускаем данный блок
#------------------------------------------------------
# Обновить существующие прототипы триггеров https://www.zabbix.com/documentation/current/ru/manual/api/reference/triggerprototype/update
#------------------------------------------------------
errorMessage='*ERROR* - Не удается Обновление зависимости прототипа триггера $nametriggerslave $prototypetrigidslave от $nametriggermaster $triggeridmaster'
json="{\"jsonrpc\": \"2.0\",\"method\":\"triggerprototype.update\",\"params\": {\"triggerid\": \"$prototypetrigidslave\", \"dependencies\":[$masstrigupdat{\"triggerid\": \"$triggeridmaster\"}]},\"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 "Создание/Обновление зависимости прототипа триггера $nametriggerslave $prototypetrigidslave от $nametriggermaster $triggeridmaster:"
#echo "Сформированая команда:" $json
errorMessage="";json="";result="";check="" # Очистка переменных
fi
errorMessage="";json="";result="";check="";duplicate="" # Очистка переменных
fi # Закрытие 2 попытка получить id прототипа триггера из имени тригера
else
if [[ ${checkr} == *ERROR* ]]; then exit_with_error ; fi # Ошибка, если это не дубль или прототип
fi # Закрытие проверки на прототип триггера
fi # Закрытие еще одной проверки существует уже зависимость или нет
fi # Закрытие проверки id триггеров не пустые
fi # Закрытие проверки существует уже зависимость или нет


# Обновляем данные триггера, добавляем зависимость (если есть зависимость другая она заменяется)
#------------------------------------------------------
# Обновление существующих триггеров https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/update
#------------------------------------------------------
#if [[ "$nametriggerslave$nametriggermaster" != "" ]]; then
#errorMessage='*ERROR* - Не удается Обновление зависимости триггера $nametriggerslave от $nametriggermaster'
#json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.update\",\"params\": {\"triggerid\": \"$triggeridslave\", \"dependencies\":[$masstrigupdat{\"triggerid\": \"$triggeridmaster\"}]},\"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 "Обновление зависимости триггера $nametriggerslave от $nametriggermaster:" $result
#errorMessage="";json="";result="";check="" # Очистка переменных
#fi


function updtrig(){
# Добавим URL в уже созданный триггер
#------------------------------------------------------
# Обновление существующих триггеров https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/update
#------------------------------------------------------
if [[ "$linku" == "$urlsrav" ]]; then obn="0" &&echo "Одинаковый URL" ;fi # Если url одинаковый выходим
if [[ "$obn" == "1" ]]; then
errorMessage='*ERROR* - Не удается Обновить URL триггера'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.update\",\"params\": {$url\"triggerid\": \"$idtriggers\"},\"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="" # Очистка переменных
else outapi ;fi
}

# Проверка Перед Созданием существует триггер или нет (по имени), если да выходим
#------------------------------------------------------
# Получение триггеров в соответствии с заданными параметрами https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/get
#------------------------------------------------------
if [[ "$description" != "" ]]; then
errorMessage='*ERROR* - Не удается проверить триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.get\",\"params\": {\"active\": true, \"output\": [\"triggerid\",\"description\",\"priority\",\"status\",\"url\"],\"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
# Поиск триггера
echo -e "Найденые триггеры:" $result
checktriggers=$(echo -e $result|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*result":||'|sed 's/,"id.*//g'|sed 's|.*description":"||'|sed 's/","priority":"'$priority'.*//g')
idtriggers=$(echo $result|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*triggerid":"||'|sed 's|".*||')
urlsrav=$(echo $result|egrep -i '"triggerid":"[0-9]+"'|sed 's|.*url":"||'|sed 's|".*||')
#echo "Находим строку по соответствию:" $checktriggers
echo "Сравнение триггеров" "$description" == "$checktriggers"
#if [[ "$description" == "$checktriggers" ]]; then echo "Триггер существует:" $checktriggers &&outapi ; fi # Если триггер существует завершаем цикл скрипта
if [[ "$description" == "$checktriggers" ]]; then echo "Триггер существует:" $checktriggers &&updtrig ; fi # Если триггер существует передаем в блок обновления
errorMessage="";json="";result="";check="" # Очистка переменных
fi


#------------------------------------------------------
# Создание триггера https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/create
#------------------------------------------------------
if [[ "$expression" != "" ]]; then
errorMessage='*ERROR* - Не удается создать триггер'
json="{\"jsonrpc\": \"2.0\",\"method\":\"trigger.create\",\"params\":\
[{\"description\": \"$description\",\
\"expression\": \"$expression\",\
\"priority\": $priority ,\
\"status\": $status ,\
\"manual_close\": $manual_close ,\
$url
\"comments\": \"$comments\",\
\"dependencies\":[{\"triggerid\": \"$triggeridslave\"}]}],\
\"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')
repeat=$(echo "${result}"|tr -d '\r\n'| sed -n 's/.*already exists on.*/double/Ip')
if [[ ${repeat} == *double* ]]; then outapi ; fi
check=$(echo "${result}"|tr -d '\r\n'| sed -n 's/error.*\|Invalid.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error &&outapi ; fi
echo "Создание триггера: $triggeridslaves"
errorMessage="";json="";result="";check="" # Очистка переменных
fi

outapi # Запустим блок Выхода


Скрипт по созданию Графиков
1. Запрашиваем существующие графики в Узле
2. Сравниваем по Имени есть такой уже или нет.
Возможные Варианты
Если график уже есть с таким именем?
Сравнить тип:
Если одинаковый:
1.Обновить: старые элементы оставить(которые не совпадают), которые совпали обновить и добавить новые.
2.Обновить: старые элементы оставить(которые не совпадают), которые совпали не обновлять и добавить новые.
3.Обновить: Удалить старые (которые не совпадают), которые совпали обновить и добавить новые.
4.Создать новый график с другим именем.
Если тип разный:
4.Создать новый график с другим именем.
5.Удалить и создать новый
6.Ничего не делать, просто выйти

В данном случае Используется 6 Вариант

Если графика нет
3. Для каждого элемента данных в графике создаем Нумерацию с 0, задаем различные данные из Аргументов или по умолчанию. Так же если не задан цвет Рандомно присваиваем цвет элемента в графике
4. Создаем график

graphcreatezbxapi.sh

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

#!/bin/bash

#2022/01/18 v1.0 test
# Автор Мамзиков Артём Андреевич Описание по скрипту https://diyit.ru/viewtopic.php?t=1946

# Входные атрибуты
# IP или DNS узла по умолчанию
HOSTCONN=$1
# Имя узла сети
HOSTHOST=$2
# Видимое имя
HOSTNAME=$3

# График > Объект графика https://www.zabbix.com/documentation/6.0/ru/manual/api/reference/graph/object
# Данные по умолчанию отмечены *
# Входные данные для графиков:
# Имя Графика
namegraph=$4
# Ширина 900*
widthgraph=${5:-900}
# Высота 200*
heightgraph=${6:-200}
# Тип графика (0*-нормальный; 1-стэкируемый; 2-круговой; 3-расширенный)
graphtypegraph=${7:-0}
# Отображать легенду (0-скрыть, 1*-показать)
show_legendgraph=${8:-1}
# Отображать рабочее время (0-скрыть, 1*-показать)
show_work_periodgraph=${9:-1}
# Отображать триггеры (0-скрыть; 1*-показать)
show_triggersgraph=${10:-1}
# Процентная линия (слева) 0* (только для нормального графика)
percent_leftgraph=${11:-0}
# Процентная линия (справа) 0* (только для нормального графика)
percent_rightgraph=${12:-0}
# 3D для Кругового (0*-2D, 1-3D)
show_3dgraph=${13:-0}
# Метод вычисления минимального значения оси Y (0*-вычисляемое; 1-фиксированное; 2-элемент данных)
ymin_typegraph=${14:-0}
# МИН значение оси Y 0*
yaxismingraph=${15:-0}
# ID элемента данных, который используется как минимальное значение оси Y.
ymin_itemidgraph=${16}
# Метод вычисления максимального значения оси Y (0*-вычисляемое; 1-фиксированное; 2-элемент данных)
ymax_typegraph=${17:-0}
# МАКС значение оси Y фиксированое 100*
yaxismaxgraph=${18:-100}
# ID элемента данных, который используется как максимальное значение оси Y.
ymax_itemidgraph=${19}
# Для запросов:
# graphid - ID графика,
# flags - Происхождение графика 0*-простой график 4-обнаруженный график,
# templateid - ID родительского графика из шаблона

# Элемент графика > Объект элемента графика https://www.zabbix.com/documentation/6.0/ru/manual/api/reference/graphitem/object
# Элементы данных:
# Имя Элемента данных
# ID элемента данных
itemidgraph=${20}
# Функция (7-все; 1-мин; 2*-сред; 4-макс; 9-последнее значение для круговых и расширенных)
calc_fncgraph=${21:-2}
# Стиль отрисовки (0*-Линия; 1-Заполнение; 2-Жирная линия; 3-Точечная линия; 4-Пунктирная линия; 5-Градиентная линия)
drawtypegraph=${22:-0}
# Расположение оси (0*-По левой стороне; 1-По правой стороне)
yaxissidegraph=${23:-0}
# Цвет (шестнадцатеричного кода цвета пример: 6C59DC)
colorgraph=${24}
# Позиция (порядок) элемента(ов) в графике с 0 и увеличиывается на один с каждым элементом.
sortordergraph=${25}
# Тип элемента графика 0*-простой; 2-сумма графика, для круговых и расширенных.
typegraph=${26:-0}
# ID графика, которому принадлежит элемент графика
graphidgraph=${27}
# Для запроса: gitemid - ID элемента графика

#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
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 -e "\033[31m $errorMessage "
  echo '----------------------------------'
  echo -e "\033[32m" 'Сформированная Команда выполнения:'
  echo '----------------------------------'
  echo  curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl
  echo '----------------------------------'
  echo -e "\033[33m" 'Выходные данные'
  echo '----------------------------------'
  echo "$result"
  echo -e "\033[0m" '**********************************'"\n"
  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/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
# Поиск графика
checkgraphids=$(echo -e "${result}"|
egrep -i 'graphid":"[0-9]+"'|sed 's|.*result":||'|sed 's/,"id.*//g'|sed 's|.*name":"||'|sed 's/"}].*//g')
echo -e "Найденые графики:" "${result}"
#echo "Находим строку по соответствию" $checkgraphids
if [[ "$namegraph" == "$checkgraphids" ]]; then echo "График существует:" $namegraph &&outapi ; fi # Если график существует завершаем цикл скрипта
errorMessage="";json="";result="";check="" # Очистка переменных

#Если график уже есть с таким именем?
#	Сравнить тип:
#		Если одинаковый:
#			1.Обновить: старые элементы оставить(которые не совпадают), которые совпали обновить и добавить новые.
#			2.Обновить: старые элементы оставить(которые не совпадают), которые совпали необновлять и добавить новые.
#			3.Обновить: Удалить старые (которые не совпадают), которые совпали обновить и добавить новые.
#			4.Создать новый график с другим именем.
#		Если тип разный:
#			4.Создать новый график с другим именем.
# 5.Удалить и создать новый
# 6.Ничего не делать, просто выйти


itemnum=0 # Начало подсчета кол-ва элементов
# Получение количества элементов для графика, делим через ;
IFS=';' read -ra sumdir < <(echo "${itemidgraph}")
# Печать разделенной строки
for idelemet in "${sumdir[@]}"
do
let "stnum += 1" # Для выбора столбцов начало с 1 
# Функция (7-все; 1-мин; 2*-сред; 4-макс; 9-последнее значение для круговых и расширенных)
fncgraph=$(echo "${calc_fncgraph}"|sed 's/[;]/\t/g'| awk -v i=$stnum '{ print $i }')
if [[ "$fncgraph" == "" ]]; then fncgraph=$(echo "${calc_fncgraph}"|sed 's/[;]/\t/g'| awk '{ print $1 }'); fi # Берем первое значение или одно которое есть
if [[ "$fncgraph" == "" ]]; then fncgraph="2" ; fi # Если переменная пустая присваиваем поумолчанию 2
# Стиль отрисовки (0*-Линия; 1-Заполнение; 2-Жирная линия; 3-Точечная линия; 4-Пунктирная линия; 5-Градиентная линия)
wtypegraph=$(echo "${drawtypegraph}"|sed 's/[;]/\t/g'| awk -v i=$stnum '{ print $i }')
if [[ "$wtypegraph" == "" ]]; then wtypegraph=$(echo "${drawtypegraph}"|sed 's/[;]/\t/g'| awk '{ print $1 }'); fi # Берем первое значение или одно которое есть.
if [[ "$wtypegraph" == "" ]]; then wtypegraph="0" ; fi # Если переменная пустая присваиваем поумолчанию 0
# Расположение оси (0*-По левой стороне; 1-По правой стороне)
xissidegraph=$(echo "${yaxissidegraph}"|sed 's/[;]/\t/g'| awk -v i=$stnum '{ print $i }')
if [[ "$xissidegraph" == "" ]]; then xissidegraph=$(echo "${yaxissidegraph}"|sed 's/[;]/\t/g'| awk '{ print $1 }'); fi # Берем первое значение или одно которое есть.
if [[ "$xissidegraph" == "" ]]; then xissidegraph="0" ; fi # Если переменная пустая присваиваем поумолчанию 0
# Цвет (шестнадцатеричного кода цвета пример: 6C59DC)
colorsitem=$(echo "${colorgraph}"|sed 's/[;]/\t/g'| awk -v i=$stnum '{ print $i }')
#if [[ "$colorsitem" == "" ]]; then xissidegraph=$(echo "${colorgraph}"|sed 's/[;]/\t/g'| awk '{ print $1 }'); fi # Берем первое значение или одно которое есть и получим один цвет всех элементов.
if [[ "$colorsitem" == "" ]]; then 
# Если переменная пустая присваиваем Рандомный цвет
# Рандомные цвета для элементов Нужно получить 6 символов
count=1 # Начало диапазона
while [ $count -le 6 ] # Выполняем если меньше или равно 6
do
#echo "Цикл чисел:" $count
    randnum=$RANDOM
    let "randnum %= 16"  # Ограничение от 0 до 15 , деление по модулю и запись в переменую
    #echo "Рандомное число:" $randnum
	case $randnum in
	    10)
	    randnum="A"
	    ;;
	    11)
	    randnum="B"
	    ;;
	    12)
	    randnum="C"
	    ;;
	    13)
	    randnum="D"
	    ;;
	    14)
	    randnum="E"
	    ;;
	    15)
	    randnum="F"
	    ;;
	    *)
	    ;;
	esac
colorscod=$colorscod"$randnum"
let "count += 1"
done
#colorsitem="#"$colorscod
colorsitem=$colorscod
colorscod=""
#echo $colorsitem # Проверить https://www.rapidtables.com/web/color/RGB_Color.html
fi
# Позиция (порядок) элемента(ов) в графике с 0 и увеличиывается на один с каждым элементом.
sortedgraph=$(echo "${sortordergraph}"|sed 's/[;]/\t/g'| awk -v i=$stnum '{ print $i }')
if [[ "$sortedgraph" == "" ]]; then sortedgraph=$itemnum ;fi # Присваиваем порядковый номер элемента начиная с 0

# Формируем строку для типа нормальный, стэкируемый
listitem=$listitem"$enumeration{\"itemid\": \"$idelemet\",\"calc_fnc\": $fncgraph,\"drawtype \": $wtypegraph,\"yaxisside\": $xissidegraph,\"color\": \"$colorsitem\",\"sortorder\": \"$sortedgraph\"}"
enumeration=","

# Тип элемента графика 0*-простой; 2-сумма графика, для круговых и расширенных.
graptype=$(echo "${typegraph}"|sed 's/[;]/\t/g'| awk -v i=$stnum '{ print $i }')
if [[ "$graptype" == "" ]]; then graptype=$(echo "${typegraph}"|sed 's/[;]/\t/g'| awk '{ print $1 }'); fi # Берем первое значение или одно которое есть.
if [[ "$graptype" == "" ]]; then graptype="0" ; fi # Если переменная пустая присваиваем поумолчанию 0
# Формируем строку для типа круговых, расширенных
listitemcircleexp=$listitemcircleexp"$enumerationexp{\"itemid\": \"$idelemet\",\"type\": $graptype,\"calc_fnc\": $fncgraph,\"color\": \"$colorsitem\",\"sortorder\": \"$sortedgraph\"}"
enumerationexp=","

let "itemnum += 1" # Номер элемента подсчет
done

echo $listitem
echo $listitemcircleexp

#------------------------------------------------------
# Создание графика https://www.zabbix.com/documentation/current/ru/manual/api/reference/graph/create
#------------------------------------------------------
if [[ "${namegraph}" != "" ]]; then
errorMessage='*ERROR* - Не удается создать график'

# МИН значение оси Y (0*-вычисляемое; 1-фиксированное; 2-элемент данных)
if [[ "${ymin_typegraph}" != "" ]]; then
if [[ ${ymin_typegraph} == 2 ]]; then ymin_typegraph=2,\"yaxismin\": $yaxismingraph
elif [[ ${ymin_typegraph} == 1 ]]; then ymin_typegraph=1,\"ymin_itemid\": $ymin_itemidgraph
else ymin_typegraph=0; fi
fi
# МАКС значение оси Y
if [[ "${ymax_typegraph}" != "" ]]; then
if [[ ${ymax_typegraph} == 2 ]]; then ymax_typegraph=2,\"yaxismax\": $yaxismaxgraph
elif [[ ${ymax_typegraph} == 1 ]]; then ymax_typegraph=1,\"ymax_itemid\": $ymax_itemidgraph
else ymax_typegraph=0; fi
fi

# Тип графика Нормальный
if [[ ${graphtypegraph} == 0 ]]; then
json="{\"jsonrpc\": \"2.0\",\"method\":\"graph.create\",\"params\":\
{\"name\": \"$namegraph\",\
\"width\": $widthgraph,\
\"height\": $heightgraph,\
\"graphtype\": $graphtypegraph,\
\"show_legend\": $show_legendgraph,\
\"show_work_period\": $show_work_periodgraph,\
\"show_triggers\": $show_triggersgraph,\
\"percent_left\": $percent_leftgraph,\
\"percent_right\": $percent_rightgraph,\
\"ymin_type\": $ymin_typegraph,\
\"ymax_type\": $ymax_typegraph,\
\"gitems\": [$listitem]},\
\"auth\":\"$auth\", \"id\": 1 }"
fi

# Тип графика стэкируемый
if [[ ${graphtypegraph} == 1 ]]; then
json="{\"jsonrpc\": \"2.0\",\"method\":\"graph.create\",\"params\":\
{\"name\": \"$namegraph\",\
\"width\": $widthgraph,\
\"height\": $heightgraph,\
\"graphtype\": $graphtypegraph,\
\"show_legend\": $show_legendgraph,\
\"show_work_period\": $show_work_periodgraph,\
\"show_triggers\": $show_triggersgraph,\
\"ymin_type\": $ymin_typegraph,\
\"ymax_type\": $ymax_typegraph,\
\"gitems\": [$listitem]},\
\"auth\":\"$auth\", \"id\": 1 }"
fi

# Тип графика круговой
if [[ ${graphtypegraph} == 2 ]]; then
json="{\"jsonrpc\": \"2.0\",\"method\":\"graph.create\",\"params\":\
{\"name\": \"$namegraph\",\
\"width\": $widthgraph,\
\"height\": $heightgraph,\
\"graphtype\": $graphtypegraph,\
\"show_legend\": $show_legendgraph,\
\"show_3d\": $show_3dgraph,\
\"gitems\": [$listitemcircleexp]},\
\"auth\":\"$auth\", \"id\": 1 }"
fi

# Тип графика расширенный
if [[ ${graphtypegraph} == 3 ]]; then
json="{\"jsonrpc\": \"2.0\",\"method\":\"graph.create\",\"params\":\
{\"name\": \"$namegraph\",\
\"width\": $widthgraph,\
\"height\": $heightgraph,\
\"graphtype\": $graphtypegraph,\
\"show_legend\": $show_legendgraph,\
\"show_3d\": $show_3dgraph,\
\"gitems\": [$listitemcircleexp]},\
\"auth\":\"$auth\", \"id\": 1 }"
fi

result=`curl --silent --show-error --insecure --header $header --data "$json" $zabbixApiUrl`
graphids=$(echo "${result}" |sed -e 's|.*result":{"graphids":\["||' -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 "Создание графика: $graphids"
errorMessage="";json="";result="";check="" # Очистка переменных
fi
outapi # Запустим блок Выхода
количество слов: 2917
Ответить Вложения 5 Пред. темаСлед. тема

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