API Zabbix через Bash и Curl

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

API Zabbix через Bash и Curl

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

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

Оф. Мануал 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":"user.login","params":{"user": "Admin","password": "zabbix"},"id": 1,"auth": null }
# Выполнение запросов
{"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 Имя-узла
количество слов: 1304
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 385
Стаж: 2 года 11 месяцев
Откуда: Вологодская область
Контактная информация:

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 КБ) 0 скачиваний

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

#!/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
Ответить Вложения 1 Пред. темаСлед. тема

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