API Zabbix через Bash и Curl

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

API Zabbix через Bash и Curl

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







В начале разберемся что есть и зачем.

API — application programming interface API Википедия
Интерфейс прикладного программирования — это соединение между компьютерами или между компьютерными программами. Это тип программного интерфейса, предлагающий услугу другим частям программного обеспечения.

Оф. Мануал Zabbix API

Вы можете использовать удаленные HTTP запросы для вызова API. Чтобы это сделать, вам необходимо отправлять HTTP POST запросы к файлу api_jsonrpc.php, который расположен в папке с веб-интерфейсом.
http://IP/zabbix/api_jsonrpc.php
В начале необходимо выполнить вход и получить ключ аутентификации user.login

Большинство API содержит по крайней мере четыре основных метода:
get получение данных
create создание данных
update обновление данных
delete удаление данных
и другие наборы методов
Например:
user.login - вход в API и генерировать токен аутентификации
user.logout - выход из API и аннулировать текущий токен аутентификации
host.create - Создание узла сети
trigger.create - Создание триггера
и т.д.


HTTP запросы для вызова API
Запрос должен иметь заголовок Content-Type,
который задан одним из следующих значений:
application/json-rpc
application/json
application/jsonrequest


Оф. user.login
# Аутентификация
Этот метод необходимо вызывать без параметра auth в JSON-RPC запросе!
При использовании HTTP аутентификации, имя пользователя в API запросе должно совпадать с именем пользователя в заголовке Authorization. Пароль не проверяется и его можно не указывать.

{"jsonrpc": "2.0","method":"user.login","params":{"user": "Admin","password": "zabbix"},"id": 1 }

jsonrpc - версия протокола JSON-RPC, которая используется API; Zabbix API реализует JSON-RPC версии 2.0;
method - метод API, который вызывается;
params - параметры, которые передаются API методом;
id - произвольный идентификатор запроса;
auth - ключ аутентификации пользователя; та как у нас его еще не имеется, укажем его равным null.

При успешной авторизации ответ:
{"jsonrpc": "2.0","result": "0424bd59b807674191e7d77572075f33","id": 1 }

jsonrpc - снова, версия протокола JSON-RPC;
result - данные полученные от метода;
id - идентификатор соответствующего запроса.

userData -флаг Возврат информации о прошедшем аутентификацию пользователе. (флаги принимают значение userData: true или userData: 1)
В дополнение к стандартным свойствам пользователя, возвращается следующая информация:
debug_mode логическое Активирован ли пользователю режим отладки.
gui_access целое число Метод аутентификации пользователя в веб-интерфейсе. Обратитесь к свойству gui_access в объекте группы пользователей для получения списка возможных значений.
sessionid строка Токен аутентификации, который требуется использовать в последующих API запросах.
userip строка IP адрес пользователя.

Еще примеры:
# Аутентификация пользователя.
{"jsonrpc": "2.0","method":"user.login","params":{"user": "Admin","password": "zabbix"},"id": 1 }
# Выполнение запросов
{"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params":{}}
# Выход пользователя
{"jsonrpc":"2.0","method":"user.logout","params":[],"auth": AUTHID,"id": 1 }"


Запрос из командной строки через CURL
Одной стройкой
curl -X POST http://192.168.175.111/zabbix/api_jsonrpc.php -H 'Content-Type: application/json-rpc' -d '{"jsonrpc":"2.0","method":"apiinfo.version","params":{},"id":1}'
или разницы нет
curl -X POST -H 'Content-Type: application/json-rpc' -d '{"jsonrpc":"2.0","method":"apiinfo.version","params":{},"id":1}' http://192.168.175.111/zabbix/api_jsonrpc.php
С разрывом строк для читаемости
curl -X POST http://192.168.175.111/zabbix/api_jsonrpc.php \
-H 'Content-Type: application/json-rpc' \
-d '{"jsonrpc":"2.0","method":"apiinfo.version","params":{},"id":1}'


Ответ: {"jsonrpc":"2.0","result":"4.2.1","id":1}

-X Показывает, что в запросе будет использоваться какой-то метод.
POST Создание ресурса
GET Чтение (получение) ресурса
PUT Обновление ресурса
DELETE Удаление ресурса

Отправка данных POST
-H, --header - передать заголовки на сервер; (Для каждого заголовка включаем дополнительный -H)
-d, --data - отправить данные методом POST;
Вы можете отправлять не только файлы, но и любые данные методом POST.
Напомню, что этот метод используется для отправки данных различных форм.
Для отправки такого запроса используйте опцию -d.
curl -d "field1=val&fileld2=val1"http://posttestserver.com/post.php

Еще Запрос из командной строки через CURL
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":"e56692223b1ec39702106d8155b7de74","id":1}

Для windows cmd (''одинарные кавычки меняем на двойные "", двойные котрые были экрнанируем \)
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

-s, --silent Бесшумный или тихий режим. Не показывайте индикатор прогресса или сообщения об ошибках, будет выводить только запрошенные вами данные
-S, --show-error Заставляет curl показывать сообщение об ошибке, если оно терпит неудачу
-k, --insecure TLS проверяется на безопасностьSSL сертификата, продолжает работу с небезопасными серверами игнорируя ошибка ssl.

Пример Авторизации и Выхода через API
Скрипт apizabbix.sh

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

#!/bin/bash

#***********************************************************************
#Начало пользовательских переменных
#Установите для них соответствующие значения перед выполнением сценария...
zabbixServer='192.168.175.111'
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 "$json" $zabbixApiUrl
  echo '--------------------------------'
  echo 'Выходные данные'
  echo '--------------------------------'
  echo "$result"
  echo '********************************'
  exit 1
}

#------------------------------------------------------
# Аутентификация пользователя. 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.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo "Вход в систему выполнен успешно - Идентификатор авторизации: $auth"

# Запрос информации об авторизовавшемся пользователе
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}"

#------------------------------------------------------
# Выход из zabbix https://www.zabbix.com/documentation/current/ru/manual/api/reference/user/logout
#------------------------------------------------------
# Выполнение выхода из API.
errorMessage='*ERROR* - Не удалось выйти из системы'
usexit=`echo {\"jsonrpc\": \"2.0\",\"method\":\"user.logout\",\"params\": [],\"id\": 1, \"auth\": \"$auth\"}`
logout=`curl --silent --show-error --insecure --header $header --data "$usexit" $zabbixApiUrl`
check=$(echo "${logout}"|tr -d '\r\n'| sed -n 's/error.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then exit_with_error; fi
echo 'Успешно вышел из Zabbix' "${logout}"
Готовые варианты клиентов HTTP или утилит
Показать
Вы можете использовать любой клиент HTTP или утилиту тестирования JSON-RPC для выполнения API запросов вручную, либо библиотеку
Источник http://zabbix.org/wiki/Docs/api/libraries
== Библиотеки API Zabbix ==

Список сторонних инструментов и библиотек для работы с API Zabbix. Обязательно дайте нам знать, если мы пропустили что-то хорошее.

Смотрите также [http://www.zabbix.org/wiki/Zabbix_CLI_Tools инструменты командной строки].

=== Python ===

* [https://github.com/adubkov/py-zabbix py-zabbix] ""от Алексея Дубкова" - Модуль Zabbix для Python (PyPI "'py-zabbix"', поддержка python 2 и 3, отсутствие внешних зависимостей, автотестирование)
* [https://github.com/lukecyca/pyzabbix pyzabbix] ''by Luke Cyca'' - also maintained by ''Systematica (Zabbix Premium Partner)'' - a Python module (PyPI '''pyzabbix''', depends-on requests)
* [https://github.com/baniuyao/ZabbixPythonApi ZabbixPythonApi] "by Frank Yao" - Zabbix API для Python (no python3)
* [https://github.com/gescheit/scripts/tree/master/zabbix zabbix] "by gescheit" - библиотека Python (PyPI "'zabbix-api"')
* [https://github.com/gnetsman/zabbix_api zabbix_api] "от Григория Нецмана" - скрипты для создания и удаления хостов (зависит от zabbix-api)
* [https://github.com/jesuslosada/zabbix-client zabbix-client] ""от Иисуса Лозады" - библиотека Python (PyPI "'zabbix-клиент"')
* [https://github.com/erigones/zabbix-api zabbix-api-erigones] "от Erigones" - библиотека Python (PyPI "'zabbix-api-erigones"')
* [https://github.com/kmomberg/pyZabbixSender pyZabbixSender]"от Курта Момберга" - замена zabbix_sender для Python.
* [https://github.com/diegodrf/ZabbixAPI_py ZabbixAPI_py] ""Диего Родригес" - библиотека Python (PyPI "'Zabbix API-py"')

====ansible-модули====
* [https://docs.ansible.com/ansible/latest ... dules.html ansible] "по проекту ansible" - ansible-модули для настройки zabbix
* [https://github.com/sysfivecom/zabbix_api zabbix_api] "по sysfive.com " - дополнительные модули ansible (еще не вышестоящие)

=== Ruby ===

* [http://trac.red-tux.net/wiki/zbx_api Zabbix API] "by nelsonab" (последний код, похоже, включен [https://github.com/red-tux/zbxapi / github]) - рубиновая оболочка
* [https://github.com/dhruvbansal/rubix Rubix] "by Dhruv Bansal" - библиотека Ruby для работы с API, а также для извлечения и отправки данных на сервер Zabbix
* [http://rubygems.org/gems/zabbixapi zabbixapi] ''экспресс 42'' - a Ruby gem, см. README на [https://github.com/express42/zabbixapi github]
* [https://github.com/Pragmatic-Source/zabby zabby] "от Фарзада Фарида" - библиотека Ruby и клиент для Zabbix

=== Crystal ===

* [https://github.com/DRVTiny/monitoring_zabipi Monitoring::Zabipi and Monitoring::Zabisend] "от Андрея Коновалова "aka Drvtiny" - простая кристаллическая библиотека для работы с API Zabbix и отправки данных на zabbix_server /прокси-сервер по протоколу zabbix_sender (v2)

=== Perl ===

{| класс="сортируемый для викификации"
|-
!Имя/ссылки
!Автор
!Последнее обновление
!Комментарии
|-
|[https://github.com/SFR-ZABBIX/Zabbix-API Zabbix-API]
|SFR-ZABBIX
|2013-01-14
|
|-
|[https://github.com/mikeda/ZabbixAPI ZabbixAPI]
|Томохиро Икеда
|2012-01-07
|
|-
|[https://github.com/DRVTiny/Zabipi Zabipi]
|Андрей Коновалов
|2016-03-21
|Monitoring::Zabipi module. Содержит дополнительные методы (такие как queue.get) и хаки (такие как параметр expandNames для item.get). Многие примеры использования включены в дистрибутив.
|-
|[https://github.com/ksyz/Net-Zabbix Net-Zabbix]
|ksyz''
|2015-12-09
|
|-
|[https://github.com/matsumoto-r/Zabbix-API-Client Zabbix-API-Client]
|Мацумото Ресуке
|2013-03-27
|
|-
| Zabbix-API-Simple Простой
* [https://metacpan.org/release/Zabbix-API-Simple MetaCPAN]
* [https://github.com/dominikschulz/Zabbix-API-Simple github]
|Доминик Шульц
|2014-07-12
|
|-
|[[Docs/howto/Perl_Zabbix::Tiny_API|Zabbix-Tiny]]
* [https://metacpan.org/release/Zabbix-Tiny MetaCPAN]
* [https://github.com/whosgonna/Zabbix-Tiny.pm github]
|Бен Кауфман/[[Пользователь:whosgonna|whosgonna]]
|2018-03-23
|
|}

=== Java ===

* [https://github.com/hengyunabc/zabbix-api zabbix-api] "by hengyunabc" - библиотека Java для доступа к API Zabbix
* [https://github.com/hengyunabc/zabbix-sender zabbix-sender] "by hengyunabc" - библиотека Java для использования протокола отправителя Zabbix
* [https://github.com/myaaaaa-chan/Zabbix4j Zabbix4j] "by myaaaa-chan" - библиотека Java для доступа к API Zabbix

=== PHP ===

* [https://github.com/confirm/PhpZabbixApi/ PhpZabbixApi] "by confirm IT solutions GmbH" - класс-оболочка PHP и генератор кода-оболочки
* [https://github.com/lundgrenalex/microzabbixapiconnector microzabbixapiconnector] "от Алекса Кашина" - микро-Zabbix-Api-соединитель с поддержкой использования прокси
* [https://github.com/moestv2dk/zabbixApi ZabbixApi] "By Morten Moesgaard" - Класс-оболочка для Zabbix API, написанный на PHP (первоначально использовался в Zabbix для интеграции ServiceNow)

=== PowerShell ===

* [https://zabbixposhapi.codeplex.com/ ZabbixPosh Api] "от simsaull" - Модуль Zabbix PowerShell
* [https://1drv.ms/f/s!AnpJ3PWdnpA7nFSa8B8X7pGU_rng Zabbix] ""Бенджамином РИУАЛЕМ" - Еще один модуль Zabbix, основанный на методе Invoke-RestMethod

=== JavaScript ===

* [https://github.com/kodai/jqzabbix jqzabbix] "by Kodai Terashima" - плагин jQuery для Zabbix API
* [https://github.com/flexd/zabbix.js zabbix.js] "Кристоффер Бердал" - библиотека, основанная вокруг request.js
* [https://github.com/sumitgoelpw/zabbix-promise zabbix-promise] "by Sumit Goel" - Упрощенный клиент Zabbix API с обещанной поддержкой

=== TypeScript ===

* [https://github.com/sumitgoelpw/deno-zabbix deno-zabbix] "by Sumit Goel" - клиент Zabbix API для среды выполнения JavaScript/TypeScript Deno.

=== C# ===

* [http://www.zabbix.com/forum/showthread.php?t=24353 c# api library] "by cheezus" - библиотека C# для .NET 2.0
* [https://www.nuget.org/packages/Zabbix/ C# Library] "by HenriqueCaires" - библиотека C# для .NET 4.5
* [https://github.com/Vidlec/Zabbix.NET C# Library] ""Йозеф Видлок" - простой .Сетевая библиотека для zabbix API, написанная на C# с динамическим объектом для метода api. Нет жестко закодированных классов api (поддерживает базовую аутентификацию)

=== Go ===

* [https://github.com/cavaliercoder/go-zabbix/ go-zabbix] "Райан Армстронг" - Привязки API Zabbix для Go
* [https://github.com/rday/zabbix zabbix] "by Райан Дэй" - Zabbix API для Go
* [https://github.com/adubkov/go-zabbix go-zabbix] "от Алексея Дубкова" - Пакеты Zabbix для Go
* [https://github.com/AlekSi/zabbix-sender zabbix-sender] "Алексей Палажченко" - отправляйте данные в элементы ловушки сервера Zabbix из приложения Go
* [https://github.com/AlekSi/zabbix zabbix.go] "Алексей Палажченко" - Zabbix API для Go
* [https://github.com/cavaliercoder/g2z g2z] "Райан Армстронг" - Напишите собственные модули Zabbix в Go

=== Rust ===

* [https://github.com/dnaeon/rust-zbx rust-zbx] "Марин Атанасов Николов" - Ящик Rust для создания загружаемых модулей Zabbix

=== R ===

* [https://github.com/MarcinKosinski/RZabbix RZabbix] "Марцином Косински" - интерфейс R к данным "Zabbix API" <https://www.zabbix.com/documentation/3. ... /reference >. Обеспечивает простую и прямую связь с "Zabbix API" от "R". Опубликовано на [https://cran.r-project.org/web/packages ... index.html КРАН]

=== Online web ===

* [http://monitoringartist.github.io/zapix/ ZAPIX] "by Monitoring Artist" - онлайн-веб-утилита для тестирования и разработки запросов API - чистый Javascript, установка не требуется

[[Category:API|Libraries]]
[[Category:Zabbix sender|Libraries]]
[[Category:Python|Libraries]]
[[Category:Ruby|Libraries]]
[[Category:Perl|Libraries]]
[[Category:Java|Libraries]]
[[Category:PHP|Libraries]]
[[Category:PowerShell|Libraries]]
[[Category:C Sharp|Libraries]]
[[Category:Go|Libraries]]
Еще пример Шаблон проверки файлов
Пункт 3.Подставлять дату через API доступ в базу получать ее например с php или командой.
Готовый скрипт Проверяет существует ли глобальный макрос если нет создает проверяет совпадает ли текущая дата если нет изменяет на текущую.
/usr/local/share/zabbix/externalscripts/dateglobalmacroapi.sh Имя-узла
количество слов: 1356
Партнёрская ссылка на Хостинг Beget https://beget.com/p937243
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 496
Стаж: 3 года 5 месяцев
Откуда: Вологодская область
Поблагодарили: 20 раз
Контактная информация:

API Zabbix через Bash и Curl

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

Авторизуемся получим токен аунтификации
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
triggercreatezbxapi.zip
triggercreatezbxapi.zip
(1.98 КБ) 5 скачиваний

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

#!/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 # Запустим блок Выхода
количество слов: 3322
Партнёрская ссылка на Хостинг Beget https://beget.com/p937243
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 496
Стаж: 3 года 5 месяцев
Откуда: Вологодская область
Поблагодарили: 20 раз
Контактная информация:

API Zabbix через Bash и Curl

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

Для создания графика
graph.create
Создание графика

name (требуется) строка Имя графика
width (требуется) целое число Ширина графика в пикселях 900.
height (требуется) целое число Высота графика в пикселях 200.
graphtype целое число Тип отрисовки графика. 0 - (по умолчанию) нормальный; 1 - стэкируемый; 2 - круговой; 3 - расширенный.
show_legend целое число Отображать ли легенду у графика. 0 - скрывать; 1 - (по умолчанию) отображать.
show_work_period целое число Отображать ли рабочее время на графике. 0 - скрывать; 1 - (по умолчанию) отображать.
show_triggers целое число Показывать ли триггерную линию на графике. 0 - скрыть; 1 - (по умолчанию) показать.
percent_left Процентная линия слева. По умолчанию: 0.
percent_right Процентная линия справа. По умолчанию: 0.
show_3d целое число Отображать ли круговой и расширенный графики в 3D. 0 - (по умолчанию) отображать в 2D; 1 - отображать в 3D.
yaxismax дробное число Фиксированное максимальное значение оси Y. По умолчанию: 100.
yaxismin дробное число Фиксированное минимальное значение оси Y. По умолчанию: 0.
ymax_itemid строка ID элемента данных, который используется как максимальное значение оси Y.
ymax_type целое число Метод вычисления максимального значения оси Y. 0 - (по умолчанию) вычисляемое; 1 - фиксированное; 2 - элемент данных.
ymin_itemid строка ID элемента данных, который используется как минимальное значение оси Y.
ymin_type целое число Метод вычисления минимального значения оси Y. 0 - (по умолчанию) вычисляемое; 1 - фиксированное; 2 - элемент данных.

Элемент графика
itemid (требуется) строка ID элемента данных.
calc_fnc целое число Отображаемое значение элемента. 1 - минимальное значение; 2 - (по умолчанию) среднее значение; 4 - максимальное значение; 7 - все значения; 9 - последнее значение, используется только для круговых и расширенных графиков.
drawtype целое число Стиль отрисовки элемента графика. 0 - (по умолчанию) линия; 1 - заполнение; 2 - жирная линия; 3 - точечный; 4 - пунктирная линия; 5 - градиент.
yaxisside целое число Сторона графика, на которой для элемента графика будет отрисована ось Y. 0 - (по умолчанию) с левой стороны; 1 - с правой стороны.
color (требуется) строка Цвет отрисовки элемента графика в виде шестнадцатеричного кода цвета.
type целое число Тип элемента графика. 0 - (по умолчанию) простой; 2 - сумма графика, используется только для круговых и расширенных графиков.
sortorder целое число Позиция элемента в графике. По умолчанию: начинается с 0 и увеличиывается на один с каждым элементом.
graphid строка ID графика, которому принадлежит элемент графика.


Пример скрипта
Создадим график test для элемента данных ID 177041
./graphcreatezbxapi.sh 192.168.175.8 Имя-узла "test"

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 "$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/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="" # Очистка переменных



# Колчество прогонов
for ((i=1;i<=4;i++))
do
#echo "Кол-во элементов:" $i
        # Рандомные цвета для элементов Нужно получить 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
        colorscod=""
        echo $colorsitem
        # Проверить https://www.rapidtables.com/web/color/RGB_Color.html
done


#------------------------------------------------------
# Создание графика 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\": [{\"itemid\": \"$itemidgraph\",\"calc_fnc\": $calc_fncgraph,\"drawtype \": $drawtypegraph,\"yaxisside\": $yaxissidegraph,\"color\": \"$colorgraph\",\"sortorder\": \"$sortordergraph\"}]},\
\"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\": [{\"itemid\": \"$itemidgraph\",\"calc_fnc\": $calc_fncgraph,\"drawtype \": $drawtypegraph,\"yaxisside\": $yaxissidegraph,\"color\": \"$colorgraph\",\"sortorder\": \"$sortordergraph\"}]},\
\"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\": [{\"itemid\": \"$itemidgraph\",\"type\": $typegraph,\"calc_fnc\": $calc_fncgraph,\"color\": \"$colorgraph\",\"sortorder\": \"$sortordergraph\"}]},\
\"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\": [{\"itemid\": \"$itemidgraph\",\"type\": $typegraph,\"calc_fnc\": $calc_fncgraph,\"color\": \"$colorgraph\",\"sortorder\": \"$sortordergraph\"}]},\
\"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 # Запустим блок Выхода
Что касаемо русских слов в ответ на запрос
echo -e "\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0410\u0434\u0430\u043f\u0442\u0435\u0440"
Сетевой трафик Адаптер

Выводим их echo -e ""
Русские слова
Русские слова
Получение Рандомных цветов графика Bash php
Показать
Рандомные цвета php
Цифры:
0 1 2 3 4 5 6 7 8 9
Буквы
A B C D E F
Получаем всего 15 символов
Цвет состоит из 6 символов


function randomColor() {
strcol="#"
for ($i = 0; $i < 6; $i++) {
$randNum = rand(0, 15);
switch ($randNum) {
case 10: $randNum = 'A';
break;
case 11: $randNum = 'B';
break;
case 12: $randNum = 'C';
break;
case 13: $randNum = 'D';
break;
case 14: $randNum = 'E';
break;
case 15: $randNum = 'F';
break;
}
$str .= $randNum;
}
return $str;}

На Bash

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

#!/bin/bash

# Колчество прогонов
for ((i=1;i<=4;i++))
do
#echo "Кол-во элементов:" $i
        # Нужно получить 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
        colorscod=""
        echo $colorsitem
        # Проверить https://www.rapidtables.com/web/color/RGB_Color.html
done
количество слов: 1281
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 496
Стаж: 3 года 5 месяцев
Откуда: Вологодская область
Поблагодарили: 20 раз
Контактная информация:

API Zabbix через Bash и Curl

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

ПРОЗАВИСИМОСТИ ТРИГГЕРОВ ЧЕРЕЗ API

Если обычные триггеры в узле, зависимость проставляется относительно легко через trigger.adddependencies
Запрашиваем триггеры по имени, получаем из найденных триггеров ID и подставляем кто от кого зависит.
То прототипы триггеров из правил обнаружения не все так просто, пример ниже.

Триггер в узле сети (Зависимый) из правила обнаружения ID 67195
Триггер из правила обнаружения зависимость не добавляется
Триггер из правила обнаружения зависимость не добавляется
Прототип триггер в узле сети (Зависимый) из правила обнаружения ID 67188
Прототип триггера узле сети зависимость добавляется
Прототип триггера узле сети зависимость добавляется
Прототип триггера в шаблоне (Зависимый) из правила обнаружения ID 66993
Прототип триггера в шаблоне зависимость добавляется
Прототип триггера в шаблоне зависимость добавляется
Триггер (NoPingAgent {HOST.NAME}) в узле сети от него будем делать зависимость ID 24984
Основной триггер в узле сети от которого пойдет зависимость
Основной триггер в узле сети от которого пойдет зависимость

1. Сделать зависимость между ID 67195 и ID 24984 не получится!

2. Пробуем так, в узле в правилах обнаружения прототип триггера ID 67188, и триггер в этом же узле от которого нужна зависимость с ID 24984

Команда через trigger.adddependencies

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

curl --silent --show-error --insecure --header Content-Type:application/json-rpc --data {"jsonrpc": "2.0","method":"trigger.adddependencies","params": {"triggerid": "67188","dependsOnTriggerid": "24984"},"auth":"38df63db97cb139d1a4f73dd1dad1913", "id": 1 } http://192.168.***.***/zabbix/api_jsonrpc.php
Ответ
{"jsonrpc":"2.0","error":{"code":-32500,"message":"Application error.","data":"No permissions to referred object or it does not exist!"},"id":1}
Получаем ошибку: code":-32500,"message":"Application error.","data":"No permissions to referred object or it does not exist!"
код":-32500,"сообщение": "Ошибка приложения.", "данные": "Нет разрешений на указанный объект или он не существует!"
Или
"code":-32500,"message":"Application error.","data":"Cannot update \"dependencies\" for a discovered trigger
"код": -32500,"сообщение": "Ошибка приложения.", "данные": "Не удается обновить \"зависимости\" для обнаруженного триггера

Команда через обновление триггера trigger.update

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

curl --silent --show-error --insecure --header Content-Type:application/json-rpc --data {"jsonrpc": "2.0","method":"trigger.update","params": {"triggerid": "67188", "dependencies":[{"triggerid": "24984"}]},"auth":"38df63db97cb139d1a4f73dd1dad1913", "id": 1 } http://192.168.***.***/zabbix/api_jsonrpc.php
Ответ:
{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params.","data":"No permissions to referred object or it does not exist!"},"id":1}
Получаем ошибку: code":-32602,"message":"Invalid params.","data":"No permissions to referred object or it does not exist!
код":-32602,"сообщение": "Недопустимые параметры", "данные": "Нет разрешений на указанный объект или он не существует!
Ошибка идет из следующего файла php/api/classes/CTrigger.php в блоке функции public function addDependencies

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

public function addDependencies(array $triggersData) {
		$triggersData = zbx_toArray($triggersData);

		$triggerIds = array();
		foreach ($triggersData as $dep) {
			$triggerIds[$dep['triggerid']] = $dep['triggerid'];
		}
		if (!$this->isWritable($triggerIds)) {
			self::exception(ZBX_API_ERROR_PERMISSIONS, _('No permissions to referred object or it does not exist!'));
		};
API addDependencies error
API addDependencies error
CTrigger.php
Не проходит проверку if (!$this->isWritable($triggerIds))
Проверяется что переменная $this не пустая и не больше id триггера

Да в данном случае можно проставить зависимость между шаблонами!
зависимость между шаблонами
зависимость между шаблонами
Основной триггер от которого делаем зависимость, В нашем случае есть клоны шаблонов которые немного изменены под конкретные сервера и так сделать не получится, либо если у вас например триггер создан не посредственно узле сети (не шаблонный).

Почему получаем ошибку ? Для этого обратимся к оф мануалу Zabbix API и сравним доступные методы:
API Триггер и Прототип триггера
API Триггер и Прототип триггера
Как видим отличия есть.

Вроде бы оба триггера находятся в узле, но как обычные триггеры мы зависимость сделать не можем, а во втором случае методы уже не обходимо использовать для прототипов триггеров.

Получаем что метод trigger.adddependencies для прототип триггеров вовсе не существует.
РЕШЕНИЕ:
Меняем метод trigger.update на triggerprototype.update и все хорошо ошибки нет, зависимость к прототипу в узле проставилась.)
Стоит учесть что метод triggerprototype.update удаляет все старые зависимости, если они не обходимы делаем запрос на уже существующие делаем массив и добавляем новую зависимость!
количество слов: 260
Партнёрская ссылка на Хостинг Beget https://beget.com/p937243
Ответить Вложения 9 Пред. темаСлед. тема

Вернуться в «Установка Заббикс и Дополнений»