In an earlier post, I have shared with you a PowerShell script I use to create a report of all VM’s running in our vCenters. In this post you can find a similar script to create a report of all ESXi hosts in our vCenters.
This script will create a report containing the following information on the ESXi host:
- Serial number
- Hostname
- vCenter name
- Datacenter name
- Cluster name
- Manufacturer
- Model
- BIOS version
- Number of physical CPU’s
- CPU type
- Number of cores per CPU
- ESXi version
- ESXi license number
- Amount of memory
- The IP address of the primary DNS server
- The IP address of the secondary DNS server
- The name of the management adapter
- The IP address of the management adapter
- The MTU size of the management adapter
- The name of the vMotion adapter
- The IP address of the vMotion adapter
- The MTU size of the vMotion adapter
- The name of the vSAN adapter
- The IP address of the vSAN adapter
- The MTU size of the vSAN management adapter
(in case you do not use vSAN, you can remove the last three objects from the script)
To use the script, you will need to update variable $ListOfvCenters.
# Import VMware PowerCLI module
If (-not (Get-Module -Name 'VMware.PowerCLI')) {
Import-Module VMware.PowerCLI
}
# Variable declaration
$Report = New-Object System.Collections.ArrayList
$DateTime = $((Get-Date).ToString('yyyy-MM-dd_hh-mm-ss'))
# Set report output path
$OutputPath = "$env:USERPROFILE\Documents\Reports"
If ( -Not (Test-Path -Path $OutputPath)) {
New-Item -ItemType directory -Path $OutputPath
}
$Outputfile = "All-ESXi-hosts-$DateTime"
# Get credentials to use to connect to the vCenter(s)
Clear-Host
$Credentials = Get-Credential -Message "Please enter the username and password to use to connect to the vCenter(s)"
# Connect to vCenter(s)
$ListOfvCenters = (
"<FQDN/IP address of vCenter #1",
"vcenter01.yourdomain.local",
"10.10.10.50"
)
Connect-VIServer $ListOfvCenters -Credential $Credentials -ErrorAction Continue
# Get a list of all ESXi hosts running in the vCenter(s)
$ListOfVMHosts = Get-VMHost | Sort-Object Name
# Get required information for each host
$Count = $ListOfVMHosts.Count
$Counter = 1
Foreach ($VMHost in $ListOfVMHosts) {
Write-Host "Processing host $VMHost.Name [$Counter/$Count]"
$HostHardware = $VMHost | Get-VMHostHardware -SkipAllSslCertificateChecks
$HostNetwork = $VMHost | Get-VMHostNetwork
$HostNetworkvMotionAdapter = $VMHost | Get-VMHostNetworkAdapter -VMKernel | Where-Object { $_.VMotionEnabled -eq $true }
$HostNetworkManagementTrafficAdapter = $VMHost | Get-VMHostNetworkAdapter -VMKernel | Where-Object { $_.ManagementTrafficEnabled -eq $true }
$HostNetworkvSANTrafficAdapter = $VMHost | Get-VMHostNetworkAdapter -VMKernel | Where-Object { $_.VsanTrafficEnabled -eq $true }
$MemoryTotalGB = [math]::Round($VMHost.MemoryTotalGB)
$Object = [PSCustomObject]@{
SerialNumber = $HostHardware.SerialNumber
HostName = $VMHost.Name
vCenter = $VMHost.Uid.Substring($VMHost.Uid.IndexOf('@') + 1).Split(":")[0]
DataCenter = ($VMHost | Get-Datacenter)
Cluster = $VMHost.Parent
Manufacturer = $VMHost.Manufacturer
Model = $VMHost.Model
Bios = $HostHardware.BiosVersion
CPU = $HostHardware.CpuCount
Processor = $VMHost.ProcessorType
CPUCores = $HostHardware.CpuCoreCountTotal
ESXVersion = $VMHost.ExtensionData.Summary.Config.Product.FullName
ESXLicenseKey = $VMHost.LicenseKey
MemoryGB = $MemoryTotalGB
DNS1 = $HostNetwork.DnsAddress[0]
DNS2 = $HostNetwork.DnsAddress[1]
Gateway = $HostNetwork.VMKernelGateway
ManagementDevice = $HostNetworkManagementTrafficAdapter.name
ManagementIP = $HostNetworkManagementTrafficAdapter.ip
ManagementMTU = $HostNetworkManagementTrafficAdapter.mtu
vMotionDevice = $HostNetworkvMotionAdapter.name
vMotionIP = $HostNetworkvMotionAdapter.ip
vMotionMTU = $HostNetworkvMotionAdapter.mtu
vSANDevice = $HostNetworkvSANTrafficAdapter.name
vSANIP = $HostNetworkvSANTrafficAdapter.ip
vSANMTU = $HostNetworkvSANTrafficAdapter.mtu
}
$Report.add($Object) | Out-Null
$Counter++
}
$Report | Export-Csv "$Outputfile.csv" -NoTypeInformation -UseCulture
$DefaultVIServers | Disconnect-VIServer -Confirm:$False
As always, please keep in mind this script is tailored to my environment, but can be used as a template for your environment. I do not pretend to be a PowerShell guru and as such my script may not be perfect. I am open to suggestions 🙂 . If you found this script useful, I’d appreciate it if you leave a comment.