Powershell‎ > ‎VMWare CLI‎ > ‎

VM Host Stats



@"
===============================================================================
Title:         Export-VMHostInfo.ps1
Description:   Exports VM Information from vCenter into a .CSV file for importing into anything
Usage:         .\Export-VMHosts.ps1
Date:          02/07/2012
===============================================================================
"@
 
IF (Get-PSSnapin | where {$_.name -eq "VMware.VimAutomation.Core"}) 
    {write-host "VMware.VimAutomation.Core snapin already loaded"}
Else
{
    write-host "Loading VMware.VimAutomation.Core snapin"
    add-PSSnapin  VMware.VimAutomation.Core
    write-host "VMware.VimAutomation.Core snapin Loaded"
}
    
$VirtualCenters= "vmvc1","vmvc2"
$Report = @()
$ExportFilePath = "c:\temp\Export-VMHostInfo.csv"

$smtpServer = "mail.blah.com"
$To = "Kevin Curran <kcurran@blah.com>"
$From = "AD Reporting <ADReporting@blah.com>"
#Need to store creds for local account for Ugly hack bellow to get Serial Number from host
$VMHostCreds = Get-VICredentialStoreItem -file "C:\Scripts\VMWare\HostCredFile.xml" 

foreach ($VC in $VirtualCenters)
{
    Connect-VIServer $VC
        
    $VMHostMachines = Get-VMHost
        
    #collect VM data for attached list of vms
    ForEach ($VMHost in $VMHostMachines) {
        $counter ++
        Write-Host -ForegroundColor Green "$counter Currently querying $($VMHost.name) "
        $VMHostView = $VMHost | Get-View 
        $AssetTag = $($VMHostView.Hardware.SystemInfo.OtherIdentifyingInfo | 
            where {$_.IdentifierType.Key -eq "AssetTag" }).IdentifierValue
        $Serial = $($VMHostView.Hardware.SystemInfo.OtherIdentifyingInfo | 
            where {$_.IdentifierType.Key -eq "ServiceTag" }).IdentifierValue
        $Location = switch ((Get-Datacenter -VMHost $VMHost).Name) 
        { 
            "LADC" {"LA"} 
            "NYDC" {"NY"} 
            "CDC" {"Chicago"}
            "FDC" {"Florida"} 
            default {$_}
        }
        
        $Annotation = $VMHost | Get-Annotation
        $HostInfo = {} | Select "Allocation Code","Asset","Asset Tag","Build Template",
            "Business Owner","Change Management","Cluster Group","Date CI Last Audited",
            "Department","Description","Disk Drives","DR Target","Drive Partitions",
            "Environment","Highly Available","Impact Level","IP Address","Line of Business",
            "MAC Address","Maintenance Contract ID","Maintenance Window","Manufacturer",
            "Memory","Model","Name","Operating System","Physical Location",
            "Primary Support Group","Processor Details","Purchase Date","Resides on Chassis #",
            "Resides on Rack #","Retired Date","Serial Number","SLA ID","Supplier","vSphereServer","Warranty Expiration Date"
            
        $HostInfo."Allocation Code" =
        $HostInfo."Asset" = "Yes"
        $HostInfo."Asset Tag" = $AssetTag
        $HostInfo."Build Template" = ""
        $HostInfo."Business Owner" = "Operations"
        $HostInfo."Change Management" = "Managed"
        $HostInfo."Cluster Group" = $VMHost.Parent.Name
        $HostInfo."Date CI Last Audited" = ""
        $HostInfo."Department" = "Information Technology"
        $HostInfo."Description" = ""
        $HostInfo."Disk Drives" = ""
        $HostInfo."DR Target" = "None"
        $HostInfo."Drive Partitions" = ""
        $HostInfo."Environment" = "PROD"
        $HostInfo."Highly Available" = "No"
        $HostInfo."Impact Level" = "Critical"
        #Ugly can't find how to get ip from powercli
        $HostInfo."IP Address" = (Test-Connection -Count 1 $VMHost.name).IPV4Address.IPAddressToString 
        $HostInfo."Line of Business" = ""
        $HostInfo."MAC Address" = ""
        $HostInfo."Maintenance Contract ID" =
        $HostInfo."Maintenance Window" ="Every Thursday 9pm-12am"
        $HostInfo."Manufacturer" = $VMHost.Manufacturer
        $HostInfo."Memory" = $VMHost.MemoryTotalMB
        $HostInfo."Model" = $VMHost.Model
        $HostInfo."Name" = $VMHost.name
        $HostInfo."Operating System" = $VMHostView.Config.Product.FullName
        $HostInfo."Physical Location" = $Location
        $HostInfo."Primary Support Group" = "Wintel"
        $HostInfo."Processor Details" = $VMHost.ProcessorType
        $HostInfo."Purchase Date" = ""
        $HostInfo."Resides on Chassis #" = ""
        $HostInfo."Resides on Rack #" = ""
        $HostInfo."Retired Date" = ""
        $HostInfo."Serial Number" = $Serial
        $HostInfo."SLA ID" = ""
        $HostInfo."Supplier" = ""
        $HostInfo."vSphereServer" = $VC
        $HostInfo."Warranty Expiration Date" = ""
        
        $Report += $HostInfo
    }
    Disconnect-VIServer -Confirm:$False
}

$Report = $Report | Sort-Object Name

foreach ($Server in $Report) 
{
    #Ugly Hack because of a bug where vsphere powerCLI intermittently can't get the serial number 
    #even though it is visible on the Hardware Status tab of the esx host
    if ($Server.Serial -eq $null) 
    {
        #Check if Lockdown mode is enable if so disable it
        Connect-VIServer $Server.vSphereServer
        $VMHost = Get-VMHost -Name $Server.Name
        $VMHostView = $VMHost | Get-View 
        If ($VMHost.ExtensionData.Config.AdminDisabled -eq $true) {$VMHostView.ExitLockdownMode()}
        Disconnect-VIServer -Confirm:$False
        Connect-VIServer $VMHost.Name -User $VMHostCreds.User -Password $VMHostCreds.Password
        #$ESXHostView = Get-Vmhost $VMHost.Name | Get-View
        $Server."Asset Tag" = ((Get-Vmhost $VMHost.Name | Get-View).Hardware.SystemInfo.OtherIdentifyingInfo | 
            where {$_.IdentifierType.Key -eq "AssetTag"}).IdentifierValue 
        $Server."Serial Number" = ((Get-Vmhost $VMHost.Name | Get-View).Hardware.SystemInfo.OtherIdentifyingInfo | 
            where {$_.IdentifierType.Key -eq "ServiceTag"}).IdentifierValue 
        Disconnect-VIServer -Confirm:$False
        Connect-VIServer $Server.vSphereServer
        #seems like i need to recreate $VMHostView after the disconnect
        $VMHostView = $VMHost | Get-View
        $VMHostView.EnterLockdownMode()
        Disconnect-VIServer -Confirm:$False
    }
    #Modify name of host to not include domain name
    $Server.Name = $Server.name.split(".")[0]
}

#Export VM List Report to a File to attach to email
IF ($Report -ne "") 
{
    $report | Export-Csv $ExportFilePath -NoTypeInformation
    #Send Message
    Send-MailMessage -From $From -To $To -SmtpServer $smtpServer `
     -Subject "VM Hosts" -Attachments $ExportFilePath
}



 
 





Comments