VMWare CLI

Project Onyx

Very cool tool to find the PowerCLI Code you need 

http://blogs.vmware.com/vipowershell/2009/11/project-onyx-is-here.html

List of Performance Counters

http://www.lucd.info/2009/12/30/powercli-vsphere-statistics-part-1-the-basics/

https://communities.vmware.com/docs/DOC-5600

http://www.vmware.com/support/developer/vc-sdk/visdk25pubs/ReferenceGuide/vim.PerformanceManager.html

http://www.vmware.com/support/developer/vc-sdk/visdk25pubs/ReferenceGuide/mem.html

list of commands related to stats

Get-Command -Module "VMware.VimAutomation.Core" *stat*

Get a list of stats available for a vm or host

Get-StatType -Entity servername  Get-StatInterval Get-StatType -Entity servername -Interval "Past Day"

Get-vm servername | Get-Stat -Stat mem.active.average -Start (Get-Date).AddHours(-2)-IntervalMins 5

Peak memory usage over past 24 hours in gb

(Get-vm servername | Get-Stat -Stat mem.active.average -Start (Get-Date).AddHours(-24) | Measure-Object -Property Value -Maximum).Maximum * 1kb / 1gb

If you change the interval units you can get older data

Get-vm servername | Get-Stat -Stat mem.usage.average -Start (Get-Date).AddHours(-168) -IntervalMins 60 | sort timestamp | select -First 5

„

http://www.vmware.com/support/developer/vc-sdk/visdk400pubs/sdk40programmingguide.pdf

Table 12-5. Default Sampling Periods and Retention

CPU Ready

$vms= get-vm -Location NewYork #% CPU Ready = (CPU Ready / stat interval in milliseconds ) * 100 #( 30 min x 60 seconds * 1000 = 1800000 milliseconds ) * 100 to get percent, so we use 18000 as our divisor $VMCPUReady = Get-Stat -Entity (get-vm $vms ) -Stat cpu.ready.summation -start (get-date).adddays(-7) -finish (get-date) -interval 30 -instance "" -ea silentlycontinue | group entity |     select Name, @{Name="CPU Ready Avg"; Expression= {[Math]::Round($($_.group | measure -property value -average).average,0)}},    @{Name="% CPU Ready"; Expression= {[Math]::Round(($($_.group | measure -property value -average).average) / 18000 ,2)}} ($VMCPUReady | measure -Sum -Property "CPU Ready Avg").sum $VMCPUReady

PowerCLI property for vSphere client GUI Cluster "Current Failover Capacity"

This seems to be the right property $cluster.ExtensionData.Summary.CurrentFailoverLevel

Get-Cluster | select name, @{Name="Current Failover Capacity"; Expression={$_.ExtensionData.Summary.CurrentFailoverLevel}} | ft -auto

„

 

Add-PSSnapin VMware.VimAutomation.Core

Get-Command -Module "VMware.VimAutomation.Core"

$cred = Get-Credential

Connect-VIServer -Server servername -Credential $cred

$VMs = Get-VM 

$VMs | measure

$Tiers = Import-Csv C:\scripts\PowerShell\VMWare\VMTiers.csv 

$Tiers | select name, tier

foreach ($server in $tiers) 

{

     Get-VM $server.name | Set-Annotation -CustomAttribute "Tier" -Value $server.tier

}

$vmhosts = Get-VMHost | Get-View $vmhosts = get-view (Get-VMHost) $VMHosts | select name, @{Name="Vendor";Expression={$_.summary.hardware.vendor}}, @{Name="Model";Expression={$_.summary.hardware.Model}}

$Snapshots = Get-Snapshot -VM * 

$Snapshots | select VM, Name, Description, SizeMB, Created

Email a list of VM Snapshots

Look into issue with scheduled tasks not running evidently this was fixed in PowerCLI 4 Update 1

http://communities.vmware.com/thread/240979

IF (Get-PSSnapin | where {$_.name -eq "VMware.VimAutomation.Core"}) 

    {write-host "VMware.VimAutomation.Core snapin already loaded"}

Else

    {add-PSSnapin  VMware.VimAutomation.Core}

Function check-even ($num) {[bool]!($num%2)}

$smtpServer = "mail.blah.com"

$To = "Kevin Curran <kcurran@blah.com>"

$From = "AD Reporting <ADReporting@blah.com>"

#Scheduled Task fails because connect-viserver does not use the credentials of the user running the task for some reason

#Connect-VIServer -Server servername

#http://www.powershellcommunity.org/Forums/tabid/54/aft/4295/Default.aspx

$creds = Get-VICredentialStoreItem -file "C:\Scripts\VMWare\CredFile.xml" 

Connect-viserver -Server $creds.Host -User $creds.User -Password $creds.Password 

$Snapshots = Get-Snapshot -VM * 

#$Snapshots | select VM, Name, Description, SizeMB, Created

$PreMessage = @" 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>HTML TABLE</title>

<style>

    BODY{background-color:white;}

    TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}

    TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:MidnightBlue; color:Yellow}

    TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:PaleGoldenrod}

    TR.D0 TD {background-color: White; color: black;}

TR.D1 TD {background-color: LawnGreen; color: black;}

</style>

</head><body>

“@

$PostMessage += "This script was run by " + $env:username + " on " + $env:COMPUTERNAME

$PostMessage += "<br>ScriptName: $($MyInvocation.MyCommand) "

$PostMessage += "<br>Script path: $(Split-Path -Parent $MyInvocation.MyCommand.Path)"

$PostMessage += "</body></html>"

$Message= $Snapshots | sort -Property VM | ConvertTo-Html -Property VM, Name, Description, SizeMB, Created -PreContent `

    "Please review the list and remove any unnecessary snapshots, VMWare recommends snapshots not to exceed 2 GB. <H2>Updated list of VM Snapshots </H2>" | ForEach-Object {$_}

$ModifiedHTML=ForEach ($line in $Message)

{

    $counter++

    if (check-even $counter)

     {$line.replace('<tr><td>','<tr class="d0"><td>')}

    Else

     {$line.replace('<tr><td>','<tr class="d1"><td>')}

}

$html = $PreMessage + $($ModifiedHTML | out-string) + $PostMessage

Send-MailMessage -From $From -To $To -SmtpServer $smtpServer `

-Subject "Snapshot Cleanup Time" -BodyasHTML $HTML

Guest NICs disconnected after upgrade    

http://www.patrickkremer.com/?p=64

$foo=Get-NetworkAdapter -VM server

$foo.ConnectionState.StartConnected

$foo.ConnectionState.Connected

Get VM ToolsVersion

http://jdhitsolutions.com/blog/2010/04/powercli-get-vmtoolsversion/

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"

    }

$smtpServer = "mail.blah.com"

$To = "Kevin Curran <kcurran@blah.com>"

$From = "AD Reporting <ADReporting@blah.com>"

$Attachement = "C:\Scripts\VMWare\VMTools.csv"

#Scheduled Task fails because connect-viserver does not use the credentials of the user running the task for some reason

#Connect-VIServer -Server servername

#http://www.powershellcommunity.org/Forums/tabid/54/aft/4295/Default.aspx

#$creds = Get-VICredentialStoreItem -file "C:\Scripts\VMWare\CredFile.xml" 

#Connect-viserver -Server $creds.Host -User $creds.User -Password $creds.Password 

#Issue fixed in PowerCLI Version 4.1.1

Connect-VIServer -Server servername

#http://jdhitsolutions.com/blog/2010/04/powercli-get-vmtoolsversion/

Function Get-VMToolsVersion 

{

[cmdletbinding()]            

Param (

     [Parameter(Position=0, Mandatory=$True, ValueFromPipeline=$True,

     HelpMessage="You must specify a virtual machine object")]

     [VMWare.VimAutomation.Client20.VirtualMachineImpl[]]$vm

    )            

Begin {

    Write-Verbose "Starting function"

}            

Process {

    Write-Verbose "Getting view for $($vm.name)"

    $view=Get-View -viObject $vm            

    $ToolsVersion=$view.Config.Tools.ToolsVersion

    write-verbose "Found tools version value of $ToolsVersion"

    $vm | Add-Member -MemberType NoteProperty -Name "ToolsVersion" `

-Value $toolsVersion -passthru            

}            

End {

    Write-Verbose "Ending function"

}            

}

$VMTools = get-vm | get-vmtoolsversion

$VMTools | select Name, ToolsVersion, PowerState, Host, Description, Notes, NumCpu, MemoryMB | Export-Csv -NoTypeInformation $Attachement

$HTML= $VMTools | Group-Object -Property ToolsVersion | select Count, Name | ConvertTo-Html | Out-String

Send-MailMessage -From $From -To $To -SmtpServer $smtpServer `

-Subject "VM Tools Versions" -BodyasHTML $HTML -Attachments $Attachement

blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah

Check for lockdown mode

get-vmhost | select Name,@{N="LockDown";E={$_.Extensiondata.Config.adminDisabled}} | ft -auto Name, LockDown

$VMHost = Get-VMHost esx10.blah.com

$VMHostView = $VMHost | Get-View

If ($VMHost.ExtensionData.Config.AdminDisabled -eq $true) {$VMHostView.ExitLockdownMode()}

$VMHostView.EnterLockdownMode()

Get-Cluster | Select Name, @{N="Host Monitoring Status";E={$_.Extensiondata.Configuration.DasConfig.HostMonitoring}}

List count of VMs per Datastore

$VMs = Get-VM | Select Name, @{N="Folder";E={$_.Folder.Name}}, @{N="DatastoreIdList";E={$_.DatastoreIdList}}

$vms | Group-Object -Property DatastoreIdList | select Count, @{N="Datastores";E={[string]::Join(',',(Get-Datastore -Id $_.Name.split(" ")| Select -ExpandProperty Name))}}

List count of VMs esx host and datastore

Get-VM servers* | select name, vmhost, @{N="Datastore";E={get-datastore -id $_.DatastoreIdList}}

Get-VM servers* | select name, vmhost, @{N="Datastore";E={[string]::join(",",(get-datastore -id $_.DatastoreIdList | select -ExpandProperty name))}}

List vm name and IP address

Get-VM server | Select name,@{N=”IP Address”;E={@($_.guest.IPAddress[0])}}