编写 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."}
我想要达到的目标
我正在编写一个脚本,该脚本将每小时 运行 发送一次电子邮件,如果在同一 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."}