Задача: Разобрать, как посредством 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.