145 lines
6.2 KiB
PowerShell
145 lines
6.2 KiB
PowerShell
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
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
} |