Workflow VM 审核中的重复项
Duplicates in Workflow VM audit
我正在对多个 vcenter(大约 5 个)实施 VM 审计,其中报告只是每个 VM 的 csv 以及一些属性。虽然这个脚本会 运行 一夜之间,但我发现它需要大约 5-6 个小时才能完成,想提高它的效率。我了解了工作流,并认为同时审核每个 vcenter 而不是一个一个地审核会更快。大约 4 小时后,它比我预期的要慢。我注意到数据中有很多重复项,但我不明白为什么会这样;也许我关于工作流如何工作的想法是有缺陷的。我也在寻找有关提高代码效率的任何提示。提前致谢。
工作流程:
workflow test {
param([string[]]$vcenters, [string]$session, [string]$username, [string]$password)
foreach -parallel($vcenter in $vcenters){
$main = InlineScript{
Add-PSSnapin VMware.VimAutomation.Core
Connect-VIServer -Server $Using:vcenter -User $Using:username -Password $Using:password
$vms = Get-View -ViewType VirtualMachine -Property Name, Summary.Config.GuestFullName, Runtime.Powerstate, Config.Hardware.MemoryMB, Config.Hardware.NumCPU
ForEach($machine in $vms){
$vm = Get-VM -Server $Using:vcenter -Name $machine.Name -ErrorAction SilentlyContinue
$object = New-Object -Type PSObject -Property ([ordered]@{
Name = $machine.Name
GuestOS = $machine.Summary.Config.GuestFullName
PowerState = $machine.Runtime.PowerState
MemoryGB = ($machine.Config.Hardware.MemoryMB / 1024)
CPU = $machine.Config.Hardware.NumCPU
VLAN=(Get-NetworkAdapter -VM $vm |Sort-Object NetworkName |Select -Unique -Expand NetworkName) -join '; '
})
$object| Export-Csv -Append “C:\TestReports$($vcenter)_TestReport.csv” -NoTypeInformation
}
Disconnect-VIServer - $Using:vcenter -Confirm:$false
}
}
}
通过以下更改,它可能运行得足够快,您不再需要并行或工作流。不确定这些元素是否是重复问题的原因。如果没有,您可能需要从您的环境中分享更多详细信息以获取有关该部分的帮助。
Get-VM
很慢。您为每个 VM 调用一次,我认为您根本不需要它。尝试在连接到 vCenter
后添加此行
$networks = Get-View -ViewType Network
将您的 VLAN=
行替换为
VLAN= $networks | ? {$_.VM.Value -contains $machine.MoRef.value} | select -exp Name
并完全删除您的 $vm = Get-VM
... 行。
我正在对多个 vcenter(大约 5 个)实施 VM 审计,其中报告只是每个 VM 的 csv 以及一些属性。虽然这个脚本会 运行 一夜之间,但我发现它需要大约 5-6 个小时才能完成,想提高它的效率。我了解了工作流,并认为同时审核每个 vcenter 而不是一个一个地审核会更快。大约 4 小时后,它比我预期的要慢。我注意到数据中有很多重复项,但我不明白为什么会这样;也许我关于工作流如何工作的想法是有缺陷的。我也在寻找有关提高代码效率的任何提示。提前致谢。
工作流程:
workflow test {
param([string[]]$vcenters, [string]$session, [string]$username, [string]$password)
foreach -parallel($vcenter in $vcenters){
$main = InlineScript{
Add-PSSnapin VMware.VimAutomation.Core
Connect-VIServer -Server $Using:vcenter -User $Using:username -Password $Using:password
$vms = Get-View -ViewType VirtualMachine -Property Name, Summary.Config.GuestFullName, Runtime.Powerstate, Config.Hardware.MemoryMB, Config.Hardware.NumCPU
ForEach($machine in $vms){
$vm = Get-VM -Server $Using:vcenter -Name $machine.Name -ErrorAction SilentlyContinue
$object = New-Object -Type PSObject -Property ([ordered]@{
Name = $machine.Name
GuestOS = $machine.Summary.Config.GuestFullName
PowerState = $machine.Runtime.PowerState
MemoryGB = ($machine.Config.Hardware.MemoryMB / 1024)
CPU = $machine.Config.Hardware.NumCPU
VLAN=(Get-NetworkAdapter -VM $vm |Sort-Object NetworkName |Select -Unique -Expand NetworkName) -join '; '
})
$object| Export-Csv -Append “C:\TestReports$($vcenter)_TestReport.csv” -NoTypeInformation
}
Disconnect-VIServer - $Using:vcenter -Confirm:$false
}
}
}
通过以下更改,它可能运行得足够快,您不再需要并行或工作流。不确定这些元素是否是重复问题的原因。如果没有,您可能需要从您的环境中分享更多详细信息以获取有关该部分的帮助。
Get-VM
很慢。您为每个 VM 调用一次,我认为您根本不需要它。尝试在连接到 vCenter
$networks = Get-View -ViewType Network
将您的 VLAN=
行替换为
VLAN= $networks | ? {$_.VM.Value -contains $machine.MoRef.value} | select -exp Name
并完全删除您的 $vm = Get-VM
... 行。