PowerCLI

  • 1.  Alarm to monitor host profile deviation

    Posted Oct 22, 2015 09:39 AM

    So I used Luc's alarm creation script and butchered it to (hopefully) create an alert for when a host deviates from its profile.  However whilst I initially thought I cracked it, I clearly haven't.

    Can anyone see anything glaringly obvious with the following:

    # Variables

    $vc = "vcsa.lab.mdb-lab.com"

    $credential = Get-Credential

    $mailto = "virtualhobbit@mdb-lab.local"

    # Connect to vCenter

    Connect-VIServer $vc -credential $credential

    $alarmMgr = Get-View AlarmManager

    $dc = "London"

    $entity = Get-Datacenter $dc | Get-View

    # Create AlarmSpec object

    $alarm = New-Object VMware.Vim.AlarmSpec

    $alarm.Name = "Host Profile violation"

    $alarm.Description = "Monitors host profile deviation"

    $alarm.Enabled = $TRUE

    # Alarm action

    $alarm.action = New-Object VMware.Vim.GroupAlarmAction

    $trigger1 = New-Object VMware.Vim.AlarmTriggeringAction

    $trigger1.action = New-Object VMware.Vim.SendEmailAction

    $trigger1.action.ToList = $mailTo

    $trigger1.action.Subject = "Host non-compliant with profile"

    $trigger1.Action.CcList = ""

    $trigger1.Action.Body = ""

    # Transition 1a - yellow ---> red

    $trans1a = New-Object VMware.Vim.AlarmTriggeringActionTransitionSpec

    $trans1a.StartState = "yellow"

    $trans1a.FinalState = "red"

    # Transition 1b - red ---> yellow

    $trans1b = New-Object VMware.Vim.AlarmTriggeringActionTransitionSpec

    $trans1b.StartState = "red"

    $trans1b.FinalState = "yellow"

    $trigger1.TransitionSpecs += $trans1a

    $trigger1.TransitionSpecs += $trans1b

    $alarm.action.action += $trigger1

    # Expression 1 - Host profile compliant

    $expression1 = New-Object VMware.Vim.EventAlarmExpression

    $expression1.EventType = $null

    $expression1.eventTypeId = "Host compliant with profile"

    $expression1.objectType = "HostSystem"

    $expression1.status = "yellow"

    # Expression 2 - Host profile non-compliant

    $expression2 = New-Object VMware.Vim.EventAlarmExpression

    $expression2.EventType = $null

    $expression2.eventTypeId = "Host non-compliant with profile"

    $expression2.objectType = "HostSystem"

    $expression2.status = "red"

    $alarm.expression = New-Object VMware.Vim.OrAlarmExpression

    $alarm.expression.expression += $expression1

    $alarm.expression.expression += $expression2

    $alarm.setting = New-Object VMware.Vim.AlarmSetting

    $alarm.setting.reportingFrequency = 0

    $alarm.setting.toleranceRange = 0

    # Create alarm.

    $alarmMgr.CreateAlarm($entity.MoRef, $alarm)

    # Disconnect from vCenter

    Disconnect-VIServer $vc -Confirm:$false

    I first tried with a green state instead of yellow... but then the script won't even create.  As it stands I get a page load of SOAP errors....

    Any help would be (as always) greatly appreciated.

    -Mark



  • 2.  RE: Alarm to monitor host profile deviation

    Posted Oct 22, 2015 10:35 AM

    Where did you get the text for the EventTypeId from ?

    Did you get that through Onyx or by looking at the events ?



  • 3.  RE: Alarm to monitor host profile deviation

    Posted Oct 22, 2015 10:49 AM

    Sheer guesswork.  And by judging by the result, an incorrect one at that :-(

    Should I go down the Get-View route?

    -Mark



  • 4.  RE: Alarm to monitor host profile deviation

    Posted Oct 22, 2015 10:58 AM

    I suspect there should be a HostCompliantEvent or HostNonCompliantEvent event.

    You can try to apply a host profile manually, and then check if this visible in the events.

    Use this to query the events after after the host profile apply.

    $esxName = 'MyEsxi'

    $esx = Get-VMHost -Name $esxName

    $events = Get-VIEvent -Entity $esx -Start (Get-Date).AddHours(-1) -MaxSamples ([int]::MaxValue)

    $events | Group-Object -Property {$_.GetType().Name}



  • 5.  RE: Alarm to monitor host profile deviation
    Best Answer

    Posted Oct 22, 2015 12:36 PM

    With the help of Oynx I've fixed it.  Here's what it is now:

    # Variables

    $vc = "vcsa.lab.mdb-lab.com"

    $credential = Get-Credential

    $mailto = "virtualhobbit@mdb-lab.local"

    # Connect to vCenter

    Connect-VIServer $vc -credential $credential

    # Get the Datacenter

    $dc = "London"

    $entity = Get-Datacenter $dc | Get-View

    # Create the alarmspec object

    $spec = New-Object VMware.Vim.AlarmSpec

    $spec.name = "Host profile deviation"

    $spec.description = "Monitors host profile deviation"

    $spec.enabled = $true

    # Expression 1 - Host profile is non-compliant

    $spec.expression = New-Object VMware.Vim.OrAlarmExpression

    $spec.expression.expression = New-Object VMware.Vim.AlarmExpression[] (1)

    $spec.expression.expression[0] = New-Object VMware.Vim.EventAlarmExpression

    $spec.expression.expression[0].eventType = "HostNonCompliantEvent"

    $spec.expression.expression[0].objectType = "HostSystem"

    $spec.expression.expression[0].status = "red"

    # Create the alarm action

    $spec.action = New-Object VMware.Vim.GroupAlarmAction

    $spec.action.action = New-Object VMware.Vim.AlarmAction[] (1)

    $spec.action.action[0] = New-Object VMware.Vim.AlarmTriggeringAction

    $spec.action.action[0].action = New-Object VMware.Vim.SendEmailAction

    $spec.action.action[0].action.toList = $mailto

    $spec.action.action[0].action.ccList = ""

    $spec.action.action[0].action.subject = "Host non-compliant with profile"

    $spec.action.action[0].action.body = ""

    $spec.action.action[0].transitionSpecs = New-Object VMware.Vim.AlarmTriggeringActionTransitionSpec[] (1)

    $spec.action.action[0].transitionSpecs[0] = New-Object VMware.Vim.AlarmTriggeringActionTransitionSpec

    $spec.action.action[0].transitionSpecs[0].startState = "yellow"

    $spec.action.action[0].transitionSpecs[0].finalState = "red"

    $spec.action.action[0].transitionSpecs[0].repeats = $false

    $spec.action.action[0].green2yellow = $false

    $spec.action.action[0].yellow2red = $false

    $spec.action.action[0].red2yellow = $false

    $spec.action.action[0].yellow2green = $false

    $spec.setting = New-Object VMware.Vim.AlarmSetting

    $spec.setting.toleranceRange = 0

    $spec.setting.reportingFrequency = 0

    $_this = Get-View -Id 'AlarmManager-AlarmManager'

    # Create alarm

    $_this.CreateAlarm($entity.MoRef, $spec)

    # Disconnect from vCenter

    Disconnect-VIServer $vc -Confirm:$false

    I'm now writing a block to change the scheduled task to every hour.

    -Mark



  • 6.  RE: Alarm to monitor host profile deviation

    Posted Feb 19, 2025 03:50 PM
    Edited by mmustain Feb 20, 2025 04:25 PM

    Thank you for this. This check appears to be available in vSphere now by default. You just have to create a custom alarm and choose "Host non-compliant with profile" as the check and "Host compliant with profile" as the reset.