Hyper-V от 2012 RUS

Microsoft Hyper-V — система аппаратной виртуализации для x64-систем на основе гипервизора
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Hyper-V от 2012 RUS

Сообщение Артём Мамзиков »

Microsoft Hyper-V — система аппаратной виртуализации для x64-систем на основе гипервизора

Шаблоны взяты с Zabbix Share Hyper-V
Далее переведены и объеденные в 1 шаблон из 5 шаблонов.
О Пяти шаблонах какие в них есть проверки
Показать
Windows_HyperV_Host_RUS
Через скрипт PowerShell Replica.ps1
Нагрузка на Центральный процессор (Логический, Виртуальный, удаленном узле; код: гипервизора, гостевой);
Количество логических/виртуальных процессоров;
Число разделов HyperV Partitions;
Кол-во критических виртуальных машин;
Виртуальный коммутатор полученные/отправленные байты/с;
Реплика;
Состояние службы.


Microsoft Hyper-V Host-RUS
Hyper-V: Windows server 2008 R2 или выше, PowerShell 3 через скрипт hyperv_host.ps1
гость/root процессора,
оперативной памяти,
коэффициента умножения частоты процессора/оперативной памяти,
виртуальных сетевых адаптеров и коммутаторов,
хранения виртуальной машины и инвентаризации сети:число ВМ,
Службы,
Здоровье
Производительность экранной системы:
Процессор,
Память,
Сеть,
Независимый от VHDX язык ОС
Настройка настройка по пользовательским макросам


Volumes Cluster HyperV RUS
Через скрипт powershell win_clustersv.ps1
Кластерная система\Файловая система

Hyper-v Replication-RUS
-ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica_discover.ps1"
Репликация (здоровье и последняя)


Сервер Hyper-V-RUS
C:\Zabbix\Scripts\zbx-hyperv.ps1" $1
служба
репликация(здоровье,режим,состояние)
служба интеграции(статус, версия)
ЦП (использование)
Память(назначенная)
состояние
numa колво узлов/сокетов
время работы

UserParameter=replica.state,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\Replica.ps1" $1
UserParameter=hyperv.host[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_host.ps1" -ActionType "$1" -Key "$2" -Value "$3"
UserParameter=hyperv_replica[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica.ps1" $1 $2
UserParameter=hyperv_replica_discover,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica_discover.ps1"
UserParameter=windowscsvfs.discovery[*],powershell -NoProfile -ExecutionPolicy Bypass -File C:\zabbix\Scripts\win_clustersv.ps1 $1
UserParameter=ms.hyperv[*],powershell -NoProfile -NoLogo -File "C:\Zabbix\Scripts\zbx-hyperv.ps1" $1

Сперва все шаблоны раздельно

1.Hyper-V с состоянием репликации
Hyper-V с состоянием репликации
Показать
Переведен версии 4.4 Скачать
Hyper-V с состоянием репликации.zip
Hyper-V с состоянием репликации.zip
(28.02 КБ) 5 скачиваний
https://share.zabbix.com/virtualization ... tion-state
Через скрипт PowerShell Replica.ps1

Нагрузка на Центральный процессор (Логический, Виртуальный, удаленном узле; код: гипервизора, гостевой);
Количество логических/виртуальных процессоров;
Число разделов HyperV Partitions;
Кол-во критических виртуальных машин;
Виртуальный коммутатор полученные/отправленные байты/с;
Реплика;
Состояние службы.

Коллекция стандартных метрик Hyper-V включала Get-VMReplication Health Status с триггером.
Как пользоваться
Для сбора статуса репликации вы должны добавить в zabbix_agentd.win.conf в строку # USER-DEFINED MONITORED PARAMETERS #:

UserParameter=replica.state,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\Replica.ps1" $1

и поместите файл Replica.ps1 в папку C:\scripts\ или настройте путь к файлу

Хорошо знать проблемы:
HOST: replica.state "не поддерживается: значение"
Get-VMReplication: операция на компьютере 'advlb2' завершилась неудачно: клиент WinRM не может обработать запрос.
Если схема проверки подлинности отличается от Kerberos или клиентский компьютер не присоединен к домену, необходимо использовать транспорт HTTPS или добавить конечный компьютер
в параметр конфигурации TrustedHosts. Используйте winrm.cmd для настройки TrustedHosts. Обратите внимание, что компьютеры в списке TrustedHosts могут не пройти проверку подлинности.
Вы можете получить дополнительную информацию об этом, выполнив следующую команду: winrm help config.
Добавьте соответствующее разрешение учетной записи в файл Replica.ps1, чтобы запустить его.
По умолчанию для выполнения достаточно локальной учетной записи службы.

Истекло время выполнения скрипта
На Zabbix сервере отредактируйте zabbix_server.conf и увеличьте значение TimeOut до 10

Что внутри
Вывод сценария PS дает вам два значения:

1 - if Replica.State is "Normal"
2 - if Replica State is "Critical"

1 - если Replica.State - "Нормальный"
2 - если состояние реплики «Критическое»

Для состояния 2 Триггер установлен с последним временем (30)

Версия для Windows
Протестировано для Windows Server 2012 Windows Server 2016, 2019


Сценарий написан в обратном порядке.

У тебя есть:

$replica = Get-VMReplication | select Health
if ( $replica.Здоровье -эквалайзер "Нормальный"){
запись-хост 1
}elseif ( $replica.Здоровье -эквалайзер "Критический"){
запись-хост 2
}

Если даже 1 из виртуальных машин имеет нормальное состояние репликации, она вернет 1, что плохо, если есть 1 или более в критическом состоянии.

Должно быть:

$replica = Get-VMReplication | select Health
if ( $replica.Здоровье -эквалайзер "Критический"){
запись-хост 2
}elseif ( $replica.Здоровье -эквалайзер "Нормальный"){
запись-хост 1
}

Таким образом, если даже 1 виртуальная машина критична, она вернет 2, в противном случае она вернет 1. Хотя нет никакой опции для "Предупреждения", которая, если вся репликация приостановлена, все виртуальные машины находятся в состоянии "Предупреждения". Возможно, вам понадобится write-host 2 или write-host 1 в зависимости от того, как вы относитесь к warning vs normal vs crtiical.

$replica = Get-VMReplication | select Health
if ( $replica.Здоровье -эквалайзер "Критический"){
запись-хост 2
}elseif ( $replica.Здоровье -ЭК "предупреждение"){
запись-хост 2
}elseif ( $replica.Здоровье -эквалайзер "Нормальный"){
запись-хост 1
}

Сценарий PS в этом шаблоне имеет проблему. Он возвращает только состояние реплики первой виртуальной машины.
Я думаю, что это лучше:

$replica = Get-VMReplication | select Health
$retval=1
для каждого ($replica_item в $replica) {
if ( $replica_item.Здоровье -не "Нормальное"){
$retval=2
}
}
write-host $retval

Привет, спасибо за то, что вы заметили, проверка во временном цикле дает вам последний ответ, если раньше было что-то не так, и вы возвращаетесь в нормальное состояние, вы не получаете последнее состояние. Это зависит от ваших потребностей
Скрипт Replica.ps1
Показать
$replica = Get-VMReplication | select Health
if ( $replica.Health -eq "Critical"){
write-host 2
}elseif ( $replica.Health -eq "Normal"){
write-host 1
}

2. Microsoft Hyper-V Host
Microsoft Hyper-V Host
Показать

Скачать
Microsoft Hyper-V Host.zip
Microsoft Hyper-V Host.zip
(1.17 МБ) 3 скачивания
Шаблон Microsoft Hyper-V Host (imicus) Версия: 1.0
https://share.zabbix.com/virtualization ... per-v-host
Hyper-V: Windows server 2008 R2 или выше, PowerShell 3 через скрипт hyperv_host.ps1

UserParameter=hyperv.host[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_host.ps1" -ActionType "$1" -Key "$2" -Value "$3"

Мониторинг и LLD :
гость/root процессора,
оперативной памяти,
коэффициента умножения частоты процессора/оперативной памяти,
виртуальных сетевых адаптеров и коммутаторов,
хранения виртуальной машины и инвентаризации сети:число ВМ,
Службы,
Здоровье
Производительность экранной системы:
Процессор,
Память,
Сеть,
Независимый от VHDX язык ОС
Настройка настройка по пользовательским макросам
Вы можете анализировать все данные о производительности общего хоста и виртуальных машин

Шаблон для мониторинга узла из отказоустойчивого кластера Microsoft с ролью Hyper-V или автономного Hyper-V.

Прочитайте это до:
Основная концепция
https://blogs.msdn.microsoft.com/tvoell ... rformance/

ЦП
https://blogs.technet.microsoft.com/nea ... mance-cpu/

Память
https://blogs.technet.microsoft.com/nea ... ce-memory/

Представление
https://docs.microsoft.com/en-us/window ... ottlenecks

Классы WMI
http://wutils.com/wmi/root/cimv2/win32_perfrawdata/

(itmicus.ru)
Скрипт hyperv_host.ps1
Показать

#requires -version 3

<#
.СИНОПСИС SYNOPSIS
Этот скрипт часть Zabbix
Microsoft Hyper-V
Требования PowerShell 3.0 или выше
.ОПИСАНИЕ DESCRIPTION
Это использование sricpt для LLD и trapper
.ПАРАМЕТР <ActionType>
Тип действия: dsicover, get или other (других)
.ПАРАМЕТР <Ключ>
Ключ - аттирбют для
.ПАРАМЕТР <Значение>
Значение VAR для ключей, могут быть одно-или многократно
.ВХОДНЫЕ INPUTS
Ввести 3 переменные

.ВЫХОДЫ
Вывод в формате JSON для Zabbix
.ПРИМЕЧАНИЯ
Версия: 1.0
Автор: p.kuznetsov@itmicus.ru
Дата создания: 25/05/2018
Назначение/изменение: первоначальное развитие сценария

.Пример
hyperv_active.пс1 -ActionType "$1" ключ "$2" -Значение "$3"
hyperv_active.ps1 -ActionType "$1" -Key "$2" -Value "$3
#>

Param(
[Parameter(Mandatory = $true)][String]$ActionType,
[Parameter(Mandatory = $true)][String]$Key,
[Parameter(Mandatory = $false)][String]$Value
)

$ActionType = $ActionType.ToLower()
$Key = $Key.ToLower()
$Value = $Value.ToLower()


# это необходимость в правильных кириллических символах в старой ОС
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8


if ($ActionType -eq "discover") {
# Поиск обнаружение виртуальные коммутаторы hyper-v
if ($Key -eq "vsw") {
$result_json = [pscustomobject]@{
'data' = @(
get-wmiobject Win32_PerfRawData_NvspSwitchStats_HyperVVirtualSwitch | ForEach-Object {
$Hyperv_virtualswitch_name = $_.Name;
[pscustomobject]@{
'{#VIRTUAL_SWITCH_NAME}' = $Hyperv_virtualswitch_name;
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)
}

# Поиск обнаружение физический сетевой адаптер для виртуальных коммутаторов hyper-v
if ($Key -eq "va") {

$filter = "NetEnabled='True' and PhysicalAdapter='True'
AND PNPDeviceID LIKE 'ROOT\\%'"

$result_json = [pscustomobject]@{
'data' = @(
get-wmiobject win32_networkadapter -filter $filter | ForEach-Object {
$HYPERV_ADAPTER_NAME = $_.NetConnectionID;
$HYPERV_ADAPTER_INTERFACEINDEX = $_.InterfaceIndex;
Get-WmiObject Win32_PnPEntity -Filter ("PNPDeviceID='$($_.PNPDeviceID)'" -Replace '\\', '\\') | ForEach-Object {
[pscustomobject]@{
'{#HYPERV_NETWORKADAPTER_NAME}' = $HYPERV_ADAPTER_NAME;
'{#HYPERV_NETWORKADAPTER_PERF}' = $_.Name.Replace("/", "_").Replace("#", "_").Replace("(", "[").Replace(")", "]")
'{#HYPERV_NETWORKADAPTER_INTERFACEINDEX}' = $HYPERV_ADAPTER_INTERFACEINDEX
}
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)
}

# Поиск Обнаружение hyper-v не кластеризованных виртуальных машин
if ($Key -eq "vm") {
$result_json = [pscustomobject]@{
'data' = @(
get-vm | Where-Object {$_.IsClustered -eq $False} | ForEach-Object {
$vm_name = $_.Name;
[pscustomobject]@{
'{#VM_NAME}' = $vm_name;
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)
}

# Поиск Обнаружение сетевые адаптеры некластеризованной виртуальной машины
if ($Key -eq "vm_na") {
$vms = get-vm | Where-Object {$_.IsClustered -eq $False} | Select-Object Name
$networkadapters = Get-WmiObject Win32_PerfRawData_NvspNicStats_HyperVVirtualNetworkAdapter | Select-Object Name
$result = @()
foreach ($networkadapter in $networkadapters) {
foreach ($vm in $vms) {
if ($networkadapter.Name -Match $vm.Name) {
$data = New-Object PSCustomObject
$data | Add-Member -type NoteProperty -name Perf -Value $networkadapter.Name
$data | Add-Member -type NoteProperty -name Name -Value $vm.Name
$result += $data
}
}
}

$result_json = [pscustomobject]@{
'data' = @(
$result | ForEach-Object {
[pscustomobject]@{
'{#VM_NETWORKADAPTER_NAME}' = $_.Name;
'{#VM_NETWORKADAPTER_PERF}' = $_.Perf;
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)
}

# Поиск Обнаружения в некластеризованных устройствах хранения виртуальной машины
if ($Key -eq "vm_sd") {
$vms = get-vm | Where-Object {$_.IsClustered -eq $False} | Select-Object Name
$networkadapters = Get-WmiObject Win32_PerfFormattedData_Counters_HyperVVirtualStorageDevice | Select-Object Name
$result = @()
foreach ($networkadapter in $networkadapters) {
foreach ($vm in $vms) {
if ($networkadapter.Name -Match $vm.Name) {
$data = New-Object PSCustomObject
$data | Add-Member -type NoteProperty -name Perf -Value $networkadapter.Name
$data | Add-Member -type NoteProperty -name Name -Value $vm.Name
$result += $data
}
}
}

$result_json = [pscustomobject]@{
'data' = @(
$result | ForEach-Object {
[pscustomobject]@{
'{#VM_STORAGEDEVICE_NAME}' = $_.Name;
'{#VM_STORAGEDEVICE_PERF}' = $_.Perf;
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)

}
}

if ($ActionType -eq "get") {

# Получить данные для физического сетевого адаптера по имени
if ($Key -eq "host_stat") {
if ($Value -eq "all") {

$VMs = Get-VM
$VMsMemoryAssigned = 0
$VMsMemoryMinimum = 0
$VMsMemoryMaximum = 0
$VMsMemoryDemand = 0

$VMsStateRunning = 0
$VMsStateOff = 0
$VMsStateSaved = 0
$VMsStatePaused = 0
$VMsStateOther = 0

foreach ($VM in $VMs) {
if ($VM.DynamicMemoryEnabled -eq "True") {
$VMsMemoryMinimum += $VM.MemoryMinimum
$VMsMemoryMaximum += $VM.MemoryMaximum
}
else {
$VMsMemoryMinimum += $VM.MemoryStartup
$VMsMemoryMaximum += $VM.MemoryStartup
}
$VMsMemoryAssigned += $VM.MemoryAssigned
$VMsMemoryDemand += $VM.MemoryDemand

switch ($VM.State) {
"Running" { $VMsStateRunning += 1}
"Saved" { $VMsStateSaved += 1}
"Paused" { $VMsStatePaused += 1}
"Off" { $VMsStateOff += 1}
"Other" { $VMsStateOther += 1}
Default { $VMsStateOther += 1}
}
}

$result = New-Object PSCustomObject
$result | Add-Member -type NoteProperty -name VMsMemoryMinimum -Value $VMsMemoryMinimum
$result | Add-Member -type NoteProperty -name VMsMemoryMaximum -Value $VMsMemoryMaximum
$result | Add-Member -type NoteProperty -name VMsMemoryDemand -Value $VMsMemoryDemand
$result | Add-Member -type NoteProperty -name VMsMemoryAssigned -Value $VMsMemoryAssigned

$result | Add-Member -type NoteProperty -name VMsStateOff -Value $VMsStateOff
$result | Add-Member -type NoteProperty -name VMsStateRunning -Value $VMsStateRunning
$result | Add-Member -type NoteProperty -name VMsStateSaved -Value $VMsStateSaved
$result | Add-Member -type NoteProperty -name VMsStatePaused -Value $VMsStatePaused
$result | Add-Member -type NoteProperty -name VMsStateOther -Value $VMsStateOther

$result | ConvertTo-Json
}
}

# получить статистику виртуальной машины
if ($Key -eq "vm_stat") {
if ($Value -ne "") {

$VM = Get-VM -Name $Value
# статус , служба интеграции, hearbeat сердцебиение, состояние,
$result = New-Object PSCustomObject
$result | Add-Member -type NoteProperty -name Status -Value $VM.Status
$result | Add-Member -type NoteProperty -name State -Value $VM.State
$result | Add-Member -type NoteProperty -name IntegrationServicesVersion -Value $VM.IntegrationServicesVersion
$result | Add-Member -type NoteProperty -name ReplicationHealth -Value $VM.ReplicationHealth
$result | Add-Member -type NoteProperty -name ReplicationMode -Value $VM.ReplicationMode
$result | Add-Member -type NoteProperty -name ReplicationState -Value $VM.ReplicationState
$result | Add-Member -type NoteProperty -name VirtualMachineSubType -Value $VM.VirtualMachineSubType
$result | ConvertTo-Json
}
}
}

3.Общий том кластера Hyper-v (LLD)
Общий том кластера Hyper-v (LLD)
Показать

Скачать
Общий том кластера Hyper-v (LLD).zip
Общий том кластера Hyper-v (LLD).zip
(13.37 КБ) 3 скачивания
https://github.com/JeferCatarina/zabbix ... aredvolume
Через скрипт powershell win_clustersv.ps1
UserParameter=windowscsvfs.discovery[*],powershell -NoProfile -ExecutionPolicy Bypass -File C:\zabbix\Scripts\win_clustersv.ps1 $1

Общий том Zabbix Hyper-V Cluster LLD.
Кластерная система
Требование: Zabbix 4.0 +
Скрипт win_clustersv.ps1
Показать
# Обнаружение в некластеризованных устройствах хранения виртуальной машины

# Счетчик
$C = 0

<# --- Без аргументов --- #>
If ( -Not $args[0]) {Write-Output "Usage: win_clustersv.ps1 path|name"; exit}

<# --- Путь к Общему тому Кластера --- #>
If ( $args[0] -eq "path") {

$LDDCSV = (Get-ClusterSharedVolume).Name
# Счетчик
$C = 0
$F = $LDDCSV.Count

# Запуск JSON
Write-Host "{"
Write-Host " `"data`":["

# Для каждого сервера в $LDDCSV
Foreach ($LDDCSV in $LDDCSV)
{
# Счетчик to not print comma after last object
$C++
Write-Host " {"
$LDDCSVPATH = ((Get-ClusterSharedVolume | Where-Object {$_.Name -like "$LDDCSV"} | select -ExpandProperty SharedVolumeInfo | Select FriendlyVolumeName | ft -HideTableHeaders | Out-String).Trim()).replace("\", "\\")

if ($LDDCSVPATH -ne "") { Write-Host " ""{#CSVPATH}"": ""$LDDCSVPATH""" }

if ($C -lt $F) { Write-Host " }," }
else { Write-Host " }" }

}
Write-Host " ]"
Write-Host "}"
}

<# --- Имя общего тома кластера --- #>
If ( $args[0] -eq "name") {

$LDDCSV = Get-WmiObject win32_PerfFormattedData_CsvFsPerfProvider_ClusterCSVFileSystem| Select Name
# Счетчик
$C = 0
$F = $LDDCSV.Count

# Запуск JSON
Write-Host "{"
Write-Host " `"data`":["

# Для каждого сервера в $LDDCSV
Foreach ($LDDCSV in $LDDCSV)
{
$LDDCSVNAME = $LDDCSV.Name
# Счетчик для печати запятую после последнего элемента
$C++
Write-Host " {"
if ($LDDCSVNAME -ne "") { Write-Host " ""{#CSVNAME}"": ""$LDDCSVNAME""" }

if ($C -lt $F) { Write-Host " }," }
else { Write-Host " }" }

}
Write-Host " ]"
Write-Host "}"
}

4.Репликация Hyper-v
Репликация Hyper-v
Показать

Скачать
Репликация Hyper-v.zip
Репликация Hyper-v.zip
(12.32 КБ) 3 скачивания
https://share.zabbix.com/virtualization ... eplication
https://github.com/JeferCatarina/zabbix ... eplication

Через Powershell

UserParameter=hyperv_replica[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica.ps1" $1 $2
UserParameter=hyperv_replica_discover,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica_discover.ps1"

Мониторинг репликации Hyper-v с обнаружением (LLD)
Здоровье репликации
Последняя синхронизация репликации

Требование: Zabbix Server 3.0+

1. Скачать файлы;
2. Импортировать шаблон;
3. Скопируйте скрипты туда, куда хотите;
4. Добавьте в zabbix_agent.conf, как показано ниже:
Timeout=5
UserParameter=hyperv_replica[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica.ps1" $1 $2
UserParameter=hyperv_replica_discover,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica_discover.ps1"


Значения:
0 - ОК
1 - Предупреждение
2 - Критический
3 - Неизвестно

Скрипты hyperv_replica.ps1 и hyperv_replica_discover.ps1
hyperv_replica.ps1
Показать
<# --- Без аргументов--- #>
If ( -Not $args[0]) {Write-Output "Usage: hyperv_replica.ps1 health|lastsync SRVNAME"; exit}

<# --- Здоровье репликации --- #>
If ( $args[0] -eq "health") {
$SRVNAME = $args[1]
$HEALTH = Get-VMReplication | Where-Object {$_.Name -like "$SRVNAME"} | select Health | ft -HideTableHeaders | Out-String
$HEALTH = $HEALTH.Trim()

if ( $HEALTH -eq 'Normal' ) { "0" }
elseif ( $HEALTH -eq 'Warning' ) { "1" }
elseif ( $HEALTH -eq 'Critical' ) { "2" }
else { "3" }
}

<# --- Репликация Последняя синхронизация --- #>
If ( $args[0] -eq "lastsync") {
$SRVNAME = $args[1]
$LASTSYNC = Measure-VMReplication | Where-Object {$_.Name -like "$SRVNAME"} | select LReplTime | ft -HideTableHeaders | Out-String
$LASTSYNC = $LASTSYNC.Trim()
$LASTSYNC = Get-Date -Date "$LASTSYNC" -Format "yyyy/MM/dd HH:mm:ss"
$DATE1 = Get-Date -Date "01/01/1970" -Format "yyyy/MM/dd HH:mm:ss"
$DATE2 = [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($LASTSYNC, [System.TimeZoneInfo]::Local.Id, 'GMT Standard Time')
(New-TimeSpan -Start $DATE1 -End $DATE2).TotalSeconds
}
hyperv_replica_discover.ps1
Показать
# Поиск Обнаружение
$LDDSRV = (Get-VMReplication).Name

# Счетчик
$C = 0
$F = $LDDSRV.Count

# Запуск JSON
Write-Host "{"
Write-Host " `"data`":["

# Для каждого сервера в $LDDSRV
Foreach ($LDDSRV in $LDDSRV)
{
# Счетчик, чтобы не печатать запятую после последнего объекта
$C++
Write-Host " {"

if ($LDDSRV -ne "") { Write-Host " ""{#SRVNAME}"": ""$LDDSRV""" }

if ($C -lt $F) { Write-Host " }," }
else { Write-Host " }" }

}
Write-Host " ]"
Write-Host "}"

5.Сервер Hyper-V
Сервер Hyper-V
Показать

Скачать
Сервер Hyper-V.zip
Сервер Hyper-V.zip
(38.14 КБ) 3 скачивания
https://share.zabbix.com/virtualization ... r-v-server
https://github.com/asand3r/zbx-hyperv

PowerShell 3.0

UserParameter=ms.hyperv[*],powershell -NoProfile -NoLogo -File "C:\Zabbix\Scripts\zbx-hyperv.ps1" $1

Обнаружение виртуальных машин сервера Hyper-V и получать их параметры:
«Назначенная память», «Использование ЦП», «Состояние» и т. д.

Протестировано с :
Hyper-V в Windows Server 2012, 2012 R2 и 2016. Не работает с Hyper-V 2008 R2 и ниже

Тестирование с Заббикс сервера
zabbix_get -s IP-Хоста -k 'ms.hyperv [lld]'


zbx-hyperv
Сценарий PowerShell для Zabbix для мониторинга сервера Hyper-V.

Также вы можете связаться со мной в Telegram: @ asand3r (русский, английский)

zbx-hyperv предоставляет возможность выполнять низкоуровневое обнаружение виртуальных машин сервера Hyper-V и получать их параметры, такие как «Назначенная память», «Использование ЦП», «Состояние» и т. д. Прикрепленный шаблон работает только с Zabbix 4.0 и выше.
Сценарий написан с помощью PowerShell и требует установки как минимум версии 3.0 и модуля Hyper-V.

Последняя стабильная версия: 0.2.2

Пожалуйста, прочтите раздел « Требования и установка » в Wiki перед использованием.

Зависимости
PowerShell v3.0 +
Feautres
Низкоуровневое открытие:

Виртуальные машины
Услуги Hyper-V
Статус компонента:

JSON для зависимых элементов для ВМ
Zabbix шаблоны
Кроме того, я прикрепил предварительно настроенный шаблон Zabbix для версии 4.0 и выше (не работает с 3.0, 3.2, 3.4!), Поэтому вы можете использовать его в своей среде. Он использует функцию обнаружения низкого уровня.

Протестировано с :
Hyper-V в Windows Server 2012, 2012 R2 и 2016. Не работает с Hyper-V 2008 R2 и ниже

Требования и установка
Для установки скрипта необходимо проделать несколько шагов:
Скопируйте скрипт в папку, в которой установлен zabbix_agentd.exe . Например, в шаблоне я использую «C: \ Program Files \ Zabbix Agent \ scripts»;
Добавьте новый UserParameter в zabbix_agentd.conf (вы можете найти пример в файле zabbix_agentd_userparameter.txt; в нашей среде мы используем каталог «C: \ Program Files \ Zabbix Agent \ userparameters» для хранения пользовательских файлов UserParameter и включения их в общую конфигурацию Zabbix Agent. файл с директивой "Включить"):
UserParameter=ms.hyperv[*],powershell -NoProfile -NoLogo -File "%ProgramFiles%\Zabbix Agent\scripts\zbx-hyperv.ps1" $1
Перезапустите службу Zabbix Agent:
PS C: \ > Restart-Service " Zabbix Agent "
Сделайте тест из новинок с помощью утилиты zabbix_get:
[root @ zabbix ~ ] # zabbix_get -s server01 -k 'ms.hyperv [lld]'
{ " data " : [{ " {# VM.NAME} " : " vm01 " , " {# VM.STATE} " : " RUNNING " , " {# VM.VERSION} " : " 5.0 " , " {# VM.CLUSTERED} " : 1, " {# VM.HOST} " : " hv01 " , " {#VM.GEN} " : 2}, ...}
Теперь он работает, поэтому вам нужно настроить новые правила обнаружения, элементы и триггер. Вы можете использовать мой шаблон из источников в качестве примера или использовать его из коробки. Будьте осторожны, он работает только с Zabbix Server 4.0 и выше!


Я добавил этот код в powershell, чтобы предупредить нас о моментальных снимках: (в функции Get-Full JSON() )
"Snapshots" = (Get-VMSnapshot -VM $_ | Measure-Object).Рассчитывать;
Затем в шаблон были добавлены соответствующие элементы обнаружения/триггеры. На случай если это кому нибудь поможет
Скрипт zbx-hyperv.ps1
Показать
<#
.СИНОПСИС SYNOPSIS
Скрипт для мониторинга серверов Hyper-V.

.ОПИСАНИЕ
Предоставляет LLD для виртуальных машин на сервере и
может извлекать JSON с найденными параметрами виртуальных машин для зависимых элементов.

Работает только с PowerShell 3.0 и выше.

.Действие ПАРАМЕТРА
Что мы хотим сделать - сделать LLD или получить полный JSON с метриками.

.ВЕРСИЯ параметра
Вывести номер версии и выйти.

.ПРИМЕР
zbx-hyperv.ps1 lld
{"data":[{"{#VM.NAME}":"vm01","{#VM.VERSION}":"5.0","{#VM.CLUSTERED}":0,"{#VM.HOST}":"hv01","{#VM.GEN}":2,"{#VM.ISREPLICA}":0}

.ПРИМЕР
zbx-hyperv.ps1 full
{"vm01":{"IntegrationServicesState":"","MemoryAssigned":0,"IntegrationServicesVersion":"","NumaSockets":1,"Uptime":0,"State":3,
"NumaNodes":1,"CPUUsage":0,"Status":"Operating normally","ReplicationHealth":0,"ReplicationState":0}, ...}

.ПРИМЕЧАНИЯ
Автор: Хацуюки Александр
На GitHub: https://github.com/asand3r/
#>

Param (
[switch]$version = $False,
[Parameter(Position=0,Mandatory=$False)][string]$action
)

# Версия скрипта
$VERSION_NUM="0.2.4"
if ($version) {
Write-Host $VERSION_NUM
break
}

# Низкоуровневая Функция обнаружения
function Make-LLD() {
$vms = Get-VM | Select-Object @{Name = "{#VM.NAME}"; e={$_.VMName}},
@{Name = "{#VM.VERSION}"; e={$_.Version}},
@{Name = "{#VM.CLUSTERED}"; e={[int]$_.IsClustered}},
@{Name = "{#VM.HOST}"; e={$_.ComputerName}},
@{Name = "{#VM.GEN}"; e={$_.Generation}},
@{Name = "{#VM.ISREPLICA}"; e={[int]$_.ReplicationMode}},
@{Name = "{#VM.NOTES}"; e={$_.Notes}}
return ConvertTo-Json @{"data" = [array]$vms} -Compress
}

# JSON для зависимых элементов
function Get-FullJSON() {
$to_json = @{}

# Из-за того, что Состояние служб интеграции-это строка, я сделал dict, чтобы сопоставить его с ним (лучше для Zabbix):
# 0 - До настоящего времени актуальный
# 1 - Требуется обновление
# 2 - неизвестное состояние
$integrationSvcState = @{
"Up to date" = 0;
"Update required" = 1;
"" = 2
}

Get-VM | ForEach-Object {
$vm_data = [psobject]@{"State" = [int]$_.State;
"Uptime" = [math]::Round($_.Uptime.TotalSeconds);
"NumaNodes" = $_.NumaNodesCount;
"NumaSockets" = $_.NumaSocketCount;
"IntSvcVer" = [string]$_.IntegrationServicesVersion;
"IntSvcState" = $integrationSvcState[$_.IntegrationServicesState];
"CPUUsage" = $_.CPUUsage;
"Memory" = $_.MemoryAssigned;
"ReplMode" = [int]$_.ReplicationMode;
"ReplState" = [int]$_.ReplicationState;
"ReplHealth" = [int]$_.ReplicationHealth;
"StopAction" = [int]$_.AutomaticStopAction;
"StartAction" = [int]$_.AutomaticStartAction;
"CritErrAction" = [int]$_.AutomaticCriticalErrorAction;
"IsClustered" = [int]$_.IsClustered
}
$to_json += @{$_.VMName = $vm_data}
}
return ConvertTo-Json $to_json -Compress
}

# Главный коммутатор (переключатель\выключатель)
switch ($action) {
"lld" {
Write-Host $(Make-LLD)
}
"full" {
Write-Host $(Get-FullJSON)
}
Default {Write-Host "Syntax error: Use 'lld' or 'full' as first argument"}
}

Собираем все в 1 общий шаблон, скрипты пока оставляем как есть для тестирования одного шаблона
Microsoft SBORKA Hyper-V С отдельными скриптами и одним общим шаблоном
Показать
Скачать
Microsoft SBORKA Hyper-V С отдельными скриптами и одним общим шаблоном.zip
Microsoft SBORKA Hyper-V С отдельными скриптами и одним общим шаблоном.zip
(43.61 КБ) 4 скачивания
Hyper-V Windows Server 2012 объединено 1 скрипт 1 шаблон
Hyper-V Windows Server 2012 объединено 1 скрипт 1 шаблон
Показать

Скачать
Hyper-V Windows Server 2012 объединено 1 скрипт 1 шаблон.zip
Hyper-V Windows Server 2012 объединено 1 скрипт 1 шаблон.zip
(50 КБ) 8 скачиваний
Переделка скрипта и команды проверки
UserParameter=<ключ>,<команда>
UserParameter=ключ[*],команда $1

В элемент данных пишем
ключ[1переменная,2переменная,3переменная,и тд]

Что было для разных шаблонов и скриптов
UserParameter=replica.state,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\Replica.ps1" $1
UserParameter=hyperv.host[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_host.ps1" -ActionType "$1" -Key "$2" -Value "$3"
UserParameter=hyperv_replica_discover,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica_discover.ps1"
UserParameter=hyperv_replica[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\hyperv_replica.ps1" $1 $2
UserParameter=windowscsvfs.discovery[*],powershell -NoProfile -ExecutionPolicy Bypass -File C:\zabbix\Scripts\win_clustersv.ps1 $1
UserParameter=ms.hyperv[*],powershell -NoProfile -NoLogo -File "C:\Zabbix\Scripts\zbx-hyperv.ps1" $1

-NoProfile Не загружает профиль PowerShell
-NoLogo Скрывает баннер авторских прав при запуске программы
-ExecutionPolicy Задает политику выполнения по умолчанию для текущего сеанса и сохраняет ее в переменной среде
Bypass - разрешён запуск любых PS файлов (предупреждения не выводятся) используется для автоматического запуска PS скриптов
-File является путем к файлу, сценарий выполняется в локальной области ("с последовательной точкой"), чтобы функции и переменные, создаваемые сценарием, были доступны в текущем сеансе.
Введите путь к файлу сценария и любые параметры.
File должен быть последним параметром в команде.
Все значения, введенные после параметра File , обрабатываются как путь к файлу скрипта и параметры, передаваемые этому скрипту


Прием входных переменных
1. Самый простой встроенную переменную $args
$args[0] $args[1] и т.д. аргументы должны вводиться ровно в том порядке, в каком они указаны в сценарии
.\service.ps1 spooler SRV1

2. Более эффективным
Param (
[string]$service,
[string]$computer
)
Get-Service -ServiceName $service -ComputerName $computer
.\service.ps1 -Service spooler -Computer SRV1
.\service.ps1 -Serv spooler -Comp SRV1
Имена можно и совсем опустить, хотя это и не очень правильно, примет значения параметров в том порядке, в каком они указаны в команде
\service.ps1 spooler SRV1

3. Более сложный способ передачи параметров (обязательные, указывать для каждого позицию и многое другое)
как обязательные для заполнения (Mandatory=$true) и для каждого задана своя позиция (оба параметра обязательно должны быть указаны и должны идти строго в определенном порядке)
ограничение в 3 символа (ValidateLength(1,3):
Position – Позиция переменной при вызове функции;
Пример
CmdletBinding()]

Param (
[Parameter (Mandatory=$true)]
[string]$service,

[Parameter (Mandatory=$true)]
[ValidateLength(1,3)]
[string]$computer
)

Get-Service -ServiceName $service -ComputerName $computer
Команда пример
.\service.ps1 -Service spooler -Computer SRV1

Помощь help about_functions_advanced_parameters



обычный элемент replica.state
Запрос тест
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\1\Replica.ps1"


hyperv.host[*]
обычный элемент hyperv.host[get,host_stat,all]
Обнаружение
hyperv.host[discover,vsw]
hyperv.host[discover,vm]
hyperv.host[discover,va]
hyperv.host[discover,vm_na]
hyperv.host[discover,vm_sd]
Запрос тест
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\1\hyperv_host.ps1" -ActionType "get" -Key "host_stat" -Value "all"
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\1\hyperv_host.ps1" -ActionType "discover" -Key "vsw" -Value ""
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\1\hyperv_host.ps1" -ActionType "discover" -Key "vm" -Value ""


Обнаружение
hyperv_replica_discover
Запрос тест
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\1\hyperv_replica_discover.ps1"


Прототипы элементов
hyperv_replica[*]
Запрос тест
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\1\hyperv_replica.ps1" $1 $2

hyperv_replica[health,{#SRVNAME}]
hyperv_replica[lastsync,{#SRVNAME}]


windowscsvfs.discovery[*]
Обнаружение
windowscsvfs.discovery[name]
windowscsvfs.discovery[path]
Запрос тест
powershell -NoProfile -ExecutionPolicy Bypass -File C:\zabbix\Scripts\1\win_clustersv.ps1 name
powershell -NoProfile -ExecutionPolicy Bypass -File C:\zabbix\Scripts\1\win_clustersv.ps1 path



ms.hyperv[*]
1 обычный элемент ms.hyperv[full]
Обнаружение
ms.hyperv[lld]
Запрос тест
powershell -NoProfile -NoLogo -File "C:\Zabbix\Scripts\1\zbx-hyperv.ps1 lld
powershell -NoProfile -NoLogo -File "C:\Zabbix\Scripts\1\zbx-hyperv.ps1 full

Прототипы зависимые элементы данных
ms.hyperv.vm[{#VM.NAME},"CPUUsage"]
ms.hyperv.vm[{#VM.NAME},"IntSvcState"]
ms.hyperv.vm[{#VM.NAME},"IntSvcVer"]
ms.hyperv.vm[{#VM.NAME},"Memory"]
ms.hyperv.vm[{#VM.NAME},"NumaNodes"]
ms.hyperv.vm[{#VM.NAME},"NumaSockets"]
ms.hyperv.vm[{#VM.NAME},"ReplHealth"]
ms.hyperv.vm[{#VM.NAME},"ReplMode"]
ms.hyperv.vm[{#VM.NAME},"ReplState"]
ms.hyperv.vm[{#VM.NAME},"State"]
ms.hyperv.vm[{#VM.NAME},"Uptime"]
{#VM.NAME} - где имя виртуальной машины



Объединяем все в 1 скрипт

Делаем 1 скрипт HyperV.ps1
UserParameter=HyperV[*],powershell -NoProfile -NoLogo -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName "$1" -ActionType "$2" -Key "$3" -Value "$4"

$1 - входной это у нас будут блоки скриптов их имена replica ; hyperv.host ; hyperv_replica_discover ; hyperv_replica ; windowscsvfs ; ms.hyperv

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName "replica" (нет Get-VMReplication)

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv.host -ActionType "get" -Key "host_stat" -Value "all"
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv.host -ActionType "get" -Key "vm_stat" -Value "Имя виртуальной машины"
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv.host -ActionType "discover" -Key "vsw" -Value ""
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv.host -ActionType "discover" -Key "vm" -Value ""
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv.host -ActionType "discover" -Key "va" -Value ""
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv.host -ActionType "discover" -Key "vm_na" -Value ""
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv.host -ActionType "discover" -Key "vm_sd" -Value ""

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv_replica_discover -ActionType "" -Key "" -Value "" (нет Get-VMReplication)

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv_replica -ActionType "health" -Key "{#SRVNAME}" -Value "" (нет Get-VMReplication)
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName hyperv_replica -ActionType "lastsync" -Key "{#SRVNAME}" -Value "" (нет Get-VMReplication)

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName windowscsvfs -ActionType "name" -Key "" -Value "" (нет win32_PerfFormattedData_CsvFsPerfProvider_ClusterCSVFileSystem)
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName windowscsvfs -ActionType "path" -Key "" -Value "" (нет Get-ClusterSharedVolume)

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName ms.hyperv -ActionType "full" -Key "" -Value ""
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\zabbix\Scripts\HyperV.ps1" -BlockName ms.hyperv -ActionType "lld" -Key "" -Value ""
количество слов: 2937
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Hyper-V от 2012 RUS

Сообщение Артём Мамзиков »

Объеденено все в 1 скрипт
Скрипт HyperV.ps1
Показать
# Входные переменные
Param(
[Parameter(Mandatory = $true)][String]$BlockName,
[Parameter(Mandatory = $false)][String]$ActionType,
[Parameter(Mandatory = $false)][String]$Key,
[Parameter(Mandatory = $false)][String]$Value
)

# Преобразование входных переменных в нижний регистр
$BlockName = $BlockName.ToLower()
$ActionType = $ActionType.ToLower()
$Key = $Key.ToLower()
$Value = $Value.ToLower()

# это необходимость в правильных кириллических символах в старой ОС
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8


# Replica ВХОДНОЙ
if ($BlockName -eq "replica") {
$replica = Get-VMReplication | select Health
if ( $replica.Health -eq "Critical"){
write-host 2
}elseif ( $replica.Health -eq "Normal"){
write-host 1
}
}


# hyperv.host ВХОДНОЙ
if ($BlockName -eq "hyperv.host") {
<# Описание
Требуется -версия 3
.СИНОПСИС SYNOPSIS
Этот скрипт часть Zabbix
Microsoft Hyper-V
Требования PowerShell 3.0 или выше
.ОПИСАНИЕ DESCRIPTION
Это использование sricpt для LLD и trapper
.ПАРАМЕТР <ActionType>
Тип действия: dsicover, get или other (других)
.ПАРАМЕТР <Ключ>
Ключ - аттирбют для
.ПАРАМЕТР <Значение>
Значение VAR для ключей, могут быть одно-или многократно
.ВХОДНЫЕ INPUTS
Ввести 3 переменные

.ВЫХОДЫ
Вывод в формате JSON для Zabbix
.ПРИМЕЧАНИЯ
Версия: 1.0
Автор: p.kuznetsov@itmicus.ru
Дата создания: 25/05/2018
Назначение/изменение: первоначальное развитие сценария

.Пример
hyperv_active.пс1 -ActionType "$1" ключ "$2" -Значение "$3"
hyperv_active.ps1 -ActionType "$1" -Key "$2" -Value "$3
#>

if ($ActionType -eq "discover") {
# Поиск обнаружение виртуальные коммутаторы hyper-v
if ($Key -eq "vsw") {
$result_json = [pscustomobject]@{
'data' = @(
get-wmiobject Win32_PerfRawData_NvspSwitchStats_HyperVVirtualSwitch | ForEach-Object {
$Hyperv_virtualswitch_name = $_.Name;
[pscustomobject]@{
'{#VIRTUAL_SWITCH_NAME}' = $Hyperv_virtualswitch_name;
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)
}

# Поиск обнаружение физический сетевой адаптер для виртуальных коммутаторов hyper-v
if ($Key -eq "va") {

$filter = "NetEnabled='True' and PhysicalAdapter='True'
AND PNPDeviceID LIKE 'ROOT\\%'"

$result_json = [pscustomobject]@{
'data' = @(
get-wmiobject win32_networkadapter -filter $filter | ForEach-Object {
$HYPERV_ADAPTER_NAME = $_.NetConnectionID;
$HYPERV_ADAPTER_INTERFACEINDEX = $_.InterfaceIndex;
Get-WmiObject Win32_PnPEntity -Filter ("PNPDeviceID='$($_.PNPDeviceID)'" -Replace '\\', '\\') | ForEach-Object {
[pscustomobject]@{
'{#HYPERV_NETWORKADAPTER_NAME}' = $HYPERV_ADAPTER_NAME;
'{#HYPERV_NETWORKADAPTER_PERF}' = $_.Name.Replace("/", "_").Replace("#", "_").Replace("(", "[").Replace(")", "]")
'{#HYPERV_NETWORKADAPTER_INTERFACEINDEX}' = $HYPERV_ADAPTER_INTERFACEINDEX
}
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)
}

# Поиск Обнаружение hyper-v не кластеризованных виртуальных машин
if ($Key -eq "vm") {
$result_json = [pscustomobject]@{
'data' = @(
get-vm | Where-Object {$_.IsClustered -eq $False} | ForEach-Object {
$vm_name = $_.Name;
[pscustomobject]@{
'{#VM_NAME}' = $vm_name;
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)
}

# Поиск Обнаружение сетевые адаптеры некластеризованной виртуальной машины
if ($Key -eq "vm_na") {
$vms = get-vm | Where-Object {$_.IsClustered -eq $False} | Select-Object Name
$networkadapters = Get-WmiObject Win32_PerfRawData_NvspNicStats_HyperVVirtualNetworkAdapter | Select-Object Name
$result = @()
foreach ($networkadapter in $networkadapters) {
foreach ($vm in $vms) {
if ($networkadapter.Name -Match $vm.Name) {
$data = New-Object PSCustomObject
$data | Add-Member -type NoteProperty -name Perf -Value $networkadapter.Name
$data | Add-Member -type NoteProperty -name Name -Value $vm.Name
$result += $data
}
}
}

$result_json = [pscustomobject]@{
'data' = @(
$result | ForEach-Object {
[pscustomobject]@{
'{#VM_NETWORKADAPTER_NAME}' = $_.Name;
'{#VM_NETWORKADAPTER_PERF}' = $_.Perf;
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)
}

# Поиск Обнаружения в некластеризованных устройствах хранения виртуальной машины
if ($Key -eq "vm_sd") {
$vms = get-vm | Where-Object {$_.IsClustered -eq $False} | Select-Object Name
$networkadapters = Get-WmiObject Win32_PerfFormattedData_Counters_HyperVVirtualStorageDevice | Select-Object Name
$result = @()
foreach ($networkadapter in $networkadapters) {
foreach ($vm in $vms) {
if ($networkadapter.Name -Match $vm.Name) {
$data = New-Object PSCustomObject
$data | Add-Member -type NoteProperty -name Perf -Value $networkadapter.Name
$data | Add-Member -type NoteProperty -name Name -Value $vm.Name
$result += $data
}
}
}

$result_json = [pscustomobject]@{
'data' = @(
$result | ForEach-Object {
[pscustomobject]@{
'{#VM_STORAGEDEVICE_NAME}' = $_.Name;
'{#VM_STORAGEDEVICE_PERF}' = $_.Perf;
}
}
)
}| ConvertTo-Json
[Console]::WriteLine($result_json)

}
}

if ($ActionType -eq "get") {

# Получить данные для физического сетевого адаптера по имени
if ($Key -eq "host_stat") {
if ($Value -eq "all") {

$VMs = Get-VM
$VMsMemoryAssigned = 0
$VMsMemoryMinimum = 0
$VMsMemoryMaximum = 0
$VMsMemoryDemand = 0

$VMsStateRunning = 0
$VMsStateOff = 0
$VMsStateSaved = 0
$VMsStatePaused = 0
$VMsStateOther = 0

foreach ($VM in $VMs) {
if ($VM.DynamicMemoryEnabled -eq "True") {
$VMsMemoryMinimum += $VM.MemoryMinimum
$VMsMemoryMaximum += $VM.MemoryMaximum
}
else {
$VMsMemoryMinimum += $VM.MemoryStartup
$VMsMemoryMaximum += $VM.MemoryStartup
}
$VMsMemoryAssigned += $VM.MemoryAssigned
$VMsMemoryDemand += $VM.MemoryDemand

switch ($VM.State) {
"Running" { $VMsStateRunning += 1}
"Saved" { $VMsStateSaved += 1}
"Paused" { $VMsStatePaused += 1}
"Off" { $VMsStateOff += 1}
"Other" { $VMsStateOther += 1}
Default { $VMsStateOther += 1}
}
}

$result = New-Object PSCustomObject
$result | Add-Member -type NoteProperty -name VMsMemoryMinimum -Value $VMsMemoryMinimum
$result | Add-Member -type NoteProperty -name VMsMemoryMaximum -Value $VMsMemoryMaximum
$result | Add-Member -type NoteProperty -name VMsMemoryDemand -Value $VMsMemoryDemand
$result | Add-Member -type NoteProperty -name VMsMemoryAssigned -Value $VMsMemoryAssigned

$result | Add-Member -type NoteProperty -name VMsStateOff -Value $VMsStateOff
$result | Add-Member -type NoteProperty -name VMsStateRunning -Value $VMsStateRunning
$result | Add-Member -type NoteProperty -name VMsStateSaved -Value $VMsStateSaved
$result | Add-Member -type NoteProperty -name VMsStatePaused -Value $VMsStatePaused
$result | Add-Member -type NoteProperty -name VMsStateOther -Value $VMsStateOther

$result | ConvertTo-Json
}
}

# получить статистику виртуальной машины
if ($Key -eq "vm_stat") {
if ($Value -ne "") {

$VM = Get-VM -Name $Value
# статус , служба интеграции, hearbeat сердцебиение, состояние,
$result = New-Object PSCustomObject
$result | Add-Member -type NoteProperty -name Status -Value $VM.Status
$result | Add-Member -type NoteProperty -name State -Value $VM.State
$result | Add-Member -type NoteProperty -name IntegrationServicesVersion -Value $VM.IntegrationServicesVersion
$result | Add-Member -type NoteProperty -name ReplicationHealth -Value $VM.ReplicationHealth
$result | Add-Member -type NoteProperty -name ReplicationMode -Value $VM.ReplicationMode
$result | Add-Member -type NoteProperty -name ReplicationState -Value $VM.ReplicationState
$result | Add-Member -type NoteProperty -name VirtualMachineSubType -Value $VM.VirtualMachineSubType
$result | ConvertTo-Json
}
}


}
}


# hyperv_replica_discover ВХОДНОЙ
if ($BlockName -eq "hyperv_replica_discover") {
# Поиск Обнаружение
$LDDSRV = (Get-VMReplication).Name

# Счетчик
$C = 0
$F = $LDDSRV.Count

# Запуск JSON
Write-Host "{"
Write-Host " `"data`":["

# Для каждого сервера в $LDDSRV
Foreach ($LDDSRV in $LDDSRV)
{
# Счетчик, чтобы не печатать запятую после последнего объекта
$C++
Write-Host " {"

if ($LDDSRV -ne "") { Write-Host " ""{#SRVNAME}"": ""$LDDSRV""" }

if ($C -lt $F) { Write-Host " }," }
else { Write-Host " }" }

}
Write-Host " ]"
Write-Host "}"
}


# hyperv_replica ВХОДНОЙ
if ($BlockName -eq "hyperv_replica") {
<# --- Без аргументов--- #>
If ( -Not $ActionType) {Write-Output "Usage: HyperV.ps1 -BlockName hyperv_replica -ActionType health|lastsync SRVNAME"; exit}

<# --- Здоровье репликации --- #>
If ( $ActionType -eq "health") {
$SRVNAME = $Key
$HEALTH = Get-VMReplication | Where-Object {$_.Name -like "$SRVNAME"} | select Health | ft -HideTableHeaders | Out-String
$HEALTH = $HEALTH.Trim()

if ( $HEALTH -eq 'Normal' ) { "0" }
elseif ( $HEALTH -eq 'Warning' ) { "1" }
elseif ( $HEALTH -eq 'Critical' ) { "2" }
else { "3" }
}

<# --- Репликация Последняя синхронизация --- #>
If ( $ActionType -eq "lastsync") {
$SRVNAME = $Key
$LASTSYNC = Measure-VMReplication | Where-Object {$_.Name -like "$SRVNAME"} | select LReplTime | ft -HideTableHeaders | Out-String
$LASTSYNC = $LASTSYNC.Trim()
$LASTSYNC = Get-Date -Date "$LASTSYNC" -Format "yyyy/MM/dd HH:mm:ss"
$DATE1 = Get-Date -Date "01/01/1970" -Format "yyyy/MM/dd HH:mm:ss"
$DATE2 = [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($LASTSYNC, [System.TimeZoneInfo]::Local.Id, 'GMT Standard Time')
(New-TimeSpan -Start $DATE1 -End $DATE2).TotalSeconds
}
}


# win_clustersv windowscsvfs ВХОДНОЙ
if ($BlockName -eq "windowscsvfs") {
# Обнаружение в некластеризованных устройствах хранения виртуальной машины

# Счетчик
$C = 0

<# --- Без аргументов --- #>
If ( -Not $ActionType) {Write-Output "Usage: HyperV.ps1 -BlockName windowscsvfs -ActionType path|name"; exit}

<# --- Путь к Общему тому Кластера --- #>
If ( $ActionType -eq "path") {

$LDDCSV = (Get-ClusterSharedVolume).Name
# Счетчик
$C = 0
$F = $LDDCSV.Count

# Запуск JSON
Write-Host "{"
Write-Host " `"data`":["

# Для каждого сервера в $LDDCSV
Foreach ($LDDCSV in $LDDCSV)
{
# Счетчик to not print comma after last object
$C++
Write-Host " {"
$LDDCSVPATH = ((Get-ClusterSharedVolume | Where-Object {$_.Name -like "$LDDCSV"} | select -ExpandProperty SharedVolumeInfo | Select FriendlyVolumeName | ft -HideTableHeaders | Out-String).Trim()).replace("\", "\\")

if ($LDDCSVPATH -ne "") { Write-Host " ""{#CSVPATH}"": ""$LDDCSVPATH""" }

if ($C -lt $F) { Write-Host " }," }
else { Write-Host " }" }

}
Write-Host " ]"
Write-Host "}"
}

<# --- Имя общего тома кластера --- #>
If ( $ActionType -eq "name") {

$LDDCSV = Get-WmiObject win32_PerfFormattedData_CsvFsPerfProvider_ClusterCSVFileSystem| Select Name
# Счетчик
$C = 0
$F = $LDDCSV.Count

# Запуск JSON
Write-Host "{"
Write-Host " `"data`":["

# Для каждого сервера в $LDDCSV
Foreach ($LDDCSV in $LDDCSV)
{
$LDDCSVNAME = $LDDCSV.Name
# Счетчик для печати запятую после последнего элемента
$C++
Write-Host " {"
if ($LDDCSVNAME -ne "") { Write-Host " ""{#CSVNAME}"": ""$LDDCSVNAME""" }

if ($C -lt $F) { Write-Host " }," }
else { Write-Host " }" }

}
Write-Host " ]"
Write-Host "}"
}
}


# zbx-hyperv ms.hyperv ВХОДНОЙ
if ($BlockName -eq "ms.hyperv") {
<# Описание
.СИНОПСИС SYNOPSIS
Скрипт для мониторинга серверов Hyper-V.

.ОПИСАНИЕ
Предоставляет LLD для виртуальных машин на сервере и
может извлекать JSON с найденными параметрами виртуальных машин для зависимых элементов.

Работает только с PowerShell 3.0 и выше.

.Действие ПАРАМЕТРА
Что мы хотим сделать - сделать LLD или получить полный JSON с метриками.

.ВЕРСИЯ параметра
Вывести номер версии и выйти.

.ПРИМЕР
zbx-hyperv.ps1 lld
{"data":[{"{#VM.NAME}":"vm01","{#VM.VERSION}":"5.0","{#VM.CLUSTERED}":0,"{#VM.HOST}":"hv01","{#VM.GEN}":2,"{#VM.ISREPLICA}":0}

.ПРИМЕР
zbx-hyperv.ps1 full
{"vm01":{"IntegrationServicesState":"","MemoryAssigned":0,"IntegrationServicesVersion":"","NumaSockets":1,"Uptime":0,"State":3,
"NumaNodes":1,"CPUUsage":0,"Status":"Operating normally","ReplicationHealth":0,"ReplicationState":0}, ...}

.ПРИМЕЧАНИЯ
Автор: Хацуюки Александр
На GitHub: https://github.com/asand3r/
#>

[switch]$version = $False

# Версия скрипта
$VERSION_NUM="0.2.4"
if ($version) {
Write-Host $VERSION_NUM
break
}

# Низкоуровневая Функция обнаружения
function Make-LLD() {
$vms = Get-VM | Select-Object @{Name = "{#VM.NAME}"; e={$_.VMName}},
@{Name = "{#VM.VERSION}"; e={$_.Version}},
@{Name = "{#VM.CLUSTERED}"; e={[int]$_.IsClustered}},
@{Name = "{#VM.HOST}"; e={$_.ComputerName}},
@{Name = "{#VM.GEN}"; e={$_.Generation}},
@{Name = "{#VM.ISREPLICA}"; e={[int]$_.ReplicationMode}},
@{Name = "{#VM.NOTES}"; e={$_.Notes}}
return ConvertTo-Json @{"data" = [array]$vms} -Compress
}

# JSON для зависимых элементов
function Get-FullJSON() {
$to_json = @{}

# Из-за того, что Состояние служб интеграции-это строка, я сделал dict, чтобы сопоставить его с ним (лучше для Zabbix):
# 0 - До настоящего времени актуальный
# 1 - Требуется обновление
# 2 - неизвестное состояние
$integrationSvcState = @{
"Up to date" = 0;
"Update required" = 1;
"" = 2
}

Get-VM | ForEach-Object {
$vm_data = [psobject]@{"State" = [int]$_.State;
"Uptime" = [math]::Round($_.Uptime.TotalSeconds);
"NumaNodes" = $_.NumaNodesCount;
"NumaSockets" = $_.NumaSocketCount;
"IntSvcVer" = [string]$_.IntegrationServicesVersion;
"IntSvcState" = $integrationSvcState[$_.IntegrationServicesState];
"CPUUsage" = $_.CPUUsage;
"Memory" = $_.MemoryAssigned;
"ReplMode" = [int]$_.ReplicationMode;
"ReplState" = [int]$_.ReplicationState;
"ReplHealth" = [int]$_.ReplicationHealth;
"StopAction" = [int]$_.AutomaticStopAction;
"StartAction" = [int]$_.AutomaticStartAction;
"CritErrAction" = [int]$_.AutomaticCriticalErrorAction;
"IsClustered" = [int]$_.IsClustered
}
$to_json += @{$_.VMName = $vm_data}
}
return ConvertTo-Json $to_json -Compress
}

# Главный коммутатор (переключатель\выключатель)
switch ($ActionType) {
"lld" {
Write-Host $(Make-LLD)
}
"full" {
Write-Host $(Get-FullJSON)
}
Default {Write-Host "Syntax error: Use 'lld' or 'full' as first argument"}
}
}
Далее продолжение Hyper-V Windows Server 2008 RUS так как нам нужен был шаблон по Windows Server 2008
количество слов: 1296
Ответить Вложения 7 Пред. темаСлед. тема

Вернуться в «Hyper-V»