编写 return 出现在同一 VMHost 上的已定义组中的 VM 名称的脚本

Script to return the name of VMs in defined groups that appear on the same VMHost

我想要达到的目标

我正在编写一个脚本,该脚本将每小时 运行 发送一次电子邮件,如果在同一 vHost 上 运行 发现某些虚拟机,则会发送一封电子邮件。我真的不在乎每个 VM 运行 的位置,只要它的其他 VM 之一不在同一个 vHost 上即可。这些分组目前是 4 个虚拟机,但我希望它与一个组中的 N 个虚拟机一起工作。

首先,我像这样定义虚拟机组:

$group1 = @("VM01", "VM02", "VM03", "VM04")
$group2 = @("SERVERA", "SERVER2")
$group3 = @("WIN01", "WIN02", "WIN03")

$groups = @($group1, $group2, $group3)

然后我可以在 $groups 上执行 ForEach 并依次遍历每个组以检索 VM 所在的 VMHost 的名称:

ForEach($group in $groups) {
    $vmhosts = New-Object 'string[]' $group.Length

    For($i=0; $i -le ($group.Length -1); $i++) {
        $vmhosts[$i] = Get-VM -Name $group[$i] | Get-VMHost
    }
}

这使我将 VMhost 的 IP/hostname 放入数组 $vmhosts 中,其位置与 VM 在其组数组中的索引相匹配。

这是我努力寻找一种方法来确定是否有任何 VM 在同一个 VMHost 上,并在我的电子邮件中报告,对于组内同一个 VMHost 上的每个 VM 的文本如下(但报告在所有组上):

VM01 在同一个 VMHostas VM02 上

VM01 在同一个 VMHostas VM03 上

VM02 在同一个 VMHostas VM03 上

WIN02 与 WIN03 在同一个 VMHost 上

如果没有一组 VM 在同一个 VMHost 上,那么它只是 returns,"All VMs are separated correctly."

到目前为止我尝试了什么

我试图从 $vmhosts 中检索唯一的 VMHost,方法是:

$unique = $vmhosts | Select -Unique

但是我需要知道 VM 何时在该 VMHost returned 上。所以我试图在 $vmhosts 中找到它,它与 3 个虚拟机一起工作,但是当扩展到 4 个时,它无法 return 任何东西。

我很确定这可以做得更好....

怎么样

$vmGrp1 = @("VM01", "VM02", "VM03", "VM04")
$vmGrp2 = @("SERVERA", "SERVER2")
$vmGrp3 = @("WIN01", "WIN02", "WIN03")
$vmGrps = @($vmGrp1, $vmGrp2, $vmGrp3)
$finds = @()    
foreach ($vmGrp in $vmGrps) 
{
  $vms = get-vm $vmGrp
  $HostGrps = $vms | Group-Object @{e={$_.vmhost.name}}
  $finds += $HostGrps | % {if ($_.Count -gt 1) {$_.Name + " has " + ( $_.Group | Select -ExpandProperty Name) }} # this breaks in PS v2: + $_.Group.Name}}
}
if ($finds) {$finds} else {"All VMs are separated correctly."}