Hello,
I wrote this function to get the inventory below on all VMs from VSAN.
The thing is ... it takes like 3 or 4 hours to complete a list of 1000 VM.
Do you know how I can optimize my script so it will proceed faster ?
cmdlet Get-VsanObject is only available in PowerCLI 11.
Function vmStoragePolicy {
param([PSObject]$vmlist)
$list = foreach ($vm in $vmlist){
$vsan = Get-VsanObject -VM $vm | Select VM, Cluster, StoragePolicy, ComplianceStatus
$da = Get-VM $vm | Get-Datastore
[PSCustomObject]@{
"VM" = $vm
"Datastore" = $da.Name
"Cluster" = ($vsan.Cluster.Name | Out-String).Trim()
"Storage Policy" = ($vsan.StoragePolicy.Name | Out-String).Trim()
}
}
return $list
}
$vmlist = Get-Content "/root/vmvsan.txt"
vmStoragePolicy -vm $vmlist | Export-CSV -Delimiter ";" -Path $file
Thanks for your help guys.
Up
Hi,
i think the issue here is two fold.
1. Get-VsanObject -VM $vm
you are looking for the vsanobject associated with the supplied vm name, as no cluster is mentioned the search is performed at the vCenter level every time, which is time consuming.
2. Get-VM $vm
Again the same problem here.
i think using Get-View instead of using get-vm will reduce the time significantly. Will test the shared function and will post the results.
vijayku Thank you for the idea but the request took 10 sec each
I tried and got this:
FYI: $cl return a cluster name and $vm return a vm name
$> date;Get-VsanObject -cluster $cl -VM $vm;date
Fri Feb 22 12:51:21 UTC 2019
ComplianceStatus HealthStatus TimeOfCheck StoragePolicy
---------------- ------------ ----------- -------------
compliant healthy 2/22/19 12:51:29 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:51:29 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:51:29 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:51:29 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:51:29 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:51:29 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:51:29 PM vSAN Storage Policy PF1 SF1...
Fri Feb 22 12:51:31 UTC 2019
-------------------------------------------------------------------------------------------------------------------
$> date;Get-VsanObject -VM $vm;date
Fri Feb 22 12:59:20 UTC 2019
ComplianceStatus HealthStatus TimeOfCheck StoragePolicy
---------------- ------------ ----------- -------------
compliant healthy 2/22/19 12:59:27 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:59:27 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:59:27 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:59:27 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:59:27 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:59:27 PM vSAN Storage Policy PF1 SF1...
compliant healthy 2/22/19 12:59:27 PM vSAN Storage Policy PF1 SF1...
Fri Feb 22 12:59:30 UTC 2019
@Soji42 a suggestion.
If you query vSAN for all of the objects first, it will place the entire list into the variable you designate:
(add this line)
$VsanObjects = Get-VsanObject <- If you're using multiple clusters
or
$VsanObjects = Get-VsanObject -Cluster (Get-Cluster -Name "ClusterName") <- If you're using a specific cluster
Then, instead of querying vSAN (again) for objects as they pertain to the current VM, just query against the variable:
(change this line)
$vsan = Get-VsanObject -VM $vm | Select VM, Cluster, StoragePolicy, ComplianceStatus
(to this line)
$vsan = $VsanObjects | Where-Object {$_.VM -eq $vm) | Select-Object VM, Cluster, StoragePolicy, ComplianceStatus
It could speed things up a bit.
More PowerCLI examples for vSAN can be found in my PowerCLI Cookbook for vSAN:
https://storagehub.vmware.com/section-assets/powercli-cookbook-for-vsan