diff --git a/Scripts/Apply-OMRightsizing.ps1 b/Scripts/Apply-OMRightsizing.ps1 new file mode 100644 index 0000000..3972d4a --- /dev/null +++ b/Scripts/Apply-OMRightsizing.ps1 @@ -0,0 +1,145 @@ +function Apply-OMRightsizing { +<# + .NOTES + =========================================================================== + Created by: Markus Kraus + =========================================================================== + Changelog: + 2020.07 ver 1.0 Base Release + =========================================================================== + External Code Sources: + - + =========================================================================== + Tested Against Environment: + vSphere Version: vSphere 6.7 U3 + PowerCLI Version: PowerCLI 11.5 + PowerShell Version: 5.1 + OS Version: Windows 10 + Keyword: vSphere, vRealize, Rightsizing + =========================================================================== + + .DESCRIPTION + This function views or applies rightsizing recommendations from vRealize Operations to your vSphere VMs. + + .Example + Get-VM -Name test-* | Get-OMResource | Apply-OMRightsizing -ViewOnly | Sort-Object DownSizeMemGB, DownSizeCPU -Descending | Format-Table -AutoSize + + .Example + Get-VM -Name test-* | Get-OMResource | Apply-OMRightsizing -Apply -NoUpsizing + + .PARAMETER OMResources + vRealize Operations Ressources to process + + .PARAMETER ViewOnly + View Recommendations + + .PARAMETER Apply + Apply Recommendations + + .PARAMETER NoUpsizing + Apply only Downsizing Recommendations + +#Requires PS -Version 5.1 +#Requires -Modules VMware.VimAutomation.Core, @{ModuleName="VMware.VimAutomation.Core";ModuleVersion="11.5.0.0"} +#> + + [CmdletBinding()] + param( + [Parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0, HelpMessage = "OM Ressources to process")] + [ValidateNotNullorEmpty()] + $OMResources, + [Parameter(Mandatory=$False, ValueFromPipeline=$False, ParameterSetName="ViewOnly", HelpMessage = "View Recommendations")] + [Switch] $ViewOnly, + [Parameter(Mandatory=$False, ValueFromPipeline=$False, ParameterSetName="Apply", HelpMessage = "Apply Recommendations")] + [Switch] $Apply, + [Parameter(Mandatory=$False, ValueFromPipeline=$False, ParameterSetName="Apply", HelpMessage = "Apply only Downsizing Recommendations")] + [Switch] $NoUpsizing + ) + Process { + if ($ViewOnly -or $Apply){ + "Collecting Report ..." + + $View = @() + + foreach ($OMResource in $OMResources){ + $DownSize = ($OMResource | Get-OMStat -Key "summary|oversized" -From ([DateTime]::Now).AddMinutes(-120) | Select-Object -Last 1).Value + $UpSize = ($OMResource | Get-OMStat -Key "summary|undersized" -From ([DateTime]::Now).AddMinutes(-120) | Select-Object -Last 1).Value + + # Mem is in KB + if($DownSize -gt 0){ + $DownSizeMem = ($OMResource | Get-OMStat -Key "summary|oversized|memory" -From ([DateTime]::Now).AddMinutes(-120) | Select-Object -Last 1).Value + $DownSizeCPU = ($OMResource | Get-OMStat -Key "summary|oversized|vcpus" -From ([DateTime]::Now).AddMinutes(-120) | Select-Object -Last 1).Value + } + else { + $DownSizeMem = 0 + $DownSizeCPU = 0 + } + + # Mem is in KB + if($UpSize -gt 0){ + $UpSizeMem = ($OMResource | Get-OMStat -Key "summary|undersized|memory" -From ([DateTime]::Now).AddMinutes(-120) | Select-Object -Last 1).Value + $UpSizeCPU = ($OMResource | Get-OMStat -Key "summary|undersized|vcpus" -From ([DateTime]::Now).AddMinutes(-120) | Select-Object -Last 1).Value + } + else { + $UpSizeMem = 0 + $UpSizeCPU = 0 + } + + $Report = [PSCustomObject] @{ + Name = $OMResource.name + DownSize = $DownSize + UpSize = $UpSize + DownSizeMem = $DownSizeMem + DownSizeMemGB = [Math]::Round(($DownSizeMem / 1048576), 0) + DownSizeCPU = $DownSizeCPU + UpSizeMem = $UpSizeMem + UpSizeMemGB = [Math]::Round(($UpSizeMem / 1048576), 0) + UpSizeCPU = $upSizeCPU + + } + $View += $Report + } + + } + if ($ViewOnly){ + $View + } + if ($Apply){ + foreach ($Object in $View) { + + if ($Object.DownSize -gt 0 -or $Object.UpSize -gt 0){ + "Processing '$($Object.Name)' ..." + $VM = Get-VM -Name $Object.Name + "Shut down '$($Object.Name)' ..." + $VM | Shutdown-VMGuest -Confirm:$False + $i = 0 + while((Get-VM -Name $VM.Name).PowerState -eq "PoweredOn"){ + $i++ + Start-Sleep 1 + Write-Progress -Activity "Check PowerState" -Status "Wait for PowerState Task..." + } + "Create Snapshot for '$($Object.Name)' ..." + $VM | New-Snapshot -Name "Pre Resize" -Memory:$false -Quiesce:$false + if ($Object.DownSize -gt 0){ + "Downsize '$($Object.Name)' ..." + $VM | Set-VM -NumCPU $($VM.NumCpu - $Object.DownSizeCPU) -MemoryGB $($VM.MemoryGB - $Object.DownSizeMemGB) -Confirm:$False + + } + if ($Object.UpSize -gt 0 -and $NoUpsizing -eq $False){ + "Upsize '$($Object.Name)' ..." + $VM = Get-VM -Name $Object.Name + $VM | Set-VM -NumCPU $($VM.NumCpu + $Object.UpSizeCPU) -MemoryGB $($VM.MemoryGB + $Object.UpSizeMemGB) -Confirm:$False + + } + #$VM = Get-VM -Name $Object.Name + #$VM | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuReservationMhz $($VM.NumCpu * 200) -MemReservationGB $($VM.MemoryGB / 2) -Confirm:$False + "Power on '$($Object.Name)' ..." + $VM | Start-VM -Confirm:$False + } + + } + + } + + } +} \ No newline at end of file