Check_MK 提供了一个脚本来使用他们的一个内置检查来返回名为 hyperv_vms_guestinfos.psi 的 Hyper-V VM 的运行状况。我可以让脚本在 shell 上毫无问题地运行。Check_mk 运行脚本(通过 telnet 测试),但报告无效信息。
我修改了脚本,使 VM 输出的第一部分看起来不再输出 VM 名称,但现在它只报告 Get-VM 命令中最后记录的 VM。
该脚本自 2015 年以来一直没有更新,我想知道是否有其他人在没有修改的情况下让它工作,或者是否需要进行任何修改,以便我可以获得每个托管 VM 的报告。
我在下面发布了我的 CMK 安装 (1.4.0p12) 中的代理代码。我为测试删除的行是:
$OutputString = "<<<<" + $VM.name + ">>>>" Script-Output -String
$OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
来自 CMK 的原始完整脚本
#
# Hyper-V VM state
#
# Script must executed with local administrator credentials!
#
# This script gathers a few information about VM integration services,
# checkpoints and replication. All other information about the system
# health are gathered by the operating system agents on both, host and
# guest servers
#
# Version: 1.0
#
# Date: 2015-08-01
#
# Author: A. Exner, ACP
# Script parameters:
$OutputFile = "c:\scripts\VM-State.txt" # Path and filename for file output
$WriteFileOutput = $false
# DO NOT CHANGE ANYTHING BELOW THIS LINE!
#-------------------------------------------------------------------------------
function Script-Output
{
param([Parameter(Mandatory = $true)][string]$String,[Parameter(Mandatory = $true)][string]$File,[Parameter(Mandatory = $false)][bool]$FileOut=$false,[Parameter(Mandatory = $false)][bool]$Append=$true)
Write-Host $String
If($FileOut)
{
If($Append)
{
Out-File -FilePath $File -Encoding unicode -Append -InputObject $OutputString
}
Else
{
Out-File -FilePath $OutputFile -Encoding unicode -Force -InputObject $OutputString
}
}
}
# Open / overwrite file output
If($WriteFileOutput)
{
$OutputString = Get-Date -Format yyyy-MM-dd_hh-mm-ss
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $false
}
# Get VM's from host and collect informations
$VMList = Get-VM
$now = Get-Date
Foreach ($VM in $VMList)
{
$OutputString = "<<<<" + $VM.name + ">>>>"
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
$OutputString = "<<<hyperv_vmstatus>>>"
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
# Integration Services
$VMI = Get-VMIntegrationService -VMName $VM.name
$VMIStat = $VMI | where {$_.OperationalStatus -match "ProtocolMismatch"}
If($VMIStat.Count -gt 0)
{
$OutputString = "Integration_Services Protocol_Mismatch"
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
}
Else
{
$OutputString = "Integration_Services Ok"
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
}
#Replica
$OutputString = "Replica_Health None"
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
#Checkpoints
$VMCP = Get-VMSnapshot -VMName $VM.name
$OutputString = "<<<hyperv_checkpoints>>>"
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
If ($VMCP)
{
Foreach($CP in $VMCP)
{
$OutputString = [string]$CP.Id + " " + [string][System.Math]::Round((($now - $CP.CreationTime).TotalSeconds), 0)
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
}
}
Else
{
$OutputString = "No_Checkpoints"
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true
}
}
$OutputString = "<<<<>>>>"
Script-Output -String $OutputString -File $OutputFile -FileOut $WriteFileOutput -Append $true