Довольно долго пытался вникнуть в суть данного агента и так до конца и не понял как же он работает.
Прошу если можно дать не теорию а практику, и привести хотя бы один (но полный) пример использования данного агента. Если вас не затруднит.
Я привык ориентироваться в документации на примеры и думаю мне вполне будет достаточно одного примера чтобы понять суть и способы применения...
Прошу помочь. =)
Push-параметры упоминались несколько раз на форуме:
https://www.netxms.org/forum/index.php/topic,48.msg145.html#msg145 (https://www.netxms.org/forum/index.php/topic,48.msg145.html#msg145)
https://www.netxms.org/forum/index.php/topic,22.msg62.html#msg62 (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
все.
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 - это оно о чём?
вот выполнение скрипта в режиме отладки:
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
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.
Виктор, вы как всегда правы =)
Заменил короткое имя сервера на длинное и всё срослось.
Правильно выглядит так:
nxpush.exe -vv -u admin -P password -H monitor MONITOR.mydomain.ru:Test=6666
процессуальный вопрос: сейчас если я правильно понял push-алгоритм реализован таким образом, что он пассивно принимает значения от внешнего источника. я думаю, что было бы гораздо удобнее, если бы push-агент мог иметь возможность работать по указанному ему заранее расписанию и САМОСТОЯТЕЛЬНО запускать указанные ему скрипты и программы и работать с их выхлопом.
тогда не понадобилось бы городить огород из дополнительных зашедулленых задач. всё бы управлялось из единого центра...
вот, хотел попробовать ещё один способ, но...
пример: опрашиваем через 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])
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...
ээ.. я не совсем понимаю, о чём речь: "ExternalParameter"...
NetXMS агент может запускать любой скрипт и результат его работы использовать как значение запрошенного DCI. Например, если у меня есть скрипт
@echo 1
и я в конфиг агента добавлю
ExternalParameter = MyParameter:cmd /c c:\myscript.cmd
то у агента появится новый параметр с именем MyParameter, и если я создам на него DCI, то при каждом запросе сервера к агенту на значение этого параметра агент будет запускать указанный скрипт и как значение возвращать первую строку, выведенную скриптом на экран (в нашем примере всегда 1).
спасибо, интересное решение =)
это равносильно 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
и вот пример на злобу дня ;) :
ищем записи одного и тот же сервера на 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.
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-овские идентификаторы нод выглядит неестественным усложнением.
Допиливать в данном случае надо сервер. Я добавил возможность использования 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.
Кстати, а скриптом можете поделиться? У меня тоже есть ESXi, которые было бы полезно подключить к мониторингу, и другим может пригодится.
Спасибо. Наверно по такому поводу перейду на 1.1 ветку :)
Скрипт:
Add-PSSnapin VMware.VimAutomation.Core
$UserName = "root"
$UserPWD = "password"
$InFilePath = "C:\ESXi-stats\ESXi-list.txt"
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -Confirm:$False
Get-Content $InFilePath | Foreach {
Connect-VIServer $_ -User $UserName -Password $UserPWD
$VMHost = Get-VMHost -Server $_
$VMHostNetwork = 0
$VMHostNetwork = Get-VMHostNetwork $_
$VMDatastoreList = ''
Get-Datastore -Server $_ | Foreach {
$VMDatastoreList += $_.Name + ' '
$ExecParameters = $VMHostNetwork.HostName + "." + $VMHostNetwork.DomainName + ":" + $_.Name + "=" + (1 - $_.FreeSpaceMB / $_.CapacityMB)
& "$env:ProgramFiles\NetXMS\bin\nxpush.exe" -u pushagent -H SERVICE $ExecParameters
}
Disconnect-VIServer -Server $_ -Force -Confirm:$False
$ExecParameters = $VMHostNetwork.HostName + "." + $VMHostNetwork.DomainName + ":MemUse=" + ($VMHost.MemoryUsageMB / $VMHost.MemoryTotalMB)
& "$env:ProgramFiles\NetXMS\bin\nxpush.exe" -u pushagent -H SERVICE $ExecParameters
$ExecParameters = $VMHostNetwork.HostName + "." + $VMHostNetwork.DomainName + ":CpuUse=" + ($VMHost.CpuUsageMhz / $VMHost.CpuTotalMhz)
& "$env:ProgramFiles\NetXMS\bin\nxpush.exe" -u pushagent -H SERVICE $ExecParameters
$ExecParameters = $VMHostNetwork.HostName + "." + $VMHostNetwork.DomainName + ":DatastoreList=" + $VMDatastoreList
& "$env:ProgramFiles\NetXMS\bin\nxpush.exe" -u pushagent -H SERVICE $ExecParameters
}
(имя сервера NetXMS - SERVICE - не вынесено в переменную, во входном файле ESXi-list.txt находятся IP-адреса ESXi-гипервизоров в столбик, имена ESXi-гипервизоров в NetXMS соответствуют их DNS-именам, после вашего патча скрипт можно будет упростить)
Запускается из стандартного виндового шедулера батником:
%PSMODULEPATH%\..\powershell.exe -PSConsoleFile "%ProgramFiles%\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -WindowStyle Minimized -Command ".\Get-AllVMHostStats.ps1"
Из-за общей неторопливости PowerCLI отрабатывает довольно долго - у меня на 6 ESXi прокручивается ~3-4 минут. Поэтому часто делать отсчёты не получится.
Результат работы - http://img847.imageshack.us/i/89160342.jpg/
Кстати, раз уж речь зашла про интеграцию NetXMS с ESXi, то есть ещё полезные фишки:
Можно включить на ESXi поддержку SNMP (только на бесплатной версии нужно её включать ДО лицензирования, пока ещё ESXi крутится на 30-дневной триалке). После этого появится возможность мониторить кое-какие параметры гипервизора (например, у меня TotalMemSize мониторится запросом на OID .1.3.6.1.4.1.6876.3.2.1.0), но в целом список этих параметров невелик и не очень интересен.
Значительно ценнее возможность получать кликом в консоли по ноде гипервизора список его виртуалок, для этого заходим в NetXMS->Control Panel->Object Tools->New->SNMP Table и там сооружаем табличку примерно такого вида: http://img828.imageshack.us/i/81835416.jpg/
Заодно можно добавить в Object Tools возможность запуска VIClient.
Также можно форвардить на NetXMS syslog-и гипервизоров, и фильтровать их на предмет ошибок.