Push-агент

Started by Anth0ny, December 17, 2008, 05:29:32 PM

Previous topic - Next topic

Anth0ny

Довольно долго пытался вникнуть в суть данного агента и так до конца и не понял как же он работает.

Прошу если можно дать не теорию а практику, и привести хотя бы один (но полный) пример использования данного агента. Если вас не затруднит.

Я привык ориентироваться в документации на примеры и думаю мне вполне будет достаточно одного примера чтобы понять суть и способы применения...

Прошу помочь. =)

Victor Kirhenshtein

Push-параметры упоминались несколько раз на форуме:

https://www.netxms.org/forum/index.php/topic,48.msg145.html#msg145
https://www.netxms.org/forum/index.php/topic,22.msg62.html#msg62

Название "агент" здесь не очень уместно, но я ничего лучше не придумал. Это просто программа, которая может посылать данные для DCI на сервер. Т.е. смысл в том, что не сервер запрашивает данные у агента, а агент предоставляет данные когда считает нужным.

Пример использования:

Есть некий датчкик, с которым работает собственная программа, которая может вызывать внешний скрипт, которому передает текущее значение. Мы хотим это значение собирать на сервер. Для этого:

1. Делаем DCI с именем, например, Test, и источником Push Agent;
2. Делаем скрипт, который принимает текущее значение и отсылает на сервер:


#!/bin/sh
nxpush -u login -P password netxms_server_address Test=$1


все.

Anth0ny

#2
Test=$1 - это означает, что мы присваиваем для текущего значения DCI "Test" значение $1 (которое получили от любой другой программы\скрипта)?

т.е. вот например такой cmd-скрипт должен сработать?
(если у DCI Test тип данных Integer)

set example=%random%
nxpush -u login -P password netxms_server_address Test=%example%

я в ответ получаю это: No valid pairs found; nothing to send

* * *

начинаю разбираться =)

nxpush -u "admin" -P "password" monitor monitor:Test=3403
Push failed at record #1 (#1 in batch): Invalid object ID.

Invalid object ID - это оно о чём?

Anth0ny

#3
вот выполнение скрипта в режиме отладки:

nxpush.exe -vv -u admin -P password -H monitor MONITOR:Test=6666
AddValuePair: dciID="0", nodeName="MONITOR", dciName="Test", value="6666"
Connecting to "monitor" as "admin"; encryption is disabled
NXCL: SendMsg("CMD_GET_SERVER_INFO", id:0)
NXCL: RecvMsg("CMD_REQUEST_COMPLETED", id:0)
NXCL: SendMsg("CMD_LOGIN", id:1)
NXCL: RecvMsg("CMD_LOGIN_RESP", id:1)
Sending batch #1 with 1 records
Record #1: "6666" for 0(MONITOR):0(Test)
NXCL: SendMsg("CMD_PUSH_DCI_DATA", id:2)
NXCL: RecvMsg("CMD_REQUEST_COMPLETED", id:2)
Push failed at record #1 (#1 in batch): Invalid object ID.
NXCL: Network receiver thread stopped

Я посмотрел, у DCI "Test" dciID=1193

Victor Kirhenshtein

Quote from: Anth0ny on May 28, 2009, 02:34:43 PM
nxpush -u "admin" -P "password" monitor monitor:Test=3403
Push failed at record #1 (#1 in batch): Invalid object ID.

Invalid object ID - это оно о чём?

Eto znachit, chto server ne nashel ob'ekt nodi s ukazannim imenem (monitor). Nado ukazivat' libo imja hosta tak, kak ono propisano v NetXMS'e, libo ego ID.

Anth0ny

#5
Виктор, вы как всегда правы =)
Заменил короткое имя сервера на длинное и всё срослось.

Правильно выглядит так:

nxpush.exe -vv -u admin -P password -H monitor MONITOR.mydomain.ru:Test=6666

процессуальный вопрос: сейчас если я правильно понял push-алгоритм реализован таким образом, что он пассивно принимает значения от внешнего источника. я думаю, что было бы гораздо удобнее, если бы push-агент мог иметь возможность работать по указанному ему заранее расписанию и САМОСТОЯТЕЛЬНО запускать указанные ему скрипты и программы и работать с их выхлопом.

тогда не понадобилось бы городить огород из дополнительных зашедулленых задач. всё бы управлялось из единого центра...

Anth0ny

#6
вот, хотел попробовать ещё один способ, но...

пример: опрашиваем через SNMP на удалённой windows-машине сервис Task Shceduler.

штатными средствами этого пока ПРАВИЛЬНО сделать нельзя, поскольку как только сервис будет остановлен, его OID пропадёт из общего списка и DCI встаент в позу Not supported. а значит мониторить сервисы на запущено\не запущено не получается.

испытывал такое решение:

@echo off
nxsnmpget -c public -p 161 имя_опрашиваемого_сервера 1.3.6.1.4.1.77.1.2.3.1.1.14.84.97.115.107.32.83.99.104.101.100.117.108.101.114
nxpush -u admin -P password -H сервер_мониторинга "полное_имя_сервера_мониторинга:Task Scheduler Checker"=%errorlevel%

где errorlevel'ы (nxsnmpget'а):

0 - и OK, и если OID не найден
3 - request timed out

Проблема: nxsnmpget отдаёт errorlevel 0 одинаково и на "сервер доступен-OID есть" и на "сервер доступен-OID'а нет"

в принципе можно эту проблему решить при помощи такой конструкции (поможет возвращаемое значение [04] (получено, порядок) и [05] (не получено, проблема)):

@echo off
nxsnmpget -c public -p 161 имя_опрашиваемого_сервера 1.3.6.1.4.1.77.1.2.3.1.1.14.84.97.115.107.32.83.99.104.101.100.117.108.101.114 | find /I "[04]"
nxpush -u admin -P password -H сервер_мониторинга "полное_имя_сервера_мониторинга:Task Scheduler Checker"=%errorlevel%

где %errorlevel%'ы (find'а):

0 - всё ок, получили [04]
1 - всё плохо, получили не [04] (скорее всего [05])

Victor Kirhenshtein

Quote from: Anth0ny on May 29, 2009, 11:53:21 AM
процессуальный вопрос: сейчас если я правильно понял push-алгоритм реализован таким образом, что он пассивно принимает значения от внешнего источника. я думаю, что было бы гораздо удобнее, если бы push-агент мог иметь возможность работать по указанному ему заранее расписанию и САМОСТОЯТЕЛЬНО запускать указанные ему скрипты и программы и работать с их выхлопом.

A chem eto otlichaetsja ot obichnogo parametra agenta, kotorij vizivaet script cherez ExternalParameter? Rabotaet po raspisaniju, vozvraschaet rezul'tat raboti scripta...

Anth0ny

ээ.. я не совсем понимаю, о чём речь: "ExternalParameter"...

Victor Kirhenshtein

NetXMS агент может запускать любой скрипт и результат его работы использовать как значение запрошенного DCI. Например, если у меня есть скрипт


@echo 1


и я в конфиг агента добавлю


ExternalParameter = MyParameter:cmd /c c:\myscript.cmd


то у агента появится новый параметр с именем MyParameter, и если я создам на него DCI, то при каждом запросе сервера к агенту на значение этого параметра агент будет запускать указанный скрипт и как значение возвращать первую строку, выведенную скриптом на экран (в нашем примере всегда 1).

Anth0ny

#10
спасибо, интересное решение =)

это равносильно ExternalParameter = MyParameter:cmd /c @echo 1
т.е. можно однострочные скрипты использовать без создания скриптофайла.

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

вот интересный пример:

for /f "tokens=2" %i in ('"nslookup www.microsoft.com 2>nul | find /i /n "address" | find /i /v "[2]" & if errorlevel 1 echo Address Not-Found"') do echo %i

Anth0ny

#11
и вот пример на злобу дня ;) :
ищем записи одного и тот же сервера на 2 DNS.


@echo off
for /f "tokens=2" %%i in ('"nslookup server1.mydomain.ru dnsserver1.mydomain.ru 2>nul | find /i /n "address" | find /i /v "[2]" & if errorlevel 1 echo Error DNS-Query-Error"') do set dns1=%%i
for /f "tokens=2" %%i in ('"nslookup server1.mydomain.ru dnsserver2.mydomain.ru 2>nul | find /i /n "address" | find /i /v "[2]" & if errorlevel 1 echo Error DNS-Query-Error"') do set dns2=%%i
if %dns1% equ 10.200.1.1 (set dns1=0) else set dns1=1
if %dns2% equ 10.200.1.1 (set dns2=0) else set dns2=2
set /a overall=%dns1%+%dns2%
@echo %overall%


таким образом если нет записей или не ответил сервер dnsserver1 мы получаем на выходе 1, если не получили данные от dnsserver2, то 2, а если не в курсе или не ответили оба, то 3. нормальное состояние = 0.

Ethril

Quote
nxpush.exe -vv -u admin -P password -H monitor MONITOR.mydomain.ru:Test=6666

Nado ukazivat' libo imja hosta tak, kak ono propisano v NetXMS'e, libo ego ID.
А возможно ли немного допилить nxpush, чтобы можно было указывать ему IP-адрес вместо имени ноды?

А то у меня PowerCLI-скрипт, периодически запускаемый на сервере NetXMS, извлекает с ESXi-гипервизора разную статистику. Эта статистика передаётся в нужные DCI через nxpush. И необходимость скрипту, помимо IP-адресов, откуда-то ещё брать внутренние NetXMS-овские идентификаторы нод выглядит неестественным усложнением.

Victor Kirhenshtein

Допиливать в данном случае надо сервер. Я добавил возможность использования IP адреса или DNS имени вместо имени объекта - их надо будет указывать после символа @, например:

nxpush.exe -u admin -P password -H monitor @10.0.0.2:Test=1

Эти изменения войдут в релиз 1.1.1. Если вы используете 1.0.11 и не планируете переход на ветку 1.1.x, то я могу прислать патч для сервера 1.0.11.

Victor Kirhenshtein

Кстати, а скриптом можете поделиться? У меня тоже есть ESXi, которые было бы полезно подключить к мониторингу, и другим может пригодится.