Now and then I find that I need to retrieve some useful information from a variety of VMs, this usually involves me doing a Get-VM with some selections and criteria to search for. However sometimes the information I require about a VM is listed in the advanced configuration and not as easy to get to with a single cmdlet. I thought it would be really handy to have a PowerCLI function that would easily pull the useful information out for me and summarise it for any given VM or set of VMs.
With that said, I recently read a great blog post by Jonathan Medd (Basic VMware Cluster Compatibility Check), and after reading it I thought it would be a great idea to create a set of functions that provide me with the information I often use. To start, I thought I would do a function that lists the most useful or common information about VMs that I often search for. As well as speeding up the process of retrieving information about VMs, I thought it would also be good PS/PowerCLI practise for me to write more functions. The reason being that I often tend to do PowerCLI reporting scripts rather than actual functions that accept input from the pipeline or other parameters. Below is my function to collect some useful information about Virtual Machines – you can specify a VM with the -VM parameter or pipe a list of VMs to it, using Get-VM | Get-VMUsefulStats. Jonathan’s post also had an interesting section about the order in which output is displayed. You’ll need to pipe the output to Select-Object to change the order the information is fed back in, otherwise it will list the information in the default order. This is not really a problem anyway, just good to know if you are fussy about the order in which the output comes back in!)
So, here is the first function (Get-VMUsefulStats):
[download id=”7″]
function Get-VMUsefulStats { <# .SYNOPSIS Fetches interesting or useful stats about VMware Virtual Machines .DESCRIPTION Fetches interesting or useful stats about VMware Virtual Machines .PARAMETER VM The Name of the Virtual Machine to fetch information about .EXAMPLE PS F:\> Get-VMUsefulStats -VM FS01 .EXAMPLE PS F:\> Get-VM | Get-VMUsefulStats .EXAMPLE PS F:\> Get-VM | Get-VMUsefulStats | Where {$_.Name -match "FS"} .LINK http://www.shogan.co.uk .NOTES Created by: Sean Duffy Date: 18/01/2012 #> [CmdletBinding()] param( [Parameter(Position=0,Mandatory=$true,HelpMessage="Name of the VM to fetch stats about", ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] [System.String] $VMName ) process { $VM = Get-VM $VMName $VMHardwareVersion = $VM.Version $VMGuestOS = $VM.OSName $VMvCPUCount = $VM.NumCpu $VMMemShare = ($VM.ExtensionData.Config.ExtraConfig | Where {$_.Key -eq "sched.mem.pshare.enable"}).Value $VMMemoryMB = $VM.MemoryMB $VMMemReservation = $VM.ExtensionData.ResourceConfig.MemoryAllocation.Reservation $VMUsedSpace = [Math]::Round($VM.UsedSpaceGB,2) $VMProvisionedSpace = [Math]::Round($VM.ProvisionedSpaceGB,2) $VMPowerState = $VM.PowerState New-Object -TypeName PSObject -Property @{ Name = $VMName HW = $VMHardwareVersion VMGuestOS = $VMGuestOS vCPUCount = $VMvCPUCount MemoryMB = $VMMemoryMB MemoryReservation = $VMMemReservation MemSharing = $VMMemShare UsedSpaceGB = $VMUsedSpace ProvisionedGB = $VMProvisionedSpace PowerState = $VMPowerState } } }
You can use the cmdlet to very easily retrieve information about a single VM or list of VMs. Examples:
Get-VMUsefulStats -VM NOOBS-VC01
Get-VM | Get-VMUsefulStats
To format the output in a neat table, pipe the above to Format-Table (ft) like so:
Get-VM | Get-VMUsefulStats | ft
The “MemShare” value is interesting – it is something I was specifically interested in, as some VMs I have worked with in the past have needed memory sharing to be specifically disabled, and this is something that needs to be changed with an advanced parameter on the VM. Therefore most (default) VMs will not have this entry at all and will appear blank in the output. (the parameter I am referring to for those interested is sched.mem.pshare.enable). Of course this most likely won’t be of any use to you, so feel free to omit this bit from the function, or feel free to customise the function to return information useful to your VMware deployment VMs. Here is an example of the output for one VM.
Anyway, I hope someone finds this useful, and please do let me know if you think of any improvements or better way of achieving a certain result.