title:Using PowerCLI to list Linux VMs and Datacenter Locations
tags:["all", "vmware", "powercli", "powershell"]

Technology keeps moving but this post has not.

What you're about to read hasn't been updated in more than a year. The information may be out of date. Let me know if you see anything that needs fixing.

I recently needed to export a list of all the Linux VMs in a rather large vSphere environment spanning multiple vCenters (and the entire globe), and I wanted to include information about which virtual datacenter each VM lived in to make it easier to map VMs to their physical location.

I've got a Connect-vCenters function that I use to quickly log into multiple vCenters at once. That then enables me to run a single query across the entire landscape - but what query? There isn't really a direct way to get datacenter information out of the results generated by Get-VM; I could run an additional Get-Datacenter query against each returned VM object but that doesn't sound very efficient.

What I came up with is using Get-Datacenter to enumerate each virtual datacenter, and then list the VMs matching my query within:

1$linuxVms = foreach( $datacenter in ( Get-Datacenter )) {
2 Get-Datacenter $datacenter | Get-VM | Where { $_.ExtensionData.Config.GuestFullName -notmatch "win" -and $_.Name -notmatch "vcls" } | `
3 Select @{ N="Datacenter";E={ $datacenter.Name }},
4 Name,
5 Notes,
6 @{ N="Configured OS";E={ $_.ExtensionData.Config.GuestFullName }}, # OS based on the .vmx configuration
7 @{ N="Running OS";E={ $_.Guest.OsFullName }}, # OS as reported by VMware Tools
8 @{ N="Powered On";E={ $_.PowerState -eq "PoweredOn" }},
9 @{ N="IP Address";E={ $_.ExtensionData.Guest.IpAddress }}
11$linuxVms | Export-Csv -Path ./linuxVms.csv -NoTypeInformation -UseCulture

This gave me a CSV export with exactly the data I needed.

Celebrate this post: