Userparameter zabbix agent windows

Время на прочтение10 мин

Количество просмотров155K

Если нам нужно мониторить состояние серверов и прочих компьютеризированных рабочих мест при помощи Zabbix, то это можно сделать двумя способами.

Первый способ — это при помощи SNMP-запросов, с отправкой которых Zabbix замечательно справляется. Так можно вытащить и загрузку сетевых интерфейсов, и загрузку процессора, памяти. Поверх этого, производители сервера могут выдать нам по SNMP еще много информации о состоянии железа.

Второй заключается в использовании Zabbix агента, который мы будем запускать на наблюдаемой системе. Список наблюдаемых параметров включает в себя как и такие простые вещи, как загрузка процессора, использование памяти, так и более хитрые, такие как чтение текстовых лог-файлов с поддержкой ротации или отслеживание факта изменения любого файла. Можно даже в качестве параметра использовать вывод любой произвольной команды на системе. Возможности Zabbix агента растут от версии к версии.

image

Что делать, если того, что мы хотим контролировать через Zabbix нет в списке возможностей Zabbix агента? Ждать пока это имплементируют разработчики в следующем релизе? Не обязательно.

Нам оставили несколько стандартных интерфейсов для того, чтобы расширить возможности Заббикса по мониторингу серверов настолько, насколько позволит нам наша фантазия и наличие свободного времени на написание скриптов. Интерфейсы эти UserParameter и zabbix_sender. О первом и пойдет речь, а в качестве примеров будет показано как можно собирать состояние S.M.A.R.T жестких дисков и контролировать, когда кто-то удаляет или устанавливает новые программы на своей Windows-машине.

Немного матчасти

Если вы уже хоть раз настраивали Zabbix агент на сервере, то начать использовать UserParameter не составит труда. Чтобы добавить новый параметр нужно сделать несколько вещей:

  • Добавить в конце конфигурационного файла zabbix_agentd.conf строчку вида

UserParameter=<ключ>,<команда>

где:

<ключ> — уникальное имя, которое мы придумываем сами. Будем его использовать при настройке элемента данных в Zabbix.
<команда> — команда, которую нужно выполнить на наблюдаемом узле сети.

А вот сразу очень простой пример, который лежит в каждом стандартном конфиге для Linux:

UserParameter=system.test,who|wc -l

Итак, ключ здесь system.test, а выполняем команду who | wc -l, которая возвращает нам количество открытых сессий в системе. Добавляем (или раскомментируем данную строчку если уже есть), идем дальше.

  • В Веб-консоли Zabbix создать новый элемент данных с ключом, который мы использовали, если брать пример выше, то это system.test.

Для этого нажимаем «Создать элемент данных»

image

и затем выставляем ключ такой же, как указали в конфиг-файле, а тип Zabbix агент:

image

  • Перезагрузить Zabbix агента, чтобы изменения в конфиг-файле вступили в силу

Наблюдаем результат в последних данных:

image

Мониторинг SMART через UserParameter

Пример выше имеет мало практического применения, учитывая, что уже итак существует стандартный ключ system.users.num, который делает ровно тоже самое.

Так что теперь рассмотрим пример, который уже больше будет походить на реалистичный.

Если нам интересно мониторить момент, когда пора планово менять жесткие диски, то есть два варианта:

  1. Если диски за аппаратным RAID-контроллером, то, как правило, сами диски операционная система «не видит». Поэтому ищем способы как вытащить информацию о состоянии жестких дисков через утилиты или SNMP-сабагента, которые нам любезно предоставил(или не предоставил) производитель RAID-контроллера. Для каждой отдельной серии контроллеров свой путь до этой информации.
  2. Если речь идет о просто рабочих станциях, серверах с софтовом RAID и т.д., то тогда к дискам есть доступ из операционной системы, и мы вольны использовать различные утилиты для чтения их статуса. В случае Zabbix нам подходит утилита smartctl, из пакета SMARTMONTOOLS.

В Debian установка SMARTMONTOOLS сводится к:

sudo apt-get install smartmontools

и утилита готова к использованию.

Для каждого диска, который есть в системе сначала проверим, что SMART включен:

sudo smartctl -i /dev/sda | grep SMART
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

если вдруг SMART поддерживается диском, но выключен, то активируем его:

sudo smartctl -s on -S on -o on /dev/sda
smartctl version 5.37 [i686-pc-linux-gnu] Copyright (C) 2002-6 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.
SMART Attribute Autosave Enabled.
SMART Automatic Offline Testing Enabled every four hours.

Теперь мы можем проверять статус SMART командой:

sudo smartctl -H /dev/sda |grep "test"| cut -f2 -d: |tr -d " "

Именно эту команду мы и запишем в наш zabbix_agentd.conf:

UserParameter=uHDD.health,sudo smartctl -H /dev/sda |grep "test"| cut -f2 -d: |tr -d " "

где uHDD.health — ключ.

Мониторинг SMART через Flexible UserParameter

Тут возникает резонный вопрос, как быть если дисков два. Легче всего решить эту проблему поможет способность UserParameter передавать параметры агенту, про которую мы еще не упоминали. Но делается все очень просто, сразу пример:

UserParameter=uHDD.health.[*],sudo smartctl -H /dev/$1 |grep "test"| cut -f2 -d: |tr -d " "

В веб-интерфейсе Zabbix в ключе мы будем подставлять параметры в квадратные скобки вместо *. Например, для одного элемента данных мы напишем sda, а для другого sdb. В команде этот параметр найдет отражение там, где стоит переменная $1.

image

Создадим для второго диска элемент данных:

image

И через некоторое время сможем наблюдать результат в последних данных:

image

Мониторинг SMART через Flexible UserParameter c Low-level Discovery

Все получилось. Но тут возникает резонный вопрос, как быть если дисков не два, а двадцать два. И тут нам пригодится замечательная возможность низкоуровнего обнаружения (LLD), про которую мы уже говорили.

Низкоуровневое обнаружение позволяет системе мониторинга обнаруживать какое количество однотипных элементов присутствует на узле сети и динамически по шаблону создавать необходимые элементы данных, триггеры и графики для этих элементов. «Из коробки» системе доступна возможность находить файловые системы, сетевые интерфейсы и SNMP OID’ы. Однако, и здесь разработчики оставили возможность дополнить стандартные возможности, нужно просто передать в систему информацию о том, какие элементы обнаружены в формате JSON. Этим и воспользуемся.

Создадим маленький скрипт на perl, smartctl-disks-discovery.pl. Он будет находить все диски в системе и выводить эту информацию в JSON, передавая также информацию, включен ли у диска SMART или нет, а также попытается сам включить SMART, если он выключен:

#!/usr/bin/perl

#must be run as root

$first = 1;

print "{\n";
print "\t\"data\":[\n\n";

for (`ls -l /dev/disk/by-id/ | cut -d"/" -f3 | sort -n | uniq -w 3`) {
    #DISK LOOP
    $smart_avail=0;
    $smart_enabled=0;
    $smart_enable_tried=0;

    #next when total 0 at output
    if ($_ eq "total 0\n") {
        next;
    }

    print "\t,\n" if not $first;
    $first = 0;

    $disk =$_;
    chomp($disk);

    #SMART STATUS LOOP
    foreach(`smartctl -i /dev/$disk | grep SMART`) {
        $line=$_;

        # if SMART available -> continue
        if ($line = /Available/){
            $smart_avail=1;
            next;
        }

        #if SMART is disabled then try to enable it (also offline tests etc)
        if ($line = /Disabled/ & $smart_enable_tried == 0){

            foreach(`smartctl -i /dev/$disk -s on -o on -S on | grep SMART`) {

                if (/SMART Enabled/){
                    $smart_enabled=1;
                    next;
                }
            }
            $smart_enable_tried=1;
        }

        if ($line = /Enabled/){
            $smart_enabled=1;
        }
    }

    print "\t{\n";
    print "\t\t\"{#DISKNAME}\":\"$disk\",\n";
    print "\t\t\"{#SMART_ENABLED}\":\"$smart_enabled\"\n";
    print "\t}\n";

}

print "\n\t]\n";
print "}\n";

При запуске скрипт выдает:

$ /usr/local/bin/smartctl-disks-discovery.pl


{
"data":[
    {
        "{#DISKNAME}":"md0",
        "{#SMART_ENABLED}":"0"
    },
    {
        "{#DISKNAME}":"md1",
        "{#SMART_ENABLED}":"0"
    },
    {
        "{#DISKNAME}":"sda",
        "{#SMART_ENABLED}":"1"
    },
    {
        "{#DISKNAME}":"sdb",
        "{#SMART_ENABLED}":"1"
    }]
}

Теперь, для того чтобы скрипт автоматически запускался Zabbix’ом, просто добавим еще один UserParameter в zabbix_agentd.conf:

UserParameter=uHDD.discovery,sudo /usr/local/bin/smartctl-disks-discovery.pl

Покончив с настройкой конфига, переходим в веб-интерфейс, где создаем новое правило обнаружения для smartctl:

image

Обратите внимание на ключ и на фильтр, ({#SMART_ENABLED}=1) благодаря последнему будут добавляться только те обнаруженные диски, которые поддерживают SMART. Теперь мы можем переписать два наших элемента данных для дисков sda и sdb в один прототип элементов данных, просто заменив имя диска на макрос {#DISKNAME}:

image

Последнее, перед тем, как Zabbix сможет запускать команды, которые мы прописали в zabbix_agentd.conf из-под root и мониторить SMART, нужно добавить разрешения для его пользователя запускать эту команду без ввода пароля, для этого добавим в /etc/sudoers строчку:

zabbix ALL= (ALL) NOPASSWD: /usr/sbin/smartctl,/usr/local/bin/smartctl-disks-discovery.pl

Готовый шаблон для мониторинга SMART с остальными элементами данных, триггерами прикладываю, так же как и настроенный под него конфиг.

Контроль за установкой новых программ на Windows

Zabbix агент, установленный на Windows, точно также может быть расширен через UserParameter, только команды будут уже другие. Хотя, например, smartctl — кроссплатформенная утилита, и точно также можно ее использовать для контроля за жесткими дисками в Windows.

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

uDiffPrograms.vbs

'KNOWN ISSUE: If Application name conatins '-' symbol then e-mail alert containing software list will be sent all on one line instead of each packet on a single line
variable=InstalledApplications(".")
'WScript.Echo strConvert(variable,"Windows-1251","cp866")
Const ForReading = 1
zabbix_dir="C:\zabbix\"
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Create old file if does not exist
If objFSO.FileExists(zabbix_dir&"uDiffPrograms_old.txt")=0 Then
Set objFile4 = objFSO.CreateTextFile(zabbix_dir&"uDiffPrograms_old.txt")
objFile4.WriteLine variable
objFile4.Close
Call ConvertCharsetFile("0x0")
WScript.Quit
End if
'Create 'new' file
Set objFile3 = objFSO.CreateTextFile(zabbix_dir&"uDiffPrograms_new.txt")
objFile3.WriteLine variable
objFile3.Close
'Compare old and new files
Set objArgs = Wscript.Arguments
Set objFile5= objFSO.GetFile(zabbix_dir&"uDiffPrograms_new.txt")
Set objFile6 = objFSO.GetFile(zabbix_dir&"uDiffPrograms_old.txt")

If objFile5.Size <> objFile6.Size Then
' Wscript.Echo "The file is different."
Else
'Wscript.Echo "They are the same."

objFSO.DeleteFile zabbix_dir&"uDiffPrograms_new.txt"
Call ConvertCharsetFile("0x0")
WScript.Quit

End If
'Search for removed applications
Set objFile2 = objFSO.OpenTextFile(zabbix_dir&"uDiffPrograms_old.txt", ForReading)

Do Until objFile2.AtEndOfStream
strAddress2 = objFile2.ReadLine
If InStr(variable, strAddress2&vbCrLf) = 0 Then
strNotCurrent2 = strNotCurrent2 & strAddress2 & vbCrLf
End If
Loop
objFile2.Close

'Search for installed applications
Set objFile1 = objFSO.OpenTextFile(zabbix_dir&"uDiffPrograms_old.txt", ForReading)

oldvar = objFile1.ReadAll

objFile1.Close
objFSO.DeleteFile zabbix_dir&"uDiffPrograms_old.txt"
Set objFile2 = objFSO.OpenTextFile(zabbix_dir&"uDiffPrograms_new.txt", ForReading)

Do Until objFile2.AtEndOfStream
strAddress = objFile2.ReadLine
If InStr(oldvar, strAddress&vbCrLf) = 0 Then
strNotCurrent = strNotCurrent & strAddress & vbCrLf
End If
Loop
objFile2.Close
'Rename C:\zabbix\uDiffPrograms_new.txt to C:\zabbix\uDiffPrograms_old.txt
objFSO.MoveFile zabbix_dir&"uDiffPrograms_new.txt" , zabbix_dir&"uDiffPrograms_old.txt"
'Output
if strNotCurrent <> "" and strNotCurrent2 <> "" then
Call ConvertCharsetFile("Новые программы были установлены:" & vbCrLf & strNotCurrent & vbCrLf & "Следующие программы были удалены:" & vbCrLf & strNotCurrent2)
Wscript.Quit
End if
if strNotCurrent <> "" then
Call ConvertCharsetFile("Новые программы были установлены:" & vbCrLf & strNotCurrent)
End if
if strNotCurrent2 <> "" then
Call ConvertCharsetFile("Следующие программы были удалены:" & vbCrLf & strNotCurrent2)
End If

Function InstalledApplications(node)
'''with Versions
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Set oRegistry = GetObject("winmgmts://" _
& node & "/root/default:StdRegProv")
sBaseKey = _
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
iRC = oRegistry.EnumKey(HKLM, sBaseKey, arSubKeys)

For Each sKey In arSubKeys

iRC = oRegistry.GetStringValue( _
HKLM, sBaseKey & sKey, "DisplayName", sValue)

If iRC <> 0 Then
oRegistry.GetStringValue _
HKLM, sBaseKey & sKey, "QuietDisplayName", sValue
End If

If sValue <> "" and instr(sValue, "KB")=0 Then
'instr(sValue, "KB")=0 - to exlude KB-indexed Microsoft Patches
If instr(InstalledApplications, sValue&vbCrLf)=0 then
'and instr(InstalledApplications, sValue&vbCrLf)=0 - to exlude possible dublicates
InstalledApplications = _
InstalledApplications & sValue & vbCrLf
End If
End If
Next

End Function

Function ConvertCharsetFile(input)
Const adTypeBinary = 1
Const adTypeText = 2
Const bOverwrite = True
Const bAsASCII = False

'Write to temp file
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists( zabbix_dir&"uDiffPrograms_temp.txt" ) Then objFSO.DeleteFile zabbix_dir&"uDiffPrograms_temp.txt"
Set objFile3 = objFSO.CreateTextFile(zabbix_dir&"uDiffPrograms_temp.txt")
objFile3.WriteLine input
objFile3.Close

Dim oFS : Set oFS = CreateObject( "Scripting.FileSystemObject" )

Dim sFFSpec : sFFSpec = oFS.GetAbsolutePathName( zabbix_dir&"uDiffPrograms_temp.txt" )

Dim oFrom : Set oFrom = CreateObject( "ADODB.Stream" )
Dim sFrom : sFrom = "windows-1251"
Dim oTo : Set oTo = CreateObject( "ADODB.Stream" )
Dim sTo : sTo = "utf-8"

oFrom.Type = adTypeText
oFrom.Charset = sFrom
oFrom.Open
oFrom.LoadFromFile sFFSpec

oTo.Type = adTypeText
oTo.Charset = sTo
oTo.Open
oTo.WriteText oFrom.ReadText
oFrom.Close
If oFS.FileExists( sFFSpec ) Then oFS.DeleteFile sFFSpec
oTo.SaveToFile sFFSpec
oTo.Close
End Function
'=============================================================================

Для его интеграции с Zabbix добавим UserParameter в конфиг-файл:

UserParameter=uDiffPrograms, cscript.exe /nologo "C:\zabbix\uDiffPrograms.vbs" & type C:\zabbix\uDiffPrograms_temp.txt

Добавим элемент данных в шаблон для Windows:

image

Добавим триггер:

image

и действие, которое будет отправлять e-mail уведомление:

image

Весь процесс мониторинга выглядит так: каждый час запускается скрипт Zabbix агентом, который сравнивает два списка программ: текущий и предыдущий. Затем скрипт выписывает все изменения в отдельный файл. Если же изменений нет, то в файл пишется 0x0

Содержимое файла уходит на Zabbix сервер, где поднимается триггер в случае, если значение элемента данных uDiffProgramms отлично от 0x0. Затем отдельное действие отправляет по почте уведомление со списком того, что было установлено или удалено на данном компьютере:

В итоге

UserParameter — отличная и простая возможность расширить функционал системы самостоятельно. Стоит упомянуть и альтернативы: zabbix_sender, который, например, подойдет для тех случаев, когда нужно отправлять данные в Zabbix не по расписанию, (как это делает UserParameter), а по какому-то событию; и system.run[], который похож на UserParameter, но удобнее тем, что не нужно вносить изменения во все конфиги агентов, достаточно просто добавить этот элемент данных в шаблон. Более того, в следующем крупном релизе Zabbix 2.2 нас ожидает еще один новый способ расширить возможности агента- это подключаемые модули. Ждем с нетерпением!

Вот так, считайте, что если вы можете узнать что-то о системе скриптом или командой, значит, вы всегда можете передать это в Zabbix.

В этой статье мы рассмотрим, как использовать PowerShell скрипты для получения данных мониторинга с агента Zabbix. Рассмотрим два простых PowerShell скрипта, данные из которых нам нужно получить в Zabbix: как получить количество активных RDP сессий пользователей на RDS сервере Windows и как получить количество дней с даты последней установки обновлений Windows на сервере.

Для получения данных в Zabbix из внешнего PowerShell скрипта на агенте чаще всего используются два инструмента:

  • Опция UserParameter в конфигурационном файле агента позволяет запустить на хосте определенный скрипт PowerShell. При использовании этой опции нужно настроить UserParameter и поместить файл скрипта PS1 непосредственно на хосте Windows
  • Можно запускать скрипты PowerShell через system.run. В этом случае вы настраиваете скрипт непосредственно в веб интерфейсе Zabbix и можете запускать произвольные команды.

Сначала рассмотрим пример запуска скрипта PowerShell через UserParameter. Предполагаем, что вы уже установили и настроили Zabbix агент на сервере.

Создайте простой скрипт, который возвращает количество активных RDP сессий и сохраните его в файл «C:\Program Files\Zabbix Agent 2\Script\GetActiveRDPSessionCount.ps1»

$RDSsessions= qwinsta |ForEach-Object {$_ -replace "\s{2,18}",","} | ConvertFrom-Csv
$RDSActiveSessions=@($RDSsessions| where State -eq 'Active').count
Write-Host $RDSActiveSessions

Теперь отредактируйте конфигурационный файл агента Zabbix (zabbix_agent2.conf) и настройте параметр:

UserParameter=ActiveRDSSessions,powershell -NoProfile -ExecutionPolicy bypass -File "C:\Program Files\Zabbix Agent 2\Script\GetActiveRDPSessionCount.ps1"

Разрешит запуск PowerShell скрипта через UserParameter в агенте zabbix

Перезапустите службу Zabbix-агента:

Get-Service ‘Zabbix Agent 2’| Restart-Service -force

Проверьте, что агент zabbix может получить данные из нового параметра. Для тестирования агента используется встроенная утилита zabbix-get:

zabbix_get -s 127.0.0.1 -p 10050 -k ActiveRDSSessions

В данном примере Zabbix выполнил скрипт PowerShell и вернул, что на хосте активны 2 RDP сессии пользователей.

zabbix_get - проверить доступность параметра powershell в данных агента

PowerShell скрипты (даже самые просты) обычно выполняются довольно медленно. Поэтому нужно увеличить в конфигурации агента таймаут со стандартных 3 секунд до 20 (параметре Timeout=20), иначе при получении данных из PowerShell, Zabbix будет возвращать ошибку:

ZBX_NOTSUPPORTED: Timeout while executing a shell script.

При запуске команды может появится еще одна ошибка:

zabbix_get [4292]: Get value error: ZBX_TCP_READ() failed: [0x00002746] An existing connection was forcibly closed by the remote host.
zabbix_get [4292]: Check access restrictions in Zabbix agent configuration

В этом случае нужно в конфигурации агента zabbix_agent2.conf разрешить принимать локальные подключения. Добавьте адрес 127.0.0.1.

Server=192.168.20.15,127.0.0.1

Теперь можно добавить в ваш шаблон новый параметр. Перейдите на вкладку Items и добавьте:

  • Имя: Количество RDS сессии
  • Type: Zabbix Agent (active)
  • Key:
    ActiveRDSSessions
  • Type of information: Numeric (unsigned)
  • Update Interval: 1m
  • History: 90d
  • Trenfd: 365d

Добавить элемент мониторига в Zabbix для PowerShell скрипта

Перейдите в Monitoring -> Latest data и проверьте, что Zabbix теперь получает значение из PowerShell скрипта.

Теперь разрешим запуск PowerShell скриптов через system.run. Этот способ является менее безопасным, т.к. позволяет выполнить на агенте любую команду через Zabbix, но более удобным (позволяет настраивать PowerShell скрипты прямо из веб-интерфейса Zabbix).

Включите в конфигурационном файле агента параметр:

AllowKey=system.run[*]

Теперь создайте новый Item:

  • Имя: Дней с последней установки Windows
  • Type: Zabbix Agent
  • Key:
    system.run[powershell.exe -command "(New-Timespan -Start ((New-Object -com 'Microsoft.Update.AutoUpdate').Results|Select -ExpandProperty LastInstallationSuccessDate) -End (Get-Date)).days"]
  • Type of information: Numeric (unsigned)
  • Update Interval: 1d
  • History: 180d
  • Trenfd: 365d

Данная команда возвращает количество дней, прошедших с последней даты установки обновления безопасности в Windows.

В этой статье мы рассмотрели, как получить данные в Zabbix из скриптов PowerShell в Windows.

Skip to content

Zabbix UserParameter Script on Windows

Zabbix UserParameter Script on Windows

Would you like to learn how to use Zabbix Userparameter feature? In this tutorial, we are going to show you how to configure Zabbix Userparameter and create a custom script to monitor a computer running Windows.

• Zabbix version: 3.4.12
• Windows version: 7 Enterprise

The computer running Windows must have the Zabbix agent installed.

Hardware List:

The following section presents the list of equipment used to create this Zabbix tutorial.

Every piece of hardware listed above can be found at Amazon website.

Zabbix Playlist:

On this page, we offer quick access to a list of videos related to Zabbix installation.

Don’t forget to subscribe to our youtube channel named FKIT.

Zabbix Related Tutorial:

On this page, we offer quick access to a list of tutorials related to Zabbix installation.

Tutorial — Create a Windows Script

First, you need to install the Zabbix agent on the computer running Windows.

•  Zabbix agent installation on Windows.

Next, let’s create a script that will give us the answer that Zabbix agent was not able to give.

In our example, we want to know who is logged on the Windows computer at the moment.

Open the notepad and create a BATCH SCRIPT named check_username.bat with the following content.

@echo off
FOR /F «tokens=2 delims=={}» %%A IN (‘WMIC ComputerSystem Get UserName /format:list’) DO (
echo %%A
)

Save the script named check_username.bat inside the C:\Zabbix folder.

Open a DOS prompt and try to execute the check_username.bat script.

C:\>c:
C:\>cd zabbix
C:\zabbix>check_user.bat

TECHEXPERT\administrator

In our example, the script when executed displayed the username of the user logged in this computer.

In our example, the user Administrator is currently using this computer.

This script was created for Windows 7 and will not work on Windows server editions.

The script is not the important part of this tutorial, you will have to create scripts or commands that are fit to your needs.

Now we need to integrate our script to the Zabbix agent.

Open the Notepad application and edit the zabbix_agentd.win.conf configuration file.

The file zabbix_agentd.win.conf is locate inside the C:\Zabbix folder.

Here is the file, before our configuration

Server=127.0.0.1,200.200.200.200
ServerActive=200.200.200.200
Logfile=C:\zabbix\zabbix_agent.log

Here is the new file with our configuration.

Server=127.0.0.1,200.200.200.200
ServerActive=200.200.200.200
Logfile=C:\zabbix\zabbix_agent.log
UserParameter=computer.windows.user,c:\zabbix\check_user.bat

To finish our configuration you need to restart the Zabbix Agent running in this computer.

If you don’t know how to restart the Zabbix agent, you can restart the computer.

Now, the Zabbix server can contact this computer and request the following information:  computer.windows.user

The Zabbix agent installed on the Windows computer must inform the user that is currently logged on.

To test our configuration, enter the following command on the Zabbix server console:

# zabbix_get -s 192.168.0.50 -p 10050 -k «computer.windows.user»

TECHEXPERT\administrator

As you can see, The Zabbix server is able to remotely get this information from the Agent.

Tutorial — Zabbix UserParameter Configuration

Now, we need to access the Zabbix server dashboard and add the Windows computer as a Host.

Open your browser and enter the IP address of your web server plus /zabbix.

In our example, the following URL was entered in the Browser:

• http://35.162.85.57/zabbix

On the login screen, use the default username and default password.

• Default Username: Admin
• Default Password: zabbix

After a successful login, you will be sent to the Zabbix Dashboard.

zabbix dashboard

On the dashboard screen, access the Configuration menu and select the Host option.

zabbix add host

On the top right of the screen, click on the Create host button.

On the Host configuration screen, you will have to enter the following information:

• Host Name — Enter a Hostname to monitor.
• Visible Hostname — Repeat the hostname.
• New group — Enter a name to identify a group of similar devices.
• Agent Interface — Enter the IP address of the Hostname.

Here is the original image, before our configuration.

zabbix linux - Antes

Here is the new image with our configuration.

Zabbix Windows 7

Click on the Add button to include this host on the Zabbix database.

On the dashboard screen, access the Configuration menu and select the Host option.

zabbix add host

Locate and click on the hostname that you created before.

In our example, we selected the hostname: WINDOWS7

On the Host properties screen, access the Applications tab.

Zabbix Windows Service Application menu

On the top right part of the screen, click on the Create application button.

Zabbix Windows7 Application

On the Host applications screen, create a new application named Windows.

After finishing the Application creation, access the Items tab.

Zabbix Item Tab

On the top right part of the screen, click on the Create item button.

On the Item creation screen, you need to configure the following items:

• Name: Enter an identification to the Userparameter item.
• Type: Zabbix Agent
• Key: A custom key to your Userparameter
• Type of Information: Our example uses Text
• Update interval: 60 Seconds
• Application: Windows

Zabbix monitor Userparameter

Click on the Add button and finish the Item creation.

Wait 5 minutes.

In order to test your configuration, access the Monitoring menu and click on the Latest data option.

Zabbix Latest data

Use the filter configuration to select the desired hostname.

In our example, we selected the hostname WINDOWS7.

Click on the Apply button.

Zabbix filter windows 7

You should be able to see the results of your Userparameter monitoring using Zabbix.

Congratulations! You have configured the Zabbix Userparameter feature.

VirtualCoin CISSP, PMP, CCNP, MCSE, LPIC22019-06-05T09:27:03-03:00

Related Posts

Page load link

This website uses cookies and third party services.

Ok

Иногда может возникнуть необходимость мониторить такие параметры Windows, с которыми по умолчанию zabbix не умеет работать. Если нужное значение можно получить с помощью powershell команды или скрипта, то можно довольно просто научить zabbix это делать посредством функционала пользовательских параметров.

В общем виде задача состоит из трех этапов:

  1. создаем PS скрипт и сохраняем его
  2. настраиваем конфигурационный файл zabbix-агента (не забываем перезапустить агента)
  3. создаем необходимый item и триггер в zabbix

1) На первом шаге создаем и сохраняем скрипт. Возможно, потребуется настроить Powershell Execution Policy, но на серверных ОС она уже должна быть в нужном положении.

Подробно о Execution Policy я писал в данной статье.

2) В файле конфигурации агента (zabbix_agentd.win.conf или zabbix_agentd.conf) ищем закомментированный параметр #UserParameter, вместо него вставляем:

UserParameter = parameter_name, powershell -File "C:\Scripts\some-script.ps1"

где parameter_name — произвольное имя вашего параметра, а ключ -File указывает путь к powershell скрипту

Для удобства правки, конфигурационный файл можно открыть в редакторе Notepad++ или подобном

Чтобы не создавать дополнительные файлы скриптов, а также, если скрипт или команда получения пользовательского параметра не слишком громоздкие, можно писать всю конструкцию прямо в конфигурационном файле. Тогда вместо ключа -File нужно будет указать ключ -Command. Пример приведен ниже. В нем идет получение количества запущенных виртуальных машин.

UserParameter = parameter_name, powershell -Command "(Get-VM | Where state -eq 'Running').count"

По окончанию редактирования и сохранения файла, не забываем перезапустить zabbix-агент

net stop "zabbix agent"
net start "zabbix agent"

3) В zabbix при создании нового элемента данных (item) имя пишем произвольное, а вот ключ должен совпадать с именем параметра из конфигурационного файла, который мы прописали ранее (в моем случае, я назвал параметр «tsdrainmode» и в п.2 вместо parameter_name нужно написать то же самое)

Настраиваем поле «тип информации» исходя из наших потребностей (типа получаемых данных из скрипта).

In this article, we will look at configuring the Zabbix Agent to retrieve monitoring data from PowerShell scripts. Let’s look at two PowerShell scripts to get some data into Zabbix. The first returns the number of active RDP user sessions on a Windows RDS server, and the second returns the number of days since Windows updates were last installed on the server.

The Zabbix agent has two features for data retrieval from an external PowerShell script:

  • The UserParameter option in the agent’s configuration file allows you to execute PowerShell code. If you use this option, you must enable the UserParameter option and copy the PS1 script file to each Windows host.
  • You can run PowerShell scripts using system.run. This allows you to specify the PowerShell script directly in the Zabbix web interface and can run arbitrary commands.

Let’s start with an example of running a PowerShell script using UserParameter. Suppose you already have a Zabbix agent installed and configured on your Windows computer.

Create a simple PowerShell script that returns the number of active RDP sessions and save it to a file: C:\Program Files\Zabbix Agent 2\Script\GetActiveRDPSessionCount.ps1

$RDSsessions= qwinsta |ForEach-Object {$_ -replace "\s{2,18}",","} | ConvertFrom-Csv
$RDSActiveSessions=@($RDSsessions| where State -eq 'Active').count
Write-Host $RDSActiveSessions

Now edit the Zabbix agent configuration file (zabbix_agent2.conf) and add the option:

UserParameter=ActiveRDSSessions,powershell -NoProfile -ExecutionPolicy bypass -File "C:\Program Files\Zabbix Agent 2\Script\GetActiveRDPSessionCount.ps1"

Enable UserParameter parameter with PowerShell script in Zabbix agent

The -ExecutionPolicy bypass parameter allows you to run a PowerShell script without changing the PowerShell execution policy settings.

Restart the Zabbix Agent service:

Get-Service 'Zabbix Agent 2'| Restart-Service -force

Make sure that the Zabbix agent can receive the data from the new parameter. Use the built-in zabbix-get command line tool to test the agent:

zabbix_get -s 127.0.0.1 -p 10050 -k ActiveRDSSessions

In this example, Zabbix ran a PowerShell script and returned that there were two RDP user sessions active on the host.

zabbix_get: get data from UserParameter

PowerShell code is usually quite slow to run. Therefore, you need to increase the timeout in the agent configuration from the default 3 seconds to 20 seconds (set Timeout=20), otherwise, Zabbix will return an error when receiving data from a script:

ZBX_NOTSUPPORTED: Timeout while executing a shell script.

When running the command, you can see another error:

zabbix_get [4292]: Get value error: ZBX_TCP_READ() failed: [0x00002746] An existing connection was forcibly closed by the remote host.
zabbix_get [4292]: Check access restrictions in Zabbix agent configuration.

If so, allow to accept local connections in the agent configuration file (zabbix_agent2.conf). Add the 127.0.0.1 address.

Server=192.168.10.100,127.0.0.1

Then you can add a new parameter to your template. Go to the Items tab and set:

  • Name: Number of active RDS sessions
  • Type: Zabbix Agent (active)
  • Key: ActiveRDSSessions
  • Type of information: Numeric (unsigned)
  • Update Interval: 1m
  • History storage period: 90d
  • Trend storage period: 365d

Go to Monitoring -> Latest data and check that Zabbix is now receiving the value from the PowerShell script.

Now, let’s allow PowerShell scripts to be run using system.run. This method is less secure because you can run any command on the remote host via Zabbix. However, it is convenient because it allows to configure PowerShell scripts directly from the Zabbix web interface.

Enable the following parameter in the configuration file of the agent:

AllowKey=system.run[*]

Then create a new Zabbix Item:

  • Name: Days since last Windows Update installation
  • Type: Zabbix Agent
  • Key: system.run[powershell.exe -command "(New-Timespan -Start ((New-Object -com 'Microsoft.Update.AutoUpdate').Results|Select -ExpandProperty LastInstallationSuccessDate) -End (Get-Date)).days"]
  • Type of information: Numeric (unsigned)
  • Update Interval: 1d
  • History: 180d
  • Trenfd: 365d

This command returns the number of days since the last time a security update was installed on Windows.

So we have looked at how you can get data into Zabbix from PowerShell scripts running on Windows.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Winpcap windows 10 не устанавливается
  • Как отключить запрос пароля в windows 10 при загрузке или блокировке компьютера
  • Переустановка windows на компьютере dell
  • Как работает портфель в windows 10
  • Windows 7 ultimate by feniks x64 2014 rus