Managing vSphere Alarms with PowerCLI

Greetings to all vSphere administrators out there! We are now going to take a look at a new functionality introduced in PowerCLI 4.1 Update 1 – namely vSphere alarms management. We assume that you are already familiar with the vSphere alarms functionality. For those of you who are not, here are some resources on the topic: vSphere Datacenter Administration Guide (see Chapter 13 “Working with Alarms”).

Here’s an excerpt from the VMware documentation – “Alarms are notifications that occur in response to selected events, conditions, and states that occur with objects in the inventory. … The vCenter Server system is configured with a set of predefined alarms that monitor clusters, hosts, datacenters, datastores, networks, and virtual machines.” The current PowerCLI 4.1 Update 1 release supports only modifying the predefined alarms that come with the installation of vCenter Server.

The new cmdlets are:

  • Get-AlarmDefinition
  • Set-AlarmDefinition
  • New-AlarmAction
  • Get-AlarmAction
  • Remove-AlarmAction
  • New-AlarmActionTrigger
  • Get-AlarmActionTrigger
  • Remove-AlarmActionTrigger

With the new cmdlets, you can modify: the alarm actions, the interval on which alarm actions repeat (if repeatable), the alarm names, the alarm descriptions, and whether the alarm is enabled or not. We’ll look at some examples of how we can use these alarm management cmdlets.

Get-AlarmDefinition is a typical PowerCLI getter. It returns all the alarms defined on the vCenter Servers you’re connected to. There are also some optional parameters which allow you to filter the results by name, by the inventory object on which the alarm is defined, and by its state (enabled or disabled).

Here are some examples:

Get-AlarmDefinition # This will return all the defined alarms on the servers you’re connected to

Get-AlarmDefinition -Name "virtual machine*" -Enabled $false # This will return all the disabled alarm definitions with names starting with “virtual machine”

Get-VMHost hostname | Get-AlarmDefinition # This will return all alarms that apply to the host “hostname”. This includes alarms defined on this host and alarms inherited from the parent entity, or from any ancestors in the inventory hierarchy.

Here’s how you can modify an alarm definition:

Get-AlarmDefinition "Host memory status" | Set-AlarmDefinition -Name "Host memory" -Enabled $false # This will rename the alarm to “Host memory” and disable it

The main part of the alarm definitions you can manage is an alarm’s actions configuration. You can create an alarm action this way:

Get-AlarmDefinition "Host storage status" | New-AlarmAction -Email -To “me@mycompany.com” -Subject "Host storage shortage" # This will create a send email action which will be triggered once when the alarm state changes from warning (yellow) to alert (red)

Here is how you can add another action trigger, which will fire earlier – when the alarm state changes from normal (green) to alert (yellow):

$action = Get-AlarmDefinition "Host storage status" | Get-AlarmAction -ActionType SendEmail # Get the action we previously created

$action | New-AlarmActionTrigger -StartStatus Green -EndStatus Yellow –Repeat # Add a new repeating trigger to the action

You can also set the interval at which the action is repeated:

Set-AlarmDefinition "Host storage status" -ActionRepeatMinutes (60 * 24) # This will configure the send email action to repeat once a day (as long as the alarm is in the yellow state)

Finally you may want to remove certain alarm actions. You can do it this way:

$action = Get-AlarmDefinition "Host storage status" | Get-AlarmAction -ActionType SendEmail

Remove-AlarmAction -AlarmAction $action

This is what you can do with the newly introduced cmdlets. The PowerCLI team has decided that the rest of the alarm functionality will not be reconfigured often enough to add cmdlets for the task. However you can always gain full control over the situation through the alarm’s View object. Here’s how you can change alarm configuration that is not available to change through the cmdlets:

# Get the alarm’s view

$alarmDefinition = Get-AlarmDefinition "Host storage status"

$alarmSpecification = $alarmDefinition. ExtensionData

# Make the desired alarm configuration changes

$alarmSpecification. Description="advanced-set description…..”

# Some other changes to the alarm configuration specification (for questions see the vSphere API Reference)

# Update the alarm

$alarmView = Get-View $alarmSpecification.Alarm

$alarmView.ReconfigureAlarm( $alarmSpecification )


Best regards,

-Angel Evrov, MTS at VMware





30 comments have been added so far

  1. This is perfect for anyone who needs to build a whole lot of identical vCenter servers.
    Great work guys on another huge and useful update!

  2. Uh, never mind.
    It seems this function doesn’t exist at all (yet).
    But if you include it someday, please also include New-AlarmDefinition etc. I’m having a hard time without this.
    In fact there should simply be Get, Set, New and Delete methods for every element (AlarmDefinition, AlarmAction, AlarmTrigger).
    Not sure why some have been implemented and others not.
    It depends on the people to judge which ones are useful to them. 🙂
    That would make copying/moving Alarms between vcenter server a hell of a lot easier.

  3. I’m wondering if it is possible to add variables to the subject and body text for email alarm actions.
    I’d like to have some sort of format like
    Subject: $hostname cpu load is $cpu
    And something similar for the body text. Ideally I’d like to create shorter body text so that I can send the alarms as SMS.
    Can this be done?

  4. I agree with Colin. We would really like to modify the subject of the alarm emails so they are more meaningful. Is this possible?

  5. Hi Colin and Jamie,
    Yes, the content of to email can be customized to some extent. Although, the customization is rather limited.
    Here are the variables that can be used in the email action fields, that get populated at runtime (taken from the vSphere Api Reference):
    alarm -The object of the triggering alarm.
    alarmName – The name of the triggering alarm.
    declaringSummary – A summary of declarations made during the triggering of the alarm.
    eventDescription – The event description.
    newStatus – The status after the alarm is triggered.
    oldStatus – The status prior to the alarm being triggered.
    target – The object of the entity where the alarm is assocaited.
    targetName – The name of the entity where the alarm is triggered.
    triggeringSummary – A summary of information involved in triggering the alarm.
    Here is how you can create an alarm action that sends an email mentioning the name of the object that triggered it:
    > Get-AlarmDefinition EmailTestAlarm | New-AlarmAction -Email -Subject “VM {targetName} has powered on” -To me@mycompany.com

    1. Have there been any updates to the list of email action fields? Are there any additional parameters or variables that can be used in the -subject and/or -body of the email?

      Jeff 🙂

  6. Between all of the practice sessions, qualifying and racing, the vast
    majority of your time will be spent massaging the dual
    shock’s triggers. This game console unit can cost around $280 dollars and you can also
    receive special discount if you purchase bundle deals.
    Sony has made the Play – Station 3 into a multi-purpose
    entertainment system.

    Also visit my homepage: Playstation 3 Controller Battery
    Status (/)

  7. It looks like the Get-AlarmAction only the first alarm rather then getting them all. I’m trying to do the following

    Get-AlarmDefinition | Get-AlarmAction | Remove-AlarmAction -Confirm:$false

    In hopes that it would delete them all. It only deletes the first.

    I also tried the following thinking it was a syntax error or something:

    Get-AlarmDefinition | Get-AlarmAction | %{ $_ | Remove-AlarmAction -Confirm:$false}

    it gave me the same result. I’m running PS4.0 and PCLI 5.5.0-1295336. Looks like a bug in the cmdlet.


  8. Hello,

    I am looking for a powercli command to set an alarm “Datastore disk usage alarm” for a specific set of datastores. Can anyone help me with the powercli command to setup this alarm for a specific datastore OR any command which can exclude some datastores from this alarm.


  9. Any way to extract Alarm Definitions where Alarm Action is set to send e-mail to a specific e-mail address?
    We have tons of Alarm Definitions and its hard to go through all of them.
    Get-AlarmDefinition | Get-AlarmAction | Select-Object -Property To,ActionType,AlarmDefinition | format-table -autosize -wrap
    Is already helpful but I don’t know the syntax to add a filter for the “to” property

Leave a Reply

Your email address will not be published.