Время на прочтение10 мин
Количество просмотров155K
Если нам нужно мониторить состояние серверов и прочих компьютеризированных рабочих мест при помощи Zabbix, то это можно сделать двумя способами.
Первый способ — это при помощи SNMP-запросов, с отправкой которых Zabbix замечательно справляется. Так можно вытащить и загрузку сетевых интерфейсов, и загрузку процессора, памяти. Поверх этого, производители сервера могут выдать нам по SNMP еще много информации о состоянии железа.
Второй заключается в использовании Zabbix агента, который мы будем запускать на наблюдаемой системе. Список наблюдаемых параметров включает в себя как и такие простые вещи, как загрузка процессора, использование памяти, так и более хитрые, такие как чтение текстовых лог-файлов с поддержкой ротации или отслеживание факта изменения любого файла. Можно даже в качестве параметра использовать вывод любой произвольной команды на системе. Возможности Zabbix агента растут от версии к версии.
Что делать, если того, что мы хотим контролировать через 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.
Для этого нажимаем «Создать элемент данных»
и затем выставляем ключ такой же, как указали в конфиг-файле, а тип Zabbix агент:
- Перезагрузить Zabbix агента, чтобы изменения в конфиг-файле вступили в силу
Наблюдаем результат в последних данных:
Мониторинг SMART через UserParameter
Пример выше имеет мало практического применения, учитывая, что уже итак существует стандартный ключ system.users.num, который делает ровно тоже самое.
Так что теперь рассмотрим пример, который уже больше будет походить на реалистичный.
Если нам интересно мониторить момент, когда пора планово менять жесткие диски, то есть два варианта:
- Если диски за аппаратным RAID-контроллером, то, как правило, сами диски операционная система «не видит». Поэтому ищем способы как вытащить информацию о состоянии жестких дисков через утилиты или SNMP-сабагента, которые нам любезно предоставил(или не предоставил) производитель RAID-контроллера. Для каждой отдельной серии контроллеров свой путь до этой информации.
- Если речь идет о просто рабочих станциях, серверах с софтовом 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.
Создадим для второго диска элемент данных:
И через некоторое время сможем наблюдать результат в последних данных:
Мониторинг 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:
Обратите внимание на ключ и на фильтр, ({#SMART_ENABLED}=1) благодаря последнему будут добавляться только те обнаруженные диски, которые поддерживают SMART. Теперь мы можем переписать два наших элемента данных для дисков sda и sdb в один прототип элементов данных, просто заменив имя диска на макрос {#DISKNAME}:
Последнее, перед тем, как 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:
Добавим триггер:
и действие, которое будет отправлять e-mail уведомление:
Весь процесс мониторинга выглядит так: каждый час запускается скрипт 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"
Перезапустите службу 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 сессии пользователей.
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
Перейдите в 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.
My collection of scripts for zabbix agents on Windows and UNIX hosts.
All scripts are designed to use with passive checks and most of them are written on PowerShell.
Appropriate templates are also included.
Put the scripts to folders you like and edit paths to files at the beginning of all scripts.
Add user parameters to zabbix agent configuration file.
Import templates to Zabbix (all templates were tested on Zabbix 2.2).
On Linux hosts you also have to add zabbix user to a sudoers list for running external executables from scripts.
I just created /etc/sudoers.d/zabbix_sudo file and added to it next two lines:
Defaults:zabbix !requiretty
zabbix ALL=(ALL) NOPASSWD: /opt/MegaRAID/CmdTool2/CmdTool264
# raid_check.ps1
UserParameter=intel.raid.physical_disk[*],powershell -File "C:\Zabbix\scripts\raid_check.ps1" -mode pdisk -item $4 -adapter $1 -enc $2 -pdisk $3
UserParameter=intel.raid.logical_disk[*],powershell -File "C:\Zabbix\scripts\raid_check.ps1" -mode vdisk -item $3 -adapter $1 -vdisk $2
UserParameter=intel.raid.bbu[*],powershell -File "C:\Zabbix\scripts\raid_check.ps1" -mode bbu -item $2 -adapter $1
UserParameter=intel.raid.adapter[*],powershell -File "C:\Zabbix\scripts\raid_check.ps1" -mode adapter -item $2 -adapter $1
# raid_discovery.ps1
UserParameter=intel.raid.discovery.pdisks,powershell -File "C:\Zabbix\scripts\raid_discovery.ps1" -mode pdisk
UserParameter=intel.raid.discovery.vdisks,powershell -File "C:\Zabbix\scripts\raid_discovery.ps1" -mode vdisk
UserParameter=intel.raid.discovery.bbu,powershell -File "C:\Zabbix\scripts\raid_discovery.ps1" -mode bbu
UserParameter=intel.raid.discovery.adapters,powershell -File "C:\Zabbix\scripts\raid_discovery.ps1" -mode adapter
# apc_check.ps1
UserParameter=apc.ups[*],powershell -File "C:\Zabbix\scripts\apc_check.ps1" -item $1
#UserParameter=apc.ups[*],C:\Zabbix\scripts\apc_check.cmd $1
# nut_check.ps1
UserParameter=nut.discovery,powershell -File "C:\Zabbix\scripts\nut_check.ps1" -mode discovery
UserParameter=nut.ups[*],powershell -File "C:\Zabbix\scripts\nut_check.ps1" -mode status -upsname $1 -item $2
# raid_check.pl
UserParameter=intel.raid.physical_disk[*],/usr/bin/perl -w /etc/zabbix/scripts/raid_check.pl -mode pdisk -item $4 -adapter $1 -enclosure $2 -pdisk $3
UserParameter=intel.raid.logical_disk[*],/usr/bin/perl -w /etc/zabbix/scripts/raid_check.pl -mode vdisk -item $3 -adapter $1 -vdisk $2
UserParameter=intel.raid.bbu[*],/usr/bin/perl -w /etc/zabbix/scripts/raid_check.pl -mode bbu -item $2 -adapter $1
UserParameter=intel.raid.adapter[*],/usr/bin/perl -w /etc/zabbix/scripts/raid_check.pl -mode adapter -item $2 -adapter $1
# raid_discovery.pl
UserParameter=intel.raid.discovery.pdisks,/usr/bin/perl -w /etc/zabbix/scripts/raid_discovery.pl -mode pdisk
UserParameter=intel.raid.discovery.vdisks,/usr/bin/perl -w /etc/zabbix/scripts/raid_discovery.pl -mode vdisk
UserParameter=intel.raid.discovery.bbu,/usr/bin/perl -w /etc/zabbix/scripts/raid_discovery.pl -mode bbu
UserParameter=intel.raid.discovery.adapters,/usr/bin/perl -w /etc/zabbix/scripts/raid_discovery.pl -mode adapter
# apc_check.sh
UserParameter=apc.ups[*],/etc/zabbix/scripts/apc_check.sh $1
Прочитано: 13 340
Задача: Разобрать, как посредством Zabbix–сервиса (Центр единого мониторинга за вверенной инфраструктурой) запускать PowerShell скрипты с Windows системы с целью получения необходимой информации: события, значения, текст.
В роли Windows системы выступит: Windows 7 Pro SP1 x86, где powershell был обновлен с версии 2.0 до версии 5.0.
В роли Zabbix выступит релиз 3.2.1 развернутый и применяемый в повседневности на Ubuntu Trusty Server amd64.
Перво наперво нужно разрешить выполнение ps1 скриптов на системе Windows, т. к. по умолчанию в PowerShell включена максимальная политика безопасности, которая позволяет выполнять команды PowerShell в командной строке, но не позволяет в той же командной строке выполнить скрипт с командами PowerShell. Можно разрешить выполнение PowerShell скриптов если Windows системы объединены в домен соответствующей групповой политикой, либо же единичным запуском вот такого вот bat-файла и обязательно с правами администратора:
%systemroot%\system32\WindowsPowerShell\v1.0\powershell -Command Set-ExecutionPolicy RemoteSigned
После этого запуск ps1 скриптов будет отрабатываться и не прерываться ошибкой.
Скрипт на PowerShell который вычисляет размер свободного места на логическом диске C:
$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object Size, FreeSpace
Write-Host ("{0}" -f [math]::truncate($disk.FreeSpace / 1GB))
Сохраняю его на диске c:\script\diskc_free_space.ps1
Затем на клиентском компьютере в конфигурационном файле агента Zabbix прописываем:
LogFile=c:\zabbix_agentd.log
LogFileSize=10
DebugLevel=2
Server=10.7.8.121
ListenPort=10050
Hostname=W7X86
EnableRemoteCommands=1
LogRemoteCommands=1
Timeout=30
UserParameter=diskcfreespace[*],PowerShell.exe -nologo "C:\script\diskc_free_space.ps1" "diskcfreespace"
После перезапускаю службу агента:
C:\Windows\system32>net stop "Zabbix Agent" && net start "Zabbix Agent"
После перехожу в домашний каталог где установлен Zabbix агент и проверяю, получает ли агент информацию через параметр:
C:\Program Files\zabbix>zabbix_get.exe -s 127.0.0.1 -p 10050 -k diskcfreespace
zabbix_get.exe [624]: Get value error: ZBX_TCP_WRITE() failed: [0x00002745] ╨Я╤А
╨╛╨│╤А╨░╨╝╨╝╨░ ╨╜╨░ ╨▓╨░╤И╨╡╨╝ ╤Е╨╛╤Б╤В-╨║╨╛╨╝╨┐╤М╤О╤В╨╡╤А╨╡ ╤А╨░╨╖╨╛╤А╨▓╨░╨╗╨░
╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╜╨╛╨╡ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╕╨╡.
А если просто запустить и cmd.exe то строка отрабатывает:
C:\Program Files\zabbix>PowerShell.exe -nologo "C:\script\diskc_free_space.ps1"
15
Ладно, переключаюсь на сервер Zabbix и проверяю обращение к агенту с целью получение информации со скрипта на PowerShell. Создаю элемент данных в шаблоне Template OS Windows
Name: diskcfreespace
Type: Zabbix agent
Key: diskcfreespace
Host interface: 10.7.8.97:10050
Type of information: Numeric (unsigned)
Data type: Decimal
Units: Gb
Update interval (in sec): 60
History storage period (in days): 7
Trend storage period (in days): 365
После нажимаю Update и через некоторое время перейдя: Monitoring — Latest Data — отсортировав по хосту на котором я проверяю работоспособность извлечения информации через powershell скрипт, а именно:
- Hosts = W7X86
- Name = diskcfreespace
и нажимаю кнопку Apply, вот что я вижу, есть последняя временная проверка, последнее значение и возможность перейти щелкнув на Graph к графику где будут представлены изменения с учетом времени постановления на мониторинг
Перехожу по гиперссылке Graph и наблюдаю, как возвращаются значения от выполнения скрипта на рабочей станции:
Представленный скачок изменения количества свободного места был сымитирован командой создания на рабочей станции W7X86 файл на один гигабайт:
C:\Windows\system32>fsutil file createnew c:\file.txt 1000000000
Файл c:\file.txt создан
Итого, я для себя в первую очередь разобрал, как задействовать powershell на рабочих станциях и серверных системах, а не как ранее bat скрипты. Хотя можно и комбинировать, главное решить поставленную задачу, а инструмент может быть любым. На этом я пока прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.
Scripts in Zabbix can be used to perform custom monitoring checks, collect and process data from external sources, and automate tasks based on monitoring events. Zabbix supports a variety of scripting languages, including Bash, Python, Perl, and Ruby.
In this article, we’ll explore Zabbix alert scripts, how to create them, and how to configure the Zabbix agent to work with them.
Configuring Zabbix Agent to Work with remote commands.
First, we’ll need to configure the Zabbix agent to work with scripts:
- Log in to the host running the agent.
- Edit the zabbix_agentd.conf:
- Set the «EnableRemoteCommands» parameter to 1 to let the agent execute remote commands.
- And set the «UnsafeUserParameters» parameter to 1 to allow the Zabbix agent to execute user scripts.
- Optionally you can switch “LogRemoteCommands” on if you want to keep the logs.
Restart the Zabbix agent service to apply the changes.
Creating Zabbix Alert Scripts
To create an alert script in Zabbix, follow these steps:
Go to the «Administration» → «Scripts» in the left-hand side menu. Click on «Create Script» in the top right corner of the screen. Give your script a name, select the scope option you want to use, fill out the information needed, which may include things like script parameters, command arguments, or media type settings, and click “Add”.
Now let’s have a more detailed look into some of the options, you can choose the Scope and the type of the script.
Scopes of the script
Action operation scripts:
These are scripts that are executed as part of an active operation. Action operation scripts are executed automatically and can be used to perform tasks such as sending notifications, running scripts on remote hosts, or updating data in external systems. These scripts are associated with a specific action and are executed whenever that action is triggered.
Manual host action scripts:
These are scripts that can be executed manually on a specific host. They are associated with a specific host and can be used to perform tasks such as restarting a service, running a diagnostic command, or performing a backup. Manual host action scripts are executed manually by a user from the Zabbix web interface or API, and can only be executed on the host that they are associated with.
Manual event action scripts:
These are scripts that can be executed manually on a specific event. They are associated with a specific event and can be used to perform tasks such as sending a custom notification, updating a ticketing system, or triggering a workflow. Manual event action scripts are executed manually by a user from the Zabbix web interface or API, and can only be executed on the event that they are associated with.
Script types
Webhook scripts: A webhook is a way for one application to provide data to another application in real-time. Webhook scripts in Zabbix can be used to send data to an external system, such as a chat application or incident management platform. To configure a webhook script in Zabbix, you’ll need to create a new media type with the appropriate settings (such as the webhook URL and any required headers or authentication), and then associate that media type with an action.
Script type: Zabbix also supports custom scripts, which can be written in various scripting languages (such as Bash, Perl, Python, or PowerShell) and executed in different scopes, depending on where the script is intended to run. There are three different execution scopes for custom scripts which defines where can they be used:
- Zabbix agent
- Zabbix server proxy
- Zabbix server
To configure a custom script in Zabbix, you’ll need to create a new script with the appropriate code and language settings. You’ll then be able to use that script in various contexts, such as in an action or in a custom item key.
SSH scripts: SSH scripts in Zabbix can be used to execute commands or scripts on a remote host over SSH. To configure an SSH script in Zabbix, you’ll need to create a new SSH key pair and add the public key to the remote host’s authorized_keys file. You’ll then need to create a new script in Zabbix that specifies the command to be executed on the remote host, along with the necessary SSH connection details.
Telnet scripts: Telnet is a network protocol that provides a virtual terminal connection to a remote host. To configure a Telnet script in Zabbix, you’ll need to create a new Telnet item in the Zabbix configuration (on any host of your choosing, it’s an agentless check which can point to any IP, which can be useful for monitoring hosts unable to run agent), specifying the hostname or IP address of the remote host, as well as the port number and any necessary login credentials. You’ll then need to create a new script in Zabbix that specifies the command to be executed on the remote host.
IPMI scripts: IPMI (Intelligent Platform Management Interface) is a standard for remote server management that allows administrators to monitor and manage hardware components such as power supplies, fans, and temperature sensors. IPMI scripts in Zabbix can be used to execute IPMI commands on a remote server. To configure an IPMI script in Zabbix, you’ll need to enable IPMI on the remote server and configure the necessary network settings. You’ll then need to create a new script in Zabbix that specifies the IPMI command to be executed, along with the necessary connection details.
Examples of Zabbix Alert Scripts
Once you have created your alert script, you can configure it to execute specific actions when an alert is generated. For example, you can configure a script to restart a service, send an email notification, or execute a command on a remote server.
Here are some examples of alert scripts from the basic Zabbix configuration:
Detect operating system: This script can be used to detect the version of the operating system on the host
sudo /usr/bin/nmap -O/usr/bin/traceroute {HOST.CONN} {HOST.CONN}
Ping: speaks for itself
ping -c 3 {HOST.CONN}; case $? in [01]) true;; *) false;; esac
Service restart: restarts a service on a Windows host discovered by the autodiscovery function
net start {TRIGGER.DESCRIPTION}
Conclusion
We looked into configuring Zabbix scripts, overall, configuring these scripts requires some technical knowledge of the protocols and technologies involved, as well as an understanding of Zabbix’s scripting and automation capabilities. However, with the right configuration, these scripts can provide powerful automation and integration capabilities for your Zabbix monitoring system.
You may be also interested in
- Get Ubuntu cloud server for Zabbix
- Installing Zabbix on Ubuntu
- Configuring Zabbix hosts and creating items