As part of the VMware open source program, we have to update this repository with the correct license and copyright information. We add the BSD-2 Clause License for this repository. We mark all source code provided by VMware with the Copyright notice under BSD-2 Clause license. * Update repository license to BSD 2-Clause License * Update Copyright
741 lines
29 KiB
PowerShell
741 lines
29 KiB
PowerShell
<#
|
|
Copyright 2021 VMware, Inc.
|
|
SPDX-License-Identifier: BSD-2-Clause
|
|
#>
|
|
|
|
<#
|
|
===========================================================================
|
|
Created by: Jason Robinson
|
|
Created on: 05/2017
|
|
Twitter: @jrob24
|
|
===========================================================================
|
|
.DESCRIPTION
|
|
PowerShell Module to help with creation of vCenter Alarms
|
|
.NOTES
|
|
See New-vCenterAlarms.ps1 for examples of alarm creation
|
|
|
|
* Tested against PowerShell 5.0
|
|
* Tested against PowerCLI 6.5.1 build 5377412
|
|
* Tested against vCenter 6.0
|
|
* Tested against ESXi 5.5/6.0
|
|
#>
|
|
|
|
function New-AlarmDefinition {
|
|
<#
|
|
.SYNOPSIS
|
|
This cmdlet creates a new alarm defintion on the specified entity in vCenter.
|
|
.DESCRIPTION
|
|
This cmdlet creates a new alarm defintion on the specified entity in vCenter.
|
|
An alarm trigger is required in order to create a new alarm definition.
|
|
They can be created by using the New-AlarmTrigger cmdlet.
|
|
|
|
After the alarm definition is created, if alarm actions are required use
|
|
the cmdlet New-AlarmAction to create actions for the alarm.
|
|
.PARAMETER Name
|
|
Specifies the name of the alarm you want to create.
|
|
.PARAMETER Description
|
|
Specifies the description for the alarm.
|
|
.PARAMETER Entity
|
|
Specifies where to create the alarm. To create the alarm at the root
|
|
level of vCenter use the entity 'Datacenters', otherwise specify any
|
|
object name.
|
|
.PARAMETER Trigger
|
|
Specifies the alarm event, state, or metric trigger(s). The alarm
|
|
trigger(s) are created with the New-AlarmTrigger cmdlet. For more
|
|
information about triggers, run Get-Help New-AlarmTrigger.
|
|
.PARAMETER Enabled
|
|
Specifies if the alarm is enabled when it is created. If unset, the
|
|
default value is true.
|
|
.PARAMETER ActionRepeatMinutes
|
|
Specifies the frequency how often the actions should repeat when an alarm
|
|
does not change state.
|
|
.PARAMETER ReportingFrequency
|
|
Specifies how often the alarm is triggered, measured in minutes. A zero
|
|
value means the alarm is allowed to trigger as often as possible. A
|
|
nonzero value means that any subsequent triggers are suppressed for a
|
|
period of minutes following a reported trigger.
|
|
|
|
If unset, the default value is 0. Allowed range is 0 - 60.
|
|
.PARAMETER ToleranceRange
|
|
Specifies the tolerance range for the metric triggers, measure in
|
|
percentage. A zero value means that the alarm triggers whenever the metric
|
|
value is above or below the specified value. A nonzero means that the
|
|
alarm triggers only after reaching a certain percentage above or below
|
|
the nominal trigger value.
|
|
|
|
If unset, the default value is 0. Allowed range is 0 - 100.
|
|
.PARAMETER Server
|
|
Specifies the vCenter Server system on which you want to run the cmdlet.
|
|
If no value is passed to this parameter, the command runs on the default
|
|
server, $DefaultVIServer. For more information about default servers,
|
|
see the description of Connect-VIServer.
|
|
.OUTPUTS
|
|
VMware.Vim.ManagedObjectReference
|
|
.NOTES
|
|
This cmdlet requires a connection to vCenter to create the alarm action.
|
|
.LINKS
|
|
http://pubs.vmware.com/vsphere-6-0/topic/com.vmware.wssdk.apiref.doc/vim.alarm.AlarmSpec.html
|
|
.EXAMPLE
|
|
PS C:\> $trigger = New-AlarmTrigger -StateType runtime.connectionState -StateOperator isEqual -YellowStateCondition disconnected -RedStateCondition notResponding -ObjectType HostSystem
|
|
PS C:\> New-AlarmDefinition -Name 'Host Connection' -Description 'Host Connection State Alarm -Entity Datacenters -Trigger $trigger -ActionRepeatMinutes 10
|
|
|
|
Type Value
|
|
---- -----
|
|
Alarm alarm-1801
|
|
|
|
This will create a host connection state alarm trigger and store it in
|
|
the variable $trigger. Then it will create a new alarm 'Host Connection'
|
|
on the root level of vCenter and set the action to repeat every 10 mins.
|
|
#>
|
|
[CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'High')]
|
|
param (
|
|
[Parameter(Mandatory = $true)]
|
|
[ValidateNotNullOrEmpty()]
|
|
[Alias('AlarmName')]
|
|
[string]$Name,
|
|
|
|
[string]$Description,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$Entity,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[ValidateNotNullOrEmpty()]
|
|
[VMware.Vim.AlarmExpression[]]$Trigger,
|
|
|
|
[boolean]$Enabled = $true,
|
|
|
|
[ValidateRange(0, 60)]
|
|
[int32]$ActionRepeatMinutes,
|
|
|
|
[ValidateRange(0, 60)]
|
|
[int32]$ReportingFrequency = 0,
|
|
|
|
[ValidateRange(0, 100)]
|
|
[int32]$ToleranceRange = 0,
|
|
|
|
[string]$Server
|
|
)
|
|
BEGIN {
|
|
Write-Verbose -Message "Adding parameters with default values to PSBoundParameters"
|
|
foreach ($Key in $MyInvocation.MyCommand.Parameters.Keys) {
|
|
$Value = Get-Variable $Key -ValueOnly -ErrorAction SilentlyContinue
|
|
if ($Value -and !$PSBoundParameters.ContainsKey($Key)) {
|
|
$PSBoundParameters[$Key] = $Value
|
|
}
|
|
}
|
|
}
|
|
PROCESS {
|
|
try {
|
|
if ($PSBoundParameters.ContainsKey('Server')) {
|
|
$Object = Get-Inventory -Name $PSBoundParameters['Entity'] -ErrorAction Stop -Server $PSBoundParameters['Server']
|
|
$AlarmMgr = Get-View AlarmManager -ErrorAction Stop -Server $PSBoundParameters['Server']
|
|
} else {
|
|
$Object = Get-Inventory -Name $PSBoundParameters['Entity'] -ErrorAction Stop -Server $global:DefaultVIServer
|
|
$AlarmMgr = Get-View AlarmManager -ErrorAction Stop -Server $global:DefaultVIServer
|
|
}
|
|
|
|
if ($PSCmdlet.ShouldProcess($global:DefaultVIServer, "Create alarm $($PSBoundParameters['Name'])")) {
|
|
$Alarm = New-Object -TypeName VMware.Vim.AlarmSpec
|
|
$Alarm.Name = $PSBoundParameters['Name']
|
|
$Alarm.Description = $PSBoundParameters['Description']
|
|
$Alarm.Enabled = $PSBoundParameters['Enabled']
|
|
$Alarm.Expression = New-Object -TypeName VMware.Vim.OrAlarmExpression
|
|
$Alarm.Expression.Expression += $PSBoundParameters['Trigger']
|
|
$Alarm.Setting = New-Object -TypeName VMware.Vim.AlarmSetting
|
|
$Alarm.Setting.ReportingFrequency = $PSBoundParameters['ReportingFrequency'] * 60
|
|
$Alarm.Setting.ToleranceRange = $PSBoundParameters['ToleranceRange'] * 100
|
|
$Alarm.ActionFrequency = $PSBoundParameters['ActionRepeatMinutes'] * 60
|
|
$AlarmMgr.CreateAlarm($Object.Id, $Alarm)
|
|
}
|
|
} catch {
|
|
$PSCmdlet.ThrowTerminatingError($_)
|
|
}
|
|
}
|
|
} #End of New-AlarmDefinition function
|
|
|
|
function New-AlarmAction {
|
|
<#
|
|
.SYNOPSIS
|
|
This cmdlet creates an alarm action on the specified alarm definition.
|
|
.DESCRIPTION
|
|
This cmdlet creates an alarm action on the specified alarm definition.
|
|
This cmdlet differs from the VMware PowerCLI New-AlarmAction cmdlet as it
|
|
will create the transitions of the alarm state. It requires an alarm
|
|
action and at least one transition to be specified.
|
|
|
|
The transition indicates when the action executes and if it repeats.
|
|
There are only four acceptable transitions: green to yellow, yellow to
|
|
red, red to yellow, and yellow to green. At least one pair must be
|
|
specified or the results will be an invalid.
|
|
|
|
If an alarm action already exists on the alarm definition, it will be
|
|
overwritten if the same alarm action is specified. For example if the
|
|
alarm definition already has an alarm action of Snmp on the transition
|
|
of green to yellow and the cmdlet is used to create a new action of
|
|
Snmp on the transition of yellow to red, it will overwrite the existing
|
|
action and transition. The end result will be one Snmp action on the
|
|
transition of yellow to red. If you want the old to transition to remain
|
|
both should be specified during the usage of the cmdlet.
|
|
.PARAMETER AlarmDefinition
|
|
Specifies the alarm definition for which you want to configure actions.
|
|
The alarm definition can be retreived by using the Get-AlarmDefinition
|
|
cmdlet.
|
|
.PARAMETER Snmp
|
|
Indicates that a SNMP message is sent when the alarm is activated.
|
|
.PARAMETER Email
|
|
Indicates that when the alarm is activated, the system sends an email
|
|
message to the specified address. Use the Subject, To, CC, and Body
|
|
parameters to customize the alarm message.
|
|
.PARAMETER To
|
|
Specifies the email address to which you want to send a message.
|
|
.PARAMETER Cc
|
|
Specifies the email address you want to add to the CC field of the email
|
|
message.
|
|
.PARAMETER Subject
|
|
Specifies a subject for the email address message you want to send.
|
|
.PARAMETER Body
|
|
Specifies the text of the email message.
|
|
.PARAMETER GreenToYellow
|
|
Specifies the alarm action for the green to yellow transition. Allowed
|
|
values are 'Once' and 'Repeat'. If parameter is not set transition will
|
|
remain unset.
|
|
.PARAMETER YellowToRed
|
|
Specifies the alarm action for the yellow to red transition. Allowed
|
|
values are 'Once' and 'Repeat'. If parameter is not set transition will
|
|
remain unset.
|
|
.PARAMETER RedToYellow
|
|
Specifies the alarm action for the red to yellow transition. Allowed
|
|
values are 'Once' and 'Repeat'. If parameter is not set transition will
|
|
remain unset.
|
|
.PARAMETER YellowToGreen
|
|
Specifies the alarm action for the yellow to green transition. Allowed
|
|
values are 'Once' and 'Repeat'. If parameter is not set transition will
|
|
remain unset.
|
|
.NOTES
|
|
This cmdlet requires a connection to vCenter to create the alarm action.
|
|
|
|
When using this cmdlet specify the Module-Qualified cmdlet name to avoid
|
|
using the New-AlarmAction cmdlet with VMware PowerCLI.
|
|
.EXAMPLE
|
|
PS C:\> vCenter.Alarms\New-AlarmAction -AlarmDefinition (Get-AlarmDefintion "Host CPU Usage") -Snmp -YellowToRed Repeat
|
|
|
|
This will create an Snmp alarm action on the "Host CPU Usage" alarm
|
|
transition of yellow to red. The alarm action will also repeat, as per
|
|
the action frequency defined on the alarm.
|
|
.EXAMPLE
|
|
PS C:\> Get-AlarmDefintion "Cluster HA Status" | vCenter.Alarms\New-AlarmAction -Email -To helpdesk@company.com -GreenToYellow Once -YellowToRed Once
|
|
|
|
This will create an Email alarm action on the "Cluster HA Status" alarm
|
|
transition of green to yellow and yellow to red. The alarm action will
|
|
send an email to helpdesk@company.com one time per transition.
|
|
#>
|
|
[CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Low')]
|
|
param (
|
|
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
|
|
[VMware.VimAutomation.ViCore.Types.V1.Alarm.AlarmDefinition]$AlarmDefinition,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'Snmp')]
|
|
[switch]$Snmp,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'Email')]
|
|
[switch]$Email,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'Email')]
|
|
[string[]]$To,
|
|
|
|
[Parameter(ParameterSetName = 'Email')]
|
|
[string[]]$Cc,
|
|
|
|
[Parameter(ParameterSetName = 'Email')]
|
|
[string]$Subject,
|
|
|
|
[Parameter(ParameterSetName = 'Email')]
|
|
[string]$Body,
|
|
|
|
[ValidateSet('Once', 'Repeat')]
|
|
[string]$GreenToYellow,
|
|
|
|
[ValidateSet('Once', 'Repeat')]
|
|
[string]$YellowToRed,
|
|
|
|
[ValidateSet('Once', 'Repeat')]
|
|
[string]$RedToYellow,
|
|
|
|
[ValidateSet('Once', 'Repeat')]
|
|
[string]$YellowToGreen
|
|
)
|
|
|
|
BEGIN {
|
|
}
|
|
PROCESS {
|
|
try {
|
|
$AlarmView = Get-View -Id $PSBoundParameters['AlarmDefinition'].Id -Server ($PSBoundParameters['AlarmDefinition'].Uid.Split('@:')[1])
|
|
$Alarm = New-Object -TypeName VMware.Vim.AlarmSpec
|
|
$Alarm.Name = $AlarmView.Info.Name
|
|
$Alarm.Description = $AlarmView.Info.Description
|
|
$Alarm.Enabled = $AlarmView.Info.Enabled
|
|
$Alarm.ActionFrequency = $AlarmView.Info.ActionFrequency
|
|
$Alarm.Action = New-Object VMware.Vim.GroupAlarmAction
|
|
$Trigger = New-Object VMware.Vim.AlarmTriggeringAction
|
|
|
|
Write-Verbose -Message "Defining alarm actions"
|
|
if ($PSCmdlet.ParameterSetName -eq 'Snmp') {
|
|
$Trigger.Action = New-Object -TypeName VMware.Vim.SendSNMPAction
|
|
} elseif ($PSCmdlet.ParameterSetName -eq 'Email') {
|
|
$Trigger.Action = New-Object -TypeName VMware.Vim.SendEmailAction
|
|
$Trigger.Action.ToList = $PSBoundParameters['To'].GetEnumerator() | ForEach-Object -Process {
|
|
"$_;"
|
|
}
|
|
if ($PSBoundParameters.ContainsKey('Cc')) {
|
|
$Trigger.Action.CcList = $PSBoundParameters['Cc'].GetEnumerator() | ForEach-Object -Process {
|
|
"$_;"
|
|
}
|
|
} else {
|
|
$Trigger.Action.CcList = $null
|
|
}
|
|
$Trigger.Action.Subject = $PSBoundParameters['Subject']
|
|
$Trigger.Action.Body = $PSBoundParameters['Body']
|
|
}
|
|
|
|
Write-Verbose -Message "Defining alarm transitions"
|
|
if ($PSBoundParameters.ContainsKey('GreenToYellow')) {
|
|
$Trans1 = New-Object -TypeName VMware.Vim.AlarmTriggeringActionTransitionSpec
|
|
$Trans1.StartState = 'green'
|
|
$Trans1.FinalState = 'yellow'
|
|
if ($PSBoundParameters['GreenToYellow'] -eq 'Repeat') {
|
|
$Trans1.Repeats = $true
|
|
}
|
|
$Trigger.TransitionSpecs += $Trans1
|
|
}
|
|
|
|
if ($PSBoundParameters.ContainsKey('YellowToRed')) {
|
|
$Trans2 = New-Object -TypeName VMware.Vim.AlarmTriggeringActionTransitionSpec
|
|
$Trans2.StartState = 'yellow'
|
|
$Trans2.FinalState = 'red'
|
|
if ($PSBoundParameters['YellowToRed'] -eq 'Repeat') {
|
|
$Trans2.Repeats = $true
|
|
} else {
|
|
$Trans2.Repeats = $false
|
|
}
|
|
$Trigger.TransitionSpecs += $Trans2
|
|
}
|
|
|
|
if ($PSBoundParameters.ContainsKey('RedToYellow')) {
|
|
$Trans3 = New-Object -TypeName VMware.Vim.AlarmTriggeringActionTransitionSpec
|
|
$Trans3.StartState = 'red'
|
|
$Trans3.FinalState = 'yellow'
|
|
if ($PSBoundParameters['RedToYellow'] -eq 'Repeat') {
|
|
$Trans3.Repeats = $true
|
|
} else {
|
|
$Trans3.Repeats = $false
|
|
}
|
|
$Trigger.TransitionSpecs += $Trans3
|
|
}
|
|
|
|
if ($PSBoundParameters.ContainsKey('YellowToGreen')) {
|
|
$Trans4 = New-Object -TypeName VMware.Vim.AlarmTriggeringActionTransitionSpec
|
|
$Trans4.StartState = 'yellow'
|
|
$Trans4.FinalState = 'green'
|
|
if ($PSBoundParameters['YellowToGreen'] -eq 'Repeat') {
|
|
$Trans4.Repeats = $true
|
|
} else {
|
|
$Trans4.Repeats = $false
|
|
}
|
|
$Trigger.TransitionSpecs += $Trans4
|
|
}
|
|
|
|
$Alarm.Action.Action += $Trigger
|
|
$Alarm.Expression = New-Object -TypeName VMware.Vim.OrAlarmExpression
|
|
$Alarm.Expression.Expression += $AlarmView.Info.Expression.Expression
|
|
$Alarm.Setting += $AlarmView.Info.Setting
|
|
$AlarmView.ReconfigureAlarm($Alarm)
|
|
} catch {
|
|
$PSCmdlet.ThrowTerminatingError($_)
|
|
}
|
|
}
|
|
} #End of New-AlarmAction function
|
|
|
|
function New-AlarmTrigger {
|
|
<#
|
|
.SYNOPSIS
|
|
This cmdlet creates a vCenter event, state, or metric alarm trigger.
|
|
.DESCRIPTION
|
|
This cmdlet creates a vCenter event, state, or metric alarm trigger.
|
|
The trigger is used with the New-AlarmDefinition cmdlet to create a new
|
|
alarm in vCenter. This cmdlet will only create one alarm trigger. If more
|
|
triggers are required store the triggers in an array.
|
|
.PARAMETER EventType
|
|
Specifies the type of the event to trigger on. The event types can be
|
|
discovered by using the Get-EventId cmdlet. If the the event type is
|
|
'EventEx' or 'ExtendedEvent' the EventTypeId parameter is required.
|
|
.PARAMETER EventTypeId
|
|
Specifies the id of the event type. Only used when the event type is an
|
|
'EventEx' or 'ExtendedEvent'.
|
|
.PARAMETER Status
|
|
Specifies the status of the event. Allowed values are green, yellow, or
|
|
red.
|
|
.PARAMETER StateType
|
|
Specifies the state type to trigger on. Allowed values are
|
|
runtime.powerstate (HostSystem), summary.quickStats.guestHeartbeatStatus
|
|
(VirtualMachine), or runtime.connectionState (VirtualMachine).
|
|
.PARAMETER StateOperator
|
|
Specifies the operator condition on the target state. Allowed values are
|
|
'isEqual' or 'isUnequal'.
|
|
.PARAMETER YellowStateCondition
|
|
Specifies the yellow state condition. When creating a state alarm
|
|
trigger at least one condition must be specified for a valid trigger to
|
|
be created. If the parameter is not set, the yellow condition is unset.
|
|
.PARAMETER RedStateCondition
|
|
Specifies the red state condition. When creating a state alarm trigger
|
|
at least one condition must be specified for a valid trigger to be
|
|
created. If the parameter is not set, the red condition is unset.
|
|
.PARAMETER MetricId
|
|
Specifies the id of the metric to trigger on. The metric ids can be
|
|
discovered by using the Get-MetricId cmdlet.
|
|
.PARAMETER MetricOperator
|
|
Specifies the operator condition on the target metric. Allowed values
|
|
are 'isAbove' or 'isBelow'.
|
|
.PARAMETER Yellow
|
|
Specifies the threshold value that triggers a yellow status. Allowed
|
|
range is 1% - 100%.
|
|
.PARAMETER YellowInterval
|
|
Specifies the time interval in minutes for which the yellow condition
|
|
must be true before the yellow status is triggered. If unset, the yellow
|
|
status is triggered immediately when the yellow condition becomes true.
|
|
.PARAMETER Red
|
|
Specifies the threshold value that triggers a red status. Allowed range
|
|
is 1% - 100%.
|
|
.PARAMETER RedInterval
|
|
Specifies the time interval in minutes for which the red condition must
|
|
be true before the red status is triggered. If unset, the red status is
|
|
triggered immediately when the red condition becomes true.
|
|
.PARAMETER ObjectType
|
|
Specifies the type of object on which the event is logged, the object
|
|
type containing the state condition or the type of object containing the
|
|
metric.
|
|
|
|
When creating a state alarm trigger the only acceptable values are
|
|
'HostSystem' or 'VirtualMachine'. The supported state types for each object
|
|
are as follows:
|
|
VirtualMachine type: runtime.powerState or summary.quickStats.guestHeartbeatStatus
|
|
HostSystem type: runtime.connectionState
|
|
.OUTPUTS
|
|
(Event|State|Metric)AlarmExpression
|
|
.NOTES
|
|
This cmdlet requires the PowerCLI module to be imported.
|
|
.LINK
|
|
Event Alarm Trigger
|
|
http://pubs.vmware.com/vsphere-6-0/topic/com.vmware.wssdk.apiref.doc/vim.alarm.EventAlarmExpression.html
|
|
|
|
State Alarm Trigger
|
|
http://pubs.vmware.com/vsphere-6-0/topic/com.vmware.wssdk.apiref.doc/vim.alarm.StateAlarmExpression.html
|
|
|
|
Metric Alarm Trigger
|
|
http://pubs.vmware.com/vsphere-6-0/topic/com.vmware.wssdk.apiref.doc/vim.alarm.MetricAlarmExpression.html
|
|
.EXAMPLE
|
|
PS C:\> New-AlarmTrigger -EventType "DasDisabledEvent" -Status Red -ObjectType ClusterComputeResource
|
|
|
|
Comparisons :
|
|
EventType : DasDisabledEvent
|
|
ObjectType : ClusterComputeResource
|
|
Status : red
|
|
|
|
Creates an event trigger on 'DasDisabledEvent' (HA Disabled) with a
|
|
status on 'Red'. The object type is a ClusterComputerResource because
|
|
this event occurs at a cluster level.
|
|
.EXAMPLE
|
|
PS C:\> New-AlarmTrigger -MetricId (Get-MetricId | Where Name -EQ 'cpu.usage.average').Key -Operator isAbove -Yellow 90 -YellowInterval 30 -Red 98 -RedInterval 15 -ObjectType HostSytem
|
|
|
|
Operator : isAbove
|
|
Type : HostSytem
|
|
Metric : VMware.Vim.PerfMetricId
|
|
Yellow : 9000
|
|
YellowInterval : 30
|
|
Red : 9800
|
|
RedInterval : 15
|
|
|
|
Creates a trigger on the 'cpu.usage.average' metric where the warning
|
|
condition must be above 90% for 30mins and the alert condition must be
|
|
above 98% for 15mins. The object type is a HostSystem.
|
|
.EXAMPLE
|
|
PS C:\temp> New-AlarmTrigger -StateType runtime.connectionState -StateOperator isEqual -YellowStateCondition Disconnected -RedStateCondition notResponding -ObjectType HostSystem
|
|
|
|
Operator : isEqual
|
|
Type : HostSystem
|
|
StatePath : runtime.connectionState
|
|
Yellow : Disconnected
|
|
Red : notResponding
|
|
|
|
Creates a trigger on the 'runtime.connectionState' condition where the
|
|
warning condition is 'disconnected' and the alert condition is
|
|
'notResponding'. The object type is a HostSystem.
|
|
#>
|
|
[CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Low')]
|
|
param (
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'Event')]
|
|
[string]$EventType,
|
|
|
|
[Parameter(ParameterSetName = 'Event')]
|
|
[string]$EventTypeId,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'Event')]
|
|
[ValidateSet('Green', 'Yellow', 'Red')]
|
|
[string]$Status,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'State')]
|
|
[ValidateSet('runtime.powerState', 'summary.quickStats.guestHeartbeatStatus', 'runtime.connectionState')]
|
|
[string]$StateType,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'State')]
|
|
[VMware.Vim.StateAlarmOperator]$StateOperator,
|
|
|
|
[Parameter(ParameterSetName = 'State')]
|
|
[ValidateSet('disconnected', 'notResponding', 'connected', 'noHeartbeat', 'intermittentHeartbeat', 'poweredOn', 'poweredOff', 'suspended')]
|
|
[string]$YellowStateCondition,
|
|
|
|
[Parameter(ParameterSetName = 'State')]
|
|
[ValidateSet('disconnected', 'notResponding', 'connected', 'noHeartbeat', 'intermittentHeartbeat', 'poweredOn', 'poweredOff', 'suspended')]
|
|
[string]$RedStateCondition,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'Metric')]
|
|
[string]$MetricId,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'Metric')]
|
|
[VMware.Vim.MetricAlarmOperator]$MetricOperator,
|
|
|
|
[Parameter(ParameterSetName = 'Metric')]
|
|
[ValidateRange(1, 100)]
|
|
[int32]$Yellow,
|
|
|
|
[Parameter(ParameterSetName = 'Metric')]
|
|
[ValidateRange(1, 90)]
|
|
[int32]$YellowInterval,
|
|
|
|
[Parameter(ParameterSetName = 'Metric')]
|
|
[ValidateRange(1, 100)]
|
|
[int32]$Red,
|
|
|
|
[Parameter(ParameterSetName = 'Metric')]
|
|
[ValidateRange(1, 90)]
|
|
[int32]$RedInterval,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[ValidateSet('ClusterComputeResource', 'Datacenter', 'Datastore', 'DistributedVirtualSwitch', 'HostSystem', 'Network', 'ResourcePool', 'VirtualMachine')]
|
|
[string]$ObjectType
|
|
)
|
|
try {
|
|
if ($PSCmdlet.ShouldProcess("vCenter alarm", "Create $($PSCmdlet.ParameterSetName) trigger")) {
|
|
if ($PSCmdlet.ParameterSetName -eq 'Event') {
|
|
$Expression = New-Object -TypeName VMware.Vim.EventAlarmExpression
|
|
$Expression.EventType = $PSBoundParameters['EventType']
|
|
if ($PSBoundParameters.ContainsKey('EventTypeId')) {
|
|
$Expression.EventTypeId = $PSBoundParameters['EventTypeId']
|
|
}
|
|
$Expression.ObjectType = $PSBoundParameters['ObjectType']
|
|
$Expression.Status = $PSBoundParameters['Status']
|
|
$Expression
|
|
} elseif ($PSCmdlet.ParameterSetName -eq 'Metric') {
|
|
$Expression = New-Object -TypeName VMware.Vim.MetricAlarmExpression
|
|
$Expression.Metric = New-Object -TypeName VMware.Vim.PerfMetricId
|
|
$Expression.Metric.CounterId = $PSBoundParameters['MetricId']
|
|
$Expression.Metric.Instance = ""
|
|
$Expression.Operator = $PSBoundParameters['MetricOperator']
|
|
$Expression.Red = ($PSBoundParameters['Red'] * 100)
|
|
$Expression.RedInterval = ($PSBoundParameters['RedInterval'] * 60)
|
|
$Expression.Yellow = ($PSBoundParameters['Yellow'] * 100)
|
|
$Expression.YellowInterval = ($PSBoundParameters['YellowInterval'] * 60)
|
|
$Expression.Type = $PSBoundParameters['ObjectType']
|
|
$Expression
|
|
} elseif ($PSCmdlet.ParameterSetName -eq 'State') {
|
|
$Expression = New-Object -TypeName VMware.Vim.StateAlarmExpression
|
|
$Expression.Operator = $PSBoundParameters['StateOperator']
|
|
$Expression.Type = $PSBoundParameters['ObjectType']
|
|
$Expression.StatePath = $PSBoundParameters['StateType']
|
|
|
|
if ($PSBoundParameters.ContainsKey('RedStateCondition')) {
|
|
if ($PSBoundParameters['RedStateCondition'] -eq 'intermittentHeartbeat') {
|
|
$Expression.Red = 'yellow'
|
|
} elseif ($PSBoundParameters['RedStateCondition'] -eq 'noHeartbeat') {
|
|
$Expression.Red = 'red'
|
|
} else {
|
|
$Expression.Red = $PSBoundParameters['RedStateCondition']
|
|
}
|
|
}
|
|
|
|
if ($PSBoundParameters.ContainsKey('YellowStateCondition')) {
|
|
if ($PSBoundParameters['YellowStateCondition'] -eq 'intermittentHeartbeat') {
|
|
$Expression.Yellow = 'yellow'
|
|
} elseif ($PSBoundParameters['YellowStateCondition'] -eq 'noHeartbeat') {
|
|
$Expression.Yellow = 'red'
|
|
} else {
|
|
$Expression.Yellow = $PSBoundParameters['YellowStateCondition']
|
|
}
|
|
}
|
|
$Expression
|
|
}
|
|
}
|
|
} catch {
|
|
$PSCmdlet.ThrowTerminatingError($_)
|
|
}
|
|
} #End of New-AlarmTrigger function
|
|
|
|
function Get-MetricId {
|
|
<#
|
|
.SYNOPSIS
|
|
This cmdlet collects all of the available metrics from vCenter.
|
|
.DESCRIPTION
|
|
This cmdlet collects all of the available metrics from vCenter. It will
|
|
provide the metric name, key, stats level, and summary of the metric.
|
|
The information can be used to identify the available metrics on vCenter
|
|
as well as gathering the metric key needed for configuring an alarm.
|
|
|
|
The metric keys are unique across vCenters. If you are connected to
|
|
more than one vCenter metrics from each vCenter will be generated. A
|
|
vCenter property is available to help determine the correct metric key
|
|
on a given vCenter. This is extrememly useful when trying to create
|
|
a metric based vCenter alarm.
|
|
.PARAMETER MetricGroup
|
|
Specifies the name of the metric group you would like to see. Allowed
|
|
values are 'CPU', 'Mem', 'Disk', 'Net', and 'Datastore'.
|
|
.OUTPUTS
|
|
System.Management.Automation.PSCustomObject
|
|
.NOTES
|
|
This cmdlet requires a connection to vCenter to collect metric data.
|
|
.EXAMPLE
|
|
PS C:\> Get-MetricId -MetricGroup Mem
|
|
|
|
Name : mem.usage.none
|
|
Key : 23
|
|
Level : 4
|
|
Summary : Memory usage as percentage of total configured or available memory
|
|
vCenter : vCenter01
|
|
|
|
Name : mem.usage.average
|
|
Key : 24
|
|
Level : 1
|
|
Summary : Memory usage as percentage of total configured or available memory
|
|
vCenter : vCenter01
|
|
|
|
Name : mem.usage.minimum
|
|
Key : 25
|
|
Level : 4
|
|
Summary : Memory usage as percentage of total configured or available memory
|
|
vCenter : vCenter01
|
|
.....
|
|
|
|
Collects all of the available memory metrics on the connected vCenter.
|
|
#>
|
|
[CmdletBinding()]
|
|
param (
|
|
[ValidateSet('CPU', 'Mem', 'Disk', 'Net', 'Datastore')]
|
|
[string]$MetricGroup
|
|
)
|
|
|
|
foreach ($Mgr in (Get-View PerformanceManager-PerfMgr)) {
|
|
$vCenter = $Mgr.Client.ServiceUrl.Split('/')[2]
|
|
if ($PSBoundParameters.ContainsKey('MetricGroup')) {
|
|
$Metrics += $Mgr.PerfCounter | Where-Object -FilterScript {
|
|
$_.GroupInfo.Key -eq $PSBoundParameters['MetricGroup']
|
|
}
|
|
} else {
|
|
$Metrics += $Mgr.PerfCounter
|
|
}
|
|
|
|
$Metrics | ForEach-Object -Process {
|
|
[pscustomobject] @{
|
|
Name = $_.GroupInfo.Key + "." + $_.NameInfo.key + "." + $_.RollupType
|
|
Key = $_.Key
|
|
Level = $_.Level
|
|
Summary = $_.NameInfo.Summary
|
|
vCenter = $vCenter
|
|
}
|
|
}
|
|
}
|
|
} #End of Get-MetricId function
|
|
|
|
function Get-EventId {
|
|
<#
|
|
.SYNOPSIS
|
|
This cmdlet collects all of the available events from vCenter.
|
|
.DESCRIPTION
|
|
This cmdlet collects all of the available events from vCenter. It will
|
|
provide the event type, event type id (if applicable), category,
|
|
description, and summary of the event. The information can be used to
|
|
identify the available events on vCenter as well as gathering the event
|
|
type and event type id (if applicable) required for configuring an alarm.
|
|
|
|
If the event type is 'EventEx' or 'ExtendedEvent' both the event type
|
|
and event type id will be required to create a new event based vCenter
|
|
alarm.
|
|
|
|
The event types can be unique across vCenters. If you are connected to
|
|
more than one vCenter events from each vCenter will be generated. A
|
|
vCenter property is available to help determine the correct event type
|
|
on a given vCenter. This is extrememly useful when trying to create
|
|
a event based vCenter alarm.
|
|
.PARAMETER Category
|
|
Specifies the name of the event category you would like to see. Allowed
|
|
values are 'info', 'warning', 'error', and 'user'.
|
|
.OUTPUTS
|
|
System.Management.Automation.PSCustomObject
|
|
.NOTES
|
|
This cmdlet requires a connection to vCenter to collect event data.
|
|
.EXAMPLE
|
|
PS C:\> Get-EventId -Category Error
|
|
|
|
EventType : ExtendedEvent
|
|
EventTypeId : ad.event.ImportCertFailedEvent
|
|
Category : error
|
|
Description : Import certificate failure
|
|
FullFormat : Import certificate failed.
|
|
vCenter : vCenter01
|
|
|
|
EventType : ExtendedEvent
|
|
EventTypeId : ad.event.JoinDomainFailedEvent
|
|
Category : error
|
|
Description : Join domain failure
|
|
FullFormat : Join domain failed.
|
|
vCenter : vCenter01
|
|
|
|
EventType : ExtendedEvent
|
|
EventTypeId : ad.event.LeaveDomainFailedEvent
|
|
Category : error
|
|
Description : Leave domain failure
|
|
FullFormat : Leave domain failed.
|
|
vCenter : vCenter01
|
|
.....
|
|
#>
|
|
[CmdletBinding()]
|
|
param (
|
|
[VMware.Vim.EventCategory]$Category
|
|
)
|
|
|
|
foreach ($Mgr in (Get-View EventManager)) {
|
|
$vCenter = $Mgr.Client.ServiceUrl.Split('/')[2]
|
|
if ($PSBoundParameters.ContainsKey('Category')) {
|
|
$Events += $Mgr.Description.EventInfo | Where-Object -FilterScript {
|
|
$_.Category -eq $PSBoundParameters['Category']
|
|
}
|
|
} else {
|
|
$Events += $Mgr.Description.EventInfo
|
|
}
|
|
|
|
$Events | ForEach-Object -Process {
|
|
$Hash = [ordered]@{}
|
|
$Hash.Add('EventType', $_.Key)
|
|
if ($_.Key -eq 'ExtendedEvent' -or $_.Key -eq 'EventEx') {
|
|
$Hash.Add('EventTypeId', $_.FullFormat.Split('|')[0])
|
|
}
|
|
$Hash.Add('Category', $_.Category)
|
|
$Hash.Add('Description', $_.Description)
|
|
if ($Hash['EventType'] -eq 'ExtendedEvent' -or $Hash['EventType'] -eq 'EventEx') {
|
|
$Hash.Add('FullFormat', $_.FullFormat.Split('|')[1])
|
|
} else {
|
|
$Hash.Add('FullFormat', $_.FullFormat)
|
|
}
|
|
$Hash.Add('vCenter', $vCenter)
|
|
New-Object -TypeName System.Management.Automation.PSObject -Property $Hash
|
|
}
|
|
}
|
|
} #End of Get-EventId function |