Following on from collecting VM Host inventory information (http://wp.me/p15Mdc-mC), I am now looking into returning inventory information for all the VMs where the following would be retrieved:
- Name
- Host
- vCPUs
- Memory (MB)
- CPU Reservation
- CPU Limit
- CPU Share Allocation
- Memory Reservation
- Memory Limt
- Memory Share Allocation
- Operating System
- Annotations
In order to invoke the PowerCLI cmdlets we will need to add the snap-ins to the current powershell session and connect to the vCenter server (in the below example this is named ‘server.domain.local’).
if (-not (Get-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue)) { Add-PSSnapin VMware.VimAutomation.Core > $null } Connect-VIServer server.domain.local
Firstly, we will create an array to hold a list of items and build of a collection of VMs using the Get-VM cmdlet:
[array]$VMIs=@() ForEach ($VM in Get-VM)
For each VM returned in the collection we will create a new powershell object and store this as a variable to export the returned data to a CSV file and add properties to return the above information:
{ $VMI = New-Object PsObject Add-Member -InputObject $VMI -MemberType NoteProperty -Name Name -Value $VM.Name Add-Member -InputObject $VMI -MemberType NoteProperty -Name "Host" -Value $VM.Host Add-Member -InputObject $VMI -MemberType NoteProperty -Name "vCPUs" -Value $VM.NumCPU Add-Member -InputObject $VMI -MemberType NoteProperty -Name "Memory (MB)" -Value $VM.MemoryMB Add-Member -InputObject $VMI -MemberType NoteProperty -Name "CPU Reservation" -Value $VM.ExtensionData.ResourceConfig.CpuAllocation.Reservation Add-Member -InputObject $VMI -MemberType NoteProperty -Name "CPU Limit" -Value $VM.ExtensionData.ResourceConfig.CpuAllocation.Limit Add-Member -InputObject $VMI -MemberType NoteProperty -Name "CPU Share Allocation" -Value $VM.ExtensionData.ResourceConfig.CpuAllocation.Shares.Level Add-Member -InputObject $VMI -MemberType NoteProperty -Name "Memory Reservation" -Value $VM.ExtensionData.ResourceConfig.MemoryAllocation.Reservation Add-Member -InputObject $VMI -MemberType NoteProperty -Name "Memory Limit" -Value $VM.ExtensionData.ResourceConfig.CpuAllocation.Limit Add-Member -InputObject $VMI -MemberType NoteProperty -Name "Memory Share Allocation" -Value $VM.ExtensionData.ResourceConfig.MemoryAllocation.Shares.Level Add-Member -InputObject $VMI -MemberType NoteProperty -Name "Operating System" -Value $VM.Guest.OSFullName
Part of my requirement is to return all the virtual machine type annotations, we will do this by returning all the available Annotations keys and create a column for each and display the data associated with that key.
ForEach ($CustomField in $VM.Customfields) { Add-Member -InputObject $VMI -MemberType NoteProperty -Name $CustomField.Key -Value $CustomField.Value }
Finally, we will export the data collected in the array into a CSV file, as I want the output to create a unique filename each time the inventory script is invoked to the output folder D:\Output, I will use the Guid.NewGuid method when specifying a filename.
$VMIs+=$VMI } $VMIs | Export-Csv -NoTypeInformation -UseCulture -Path ("D:\Output\" + [guid]::NewGuid() + "-inv_vms.csv")