Add enhancements to module VMCPFunctions

This commit is contained in:
equelin
2016-10-11 16:50:15 +02:00
parent c566e68293
commit 19ff0ea26a

View File

@@ -7,58 +7,90 @@
Twitter: @vBrianGraf Twitter: @vBrianGraf
VMware Blog: blogs.vmware.com/powercli VMware Blog: blogs.vmware.com/powercli
Personal Blog: www.vtagion.com Personal Blog: www.vtagion.com
Modified on: 10/11/2016
Modified by: Erwan Quélin
Twitter: @erwanquelin
Github: https://github.com/equelin
=========================================================================== ===========================================================================
.DESCRIPTION .DESCRIPTION
This function will allow users to view the VMCP settings for their clusters This function will allow users to view the VMCP settings for their clusters
.Example .PARAMETER Cluster
# This will show you the VMCP settings of your cluster Cluster Name or Object
.PARAMETER Server
vCenter server object
.EXAMPLE
Get-VMCPSettings
This will show you the VMCP settings for all the clusters
.EXAMPLE
Get-VMCPSettings -cluster LAB-CL Get-VMCPSettings -cluster LAB-CL
.Example This will show you the VMCP settings of your cluster
# This will show you the VMCP settings of your cluster
Get-VMCPSettings -cluster (Get-Cluster Lab-CL) .EXAMPLE
Get-VMCPSettings -cluster (Get-Cluster Lab-CL)
This will show you the VMCP settings of your cluster
.EXAMPLE
Get-Cluster | Get-VMCPSettings
This will show you the VMCP settings for all the clusters
#> #>
[CmdletBinding()] [CmdletBinding()]
param param
( (
[Parameter(Mandatory=$True, [Parameter(Mandatory=$False,
ValueFromPipeline=$True, ValueFromPipeline=$True,
ValueFromPipelineByPropertyName=$True, ValueFromPipelineByPropertyName=$True,
HelpMessage='What is the Cluster Name?')] HelpMessage='What is the Cluster Name?')]
$cluster $cluster = (Get-Cluster -Server $Server),
)
Begin { [Parameter(Mandatory=$False)]
# Determine input and convert to ClusterImpl object [VMware.VimAutomation.Types.VIServer[]]$Server = $global:DefaultVIServers
Switch ($cluster.GetType().Name) )
{
"string" {$CL = Get-Cluster $cluster} Process {
"ClusterImpl" {$CL = $cluster}
Foreach ($Clus in $Cluster) {
Write-Verbose "Processing Cluster $($Clus.Name)"
# Determine input and convert to ClusterImpl object
Switch ($Clus.GetType().Name)
{
"string" {$CL = Get-Cluster $Clus -Server $Server -ErrorAction SilentlyContinue}
"ClusterImpl" {$CL = $Clus}
}
If ($CL) {
# Work with the Cluster View
$ClusterMod = Get-View -Id "ClusterComputeResource-$($CL.ExtensionData.MoRef.Value)" -Server $Server
# Create Hashtable with desired properties to return
$properties = [ordered]@{
'Cluster' = $ClusterMod.Name;
'VMCP Status' = $clustermod.Configuration.DasConfig.VmComponentProtecting;
'Protection For APD' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmStorageProtectionForAPD;
'APD Timeout Enabled' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.EnableAPDTimeoutForHosts;
'APD Timeout (Seconds)' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmTerminateDelayForAPDSec;
'Reaction on APD Cleared' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmReactionOnAPDCleared;
'Protection For PDL' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmStorageProtectionForPDL
}
# Create PSObject with the Hashtable
$object = New-Object -TypeName PSObject -Prop $properties
# Show object
$object
}
} }
} }
Process {
# Work with the Cluster View
$ClusterMod = Get-View -Id "ClusterComputeResource-$($cl.ExtensionData.MoRef.Value)"
# Create Hashtable with desired properties to return
$properties = [ordered]@{
'Cluster' = $ClusterMod.Name;
'VMCP Status' = $clustermod.Configuration.DasConfig.VmComponentProtecting;
'Protection For APD' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmStorageProtectionForAPD;
'APD Timeout Enabled' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.EnableAPDTimeoutForHosts;
'APD Timeout (Seconds)' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmTerminateDelayForAPDSec;
'Reaction on APD Cleared' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmReactionOnAPDCleared;
'Protection For PDL' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmStorageProtectionForPDL
}
# Create PSObject with the Hashtable
$object = New-Object -TypeName PSObject -Prop $properties
# Show object
return $object
}
End {}
} }
function Set-VMCPSettings { function Set-VMCPSettings {
@@ -70,151 +102,185 @@ function Set-VMCPSettings {
Twitter: @vBrianGraf Twitter: @vBrianGraf
VMware Blog: blogs.vmware.com/powercli VMware Blog: blogs.vmware.com/powercli
Personal Blog: www.vtagion.com Personal Blog: www.vtagion.com
Modified on: 10/11/2016
Modified by: Erwan Quélin
Twitter: @erwanquelin
Github: https://github.com/equelin
=========================================================================== ===========================================================================
.DESCRIPTION .DESCRIPTION
This function will allow users to enable/disable VMCP and also allow This function will allow users to enable/disable VMCP and also allow
them to configure the additional VMCP settings them to configure the additional VMCP settings
For each parameter, users should use the 'Tab' button to auto-fill the For each parameter, users should use the 'Tab' button to auto-fill the
possible values. possible values.
.Example .PARAMETER Cluster
# This will enable VMCP and configure the Settings Cluster Name or Object
.PARAMETER enableVMCP
Enable or disable VMCP
.PARAMETER VmStorageProtectionForPDL
VM Storage Protection for PDL settings. Might be:
- disabled
- warning
- restartAggressive
.PARAMETER VmStorageProtectionForAPD
VM Storage Protection for APD settings. Might be:
- disabled
- restartConservative
- restartAggressive
- warning
.PARAMETER VmTerminateDelayForAPDSec
VM Terminate Delay for APD (seconds).
.PARAMETER VmReactionOnAPDCleared
VM reaction on APD Cleared. Might be:
- reset
- none
.PARAMETER Server
vCenter server object
.EXAMPLE
Set-VMCPSettings -cluster LAB-CL -enableVMCP:$True -VmStorageProtectionForPDL ` Set-VMCPSettings -cluster LAB-CL -enableVMCP:$True -VmStorageProtectionForPDL `
restartAggressive -VmStorageProtectionForAPD restartAggressive ` restartAggressive -VmStorageProtectionForAPD restartAggressive `
-VmTerminateDelayForAPDSec 2000 -VmReactionOnAPDCleared reset -VmTerminateDelayForAPDSec 2000 -VmReactionOnAPDCleared reset
.Example This will enable VMCP and configure the Settings on cluster LAB-CL
# This will disable VMCP and configure the Settings
.EXAMPLE
Set-VMCPSettings -cluster LAB-CL -enableVMCP:$False -VmStorageProtectionForPDL ` Set-VMCPSettings -cluster LAB-CL -enableVMCP:$False -VmStorageProtectionForPDL `
disabled -VmStorageProtectionForAPD disabled ` disabled -VmStorageProtectionForAPD disabled `
-VmTerminateDelayForAPDSec 600 -VmReactionOnAPDCleared none -VmTerminateDelayForAPDSec 600 -VmReactionOnAPDCleared none
This will disable VMCP and configure the Settings on cluster LAB-CL
.EXAMPLE
Set-VMCPSettings -enableVMCP:$False -VmStorageProtectionForPDL `
disabled -VmStorageProtectionForAPD disabled `
-VmTerminateDelayForAPDSec 600 -VmReactionOnAPDCleared none
This will disable VMCP and configure the Settings on all clusters available
#> #>
[CmdletBinding()] [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact="High")]
param param
( (
[Parameter(Mandatory=$True, [Parameter(Mandatory=$True,
ValueFromPipeline=$True, ValueFromPipeline=$True,
ValueFromPipelineByPropertyName=$True, ValueFromPipelineByPropertyName=$True,
HelpMessage='What is the Cluster Name?')] HelpMessage='What is the Cluster Name?')]
$cluster, $cluster= (Get-Cluster -Server $Server),
[Parameter(Mandatory=$True, [Parameter(Mandatory=$True,
ValueFromPipeline=$False, ValueFromPipeline=$False,
HelpMessage='True=Enabled False=Disabled')] HelpMessage='True=Enabled False=Disabled')]
[switch]$enableVMCP, [switch]$enableVMCP,
[Parameter(Mandatory=$True, [Parameter(Mandatory=$True,
ValueFromPipeline=$False, ValueFromPipeline=$False,
HelpMessage='Actions that can be taken in response to a PDL event')] HelpMessage='Actions that can be taken in response to a PDL event')]
[ValidateSet("disabled","warning","restartAggressive")] [ValidateSet("disabled","warning","restartAggressive")]
[string]$VmStorageProtectionForPDL, [string]$VmStorageProtectionForPDL,
[Parameter(Mandatory=$True, [Parameter(Mandatory=$True,
ValueFromPipeline=$False, ValueFromPipeline=$False,
HelpMessage='Options available for an APD response')] HelpMessage='Options available for an APD response')]
[ValidateSet("disabled","restartConservative","restartAggressive","warning")] [ValidateSet("disabled","restartConservative","restartAggressive","warning")]
[string]$VmStorageProtectionForAPD, [string]$VmStorageProtectionForAPD,
[Parameter(Mandatory=$True, [Parameter(Mandatory=$True,
ValueFromPipeline=$False, ValueFromPipeline=$False,
HelpMessage='Value in seconds')] HelpMessage='Value in seconds')]
[Int]$VmTerminateDelayForAPDSec, [Int]$VmTerminateDelayForAPDSec,
[Parameter(Mandatory=$True, [Parameter(Mandatory=$True,
ValueFromPipeline=$False, ValueFromPipeline=$False,
HelpMessage='This setting will instruct vSphere HA to take a certain action if an APD event is cleared')] HelpMessage='This setting will instruct vSphere HA to take a certain action if an APD event is cleared')]
[ValidateSet("reset","none")] [ValidateSet("reset","none")]
[string]$VmReactionOnAPDCleared [string]$VmReactionOnAPDCleared,
[Parameter(Mandatory=$False)]
[VMware.VimAutomation.Types.VIServer[]]$Server = $global:DefaultVIServers
)
) Process {
Begin{
# Determine input and convert to ClusterImpl object Foreach ($Clus in $Cluster) {
Switch ($cluster.GetType().Name)
{
"string" {$CL = Get-Cluster $cluster}
"ClusterImpl" {$CL = $cluster}
}
}
Process{
# Create the object we will configure
$settings = New-Object VMware.Vim.ClusterConfigSpecEx
$settings.dasConfig = New-Object VMware.Vim.ClusterDasConfigInfo
# Based on $enableVMCP switch
if ($enableVMCP -eq $false) {
$settings.dasConfig.vmComponentProtecting = "disabled"
}
elseif ($enableVMCP -eq $true) {
$settings.dasConfig.vmComponentProtecting = "enabled"
}
#Create the VMCP object to work with Write-Verbose "Processing Cluster $Clus"
$settings.dasConfig.defaultVmSettings = New-Object VMware.Vim.ClusterDasVmSettings
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings = New-Object VMware.Vim.ClusterVmComponentProtectionSettings
#Storage Protection For PDL
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForPDL = "$VmStorageProtectionForPDL"
#Storage Protection for APD
switch ($VmStorageProtectionForAPD) {
"disabled" {
# If Disabled, there is no need to set the Timeout Value
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'disabled'
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $false
}
"restartConservative" {
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'restartConservative'
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $true
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmTerminateDelayForAPDSec = $VmTerminateDelayForAPDSec
}
"restartAggressive" {
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'restartAggressive'
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $true
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmTerminateDelayForAPDSec = $VmTerminateDelayForAPDSec
}
"warning" {
# If Warning, there is no need to set the Timeout Value
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'warning'
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $false
}
# Determine input and convert to ClusterImpl object
Switch ($Clus.GetType().Name)
{
"string" {$CL = Get-Cluster $Clus -Server $Server -ErrorAction SilentlyContinue}
"ClusterImpl" {$CL = $Clus}
} }
# Reaction On APD Cleared
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmReactionOnAPDCleared = "$VmReactionOnAPDCleared"
# Execute API Call If ($CL) {
$modify = $true # Create the object we will configure
$ClusterMod = Get-View -Id "ClusterComputeResource-$($cl.ExtensionData.MoRef.Value)" $settings = New-Object VMware.Vim.ClusterConfigSpecEx
$ClusterMod.ReconfigureComputeResource_Task($settings, $modify) | out-null $settings.dasConfig = New-Object VMware.Vim.ClusterDasConfigInfo
# Based on $enableVMCP switch
if ($enableVMCP -eq $false) {
$settings.dasConfig.vmComponentProtecting = "disabled"
}
elseif ($enableVMCP -eq $true) {
$settings.dasConfig.vmComponentProtecting = "enabled"
}
#Create the VMCP object to work with
$settings.dasConfig.defaultVmSettings = New-Object VMware.Vim.ClusterDasVmSettings
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings = New-Object VMware.Vim.ClusterVmComponentProtectionSettings
} #Storage Protection For PDL
End{ $settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForPDL = "$VmStorageProtectionForPDL"
# Update variable data after API call
$ClusterMod.updateViewData()
# Create Hashtable with desired properties to return #Storage Protection for APD
$properties = [ordered]@{ switch ($VmStorageProtectionForAPD) {
'Cluster' = $ClusterMod.Name; "disabled" {
'VMCP Status' = $clustermod.Configuration.DasConfig.VmComponentProtecting; # If Disabled, there is no need to set the Timeout Value
'Protection For APD' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmStorageProtectionForAPD; $settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'disabled'
'APD Timeout Enabled' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.EnableAPDTimeoutForHosts; $settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $false
'APD Timeout (Seconds)' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmTerminateDelayForAPDSec; }
'Reaction on APD Cleared' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmReactionOnAPDCleared;
'Protection For PDL' = $clustermod.Configuration.DasConfig.DefaultVmSettings.VmComponentProtectionSettings.VmStorageProtectionForPDL "restartConservative" {
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'restartConservative'
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $true
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmTerminateDelayForAPDSec = $VmTerminateDelayForAPDSec
}
"restartAggressive" {
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'restartAggressive'
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $true
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmTerminateDelayForAPDSec = $VmTerminateDelayForAPDSec
}
"warning" {
# If Warning, there is no need to set the Timeout Value
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmStorageProtectionForAPD = 'warning'
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.enableAPDTimeoutForHosts = $false
}
}
# Reaction On APD Cleared
$settings.dasConfig.defaultVmSettings.vmComponentProtectionSettings.vmReactionOnAPDCleared = "$VmReactionOnAPDCleared"
# Execute API Call
$modify = $true
$ClusterMod = Get-View -Id "ClusterComputeResource-$($CL.ExtensionData.MoRef.Value)" -Server $Server
If ($pscmdlet.ShouldProcess($CL.Name,"Modify VMCP configuration")) {
$ClusterMod.ReconfigureComputeResource_Task($settings, $modify) | out-null
}
# Show result
Get-VMCPSettings -Cluster $CL -Server $Server
}
}
} }
# Create PSObject with the Hashtable
$object = New-Object -TypeName PSObject -Prop $properties
# Show object
return $object
}
} }