Welcome to the next installment in our Operationalizing VMware Virtual SAN series. In our previous article we detailed “How to configure vCenter alarms for Virtual SAN”. In today’s article we will demonstrate how to automate that configuration workflow leveraging PowerCLI.
The PowerCLI code required to automate the configuration of vCenter Alarms for Virtual SAN is considerably straightforward.
1. Connect to vCenter
1 |
Connect-VIServer -Server 192.168.100.1 -User Administrator@vsphere.local -Password vmware |
2. Define the the Virtual SAN cluster where you would like the rules to be created
1 |
$Cluster = "Cluster Site A" |
3. Next we create a hash table with the desired VMware ESXi Observeration IDs (VOB IDs) for Virtual SAN and include a description for each VOB ID.
If you are not used to programming, the concept of arrays and hash tables may be a bit confusing. Using variables is generally much easier to understand. One way of understanding variables is to think of them simply as a short amount of text used to represent a larger amount of text in your program or script ($x=”larger amount of text”). Instead of typing “larger amount of text” continually, you can simply type $x and the language interpreter (in our case PowerShell), will substitute the string “larger amount of text” wherever it finds $x in your script. Variables can be used to greatly reduce the amount of code you have to type, make your scripts much easier to read, and have many other uses as well.
If we think of variables as ways to store one value to reference, we can think of arrays as a way to store multiple values to reference. In our example today, we would have to create at least 32 variables to perform the same work that we can with one hash table.
A hash table is a type of array that is also known as a dictionary. It is a collection of name-value pairs (e.g. “name”=”value”) that can be used . Here we have an example of a basic hash table:
1 2 3 4 5 |
$HashTableName = @{ VOB_ID_A="VOB Description"; VOB_ID_B="VOB Description"; VOB_ID_C="VOB Description"; } |
In the table below we have a breakdown of the components of the code used to create a hash table:
Syntax Component | Description |
$HashTableName = | Replace “HashTableName” with the text you wish to use to reference this list of key-values pairs. |
@{ | Indicates the start of the hash table or array |
VOB_ID_A=”VOB Description”; | Key-Value pair to store within the hash table. VOB_ID_A will be the VOB ID from the VMware ESXi Observation Log (VOBD) (e.g. “esx.audit.vsan.clustering.enabled”). “VOB Description” will be the description of the associated “VOB ID” (e.g. “Virtual SAN clustering service had been enabled”). Make sure to use quotation marks whenever spaces are used and to separate each key-value pair with a semicolon (;).Examine /var/log/vobd.log on your vSphere host to obtain possible VOB IDs. See here for a list of VMware ESXi Observation IDs for Virtual SAN. |
} | Indicates the end of the hash table or array |
Here is an example of a hash table with a single key-value pair representing a single vCenter Alarm for Virtual SAN:
1 2 3 |
$VSANAlerts = @{ "esx.audit.vsan.clustering.enabled" = "Virtual SAN clustering service had been enabled"; } |
Below is the actual hash table that we will use in our example Virtual SAN Alarm Configuration script. It is fully populated with all of the recommended VOB IDs for Virtual SAN along with the description for each. We have labeled this hash table as “$VSANAlerts”. You will see $VSANAlerts referenced further along in the script as we reference the items within our hash table.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$VSANAlerts = @{ "esx.audit.vsan.clustering.enabled" = "Virtual SAN clustering service had been enabled"; "esx.clear.vob.vsan.pdl.online" = "Virtual SAN device has come online."; "esx.clear.vsan.clustering.enabled" = "Virtual SAN clustering services have now been enabled."; "esx.clear.vsan.vsan.network.available" = "Virtual SAN now has at least one active network configuration."; "esx.clear.vsan.vsan.vmknic.ready" = "A previously reported vmknic now has a valid IP."; "esx.problem.vob.vsan.lsom.componentthreshold" = "Virtual SAN Node: Near node component count limit."; "esx.problem.vob.vsan.lsom.diskerror" = "Virtual SAN device is under permanent error."; "esx.problem.vob.vsan.lsom.diskgrouplimit" = "Failed to create a new disk group."; "esx.problem.vob.vsan.lsom.disklimit" = "Failed to add disk to disk group."; "esx.problem.vob.vsan.pdl.offline" = "Virtual SAN device has gone offline."; "esx.problem.vsan.clustering.disabled" = "Virtual SAN clustering services have been disabled."; "esx.problem.vsan.lsom.congestionthreshold" = "Virtual SAN device Memory/SSD congestion has changed."; "esx.problem.vsan.net.not.ready" = "A vmknic added to Virtual SAN network config doesn't have valid IP."; "esx.problem.vsan.net.redundancy.lost" = "Virtual SAN doesn't haven any redundancy in its network configuration."; "esx.problem.vsan.net.redundancy.reduced" = "Virtual SAN is operating on reduced network redundancy."; "esx.problem.vsan.no.network.connectivity" = "Virtual SAN doesn't have any networking configuration for use." } |
(For more information on working with PowerShell hash tables, see this handy Microsoft TechNet article)
4. Next we use the Get-View cmdlet to query the vCenter Alarm Manager for each VOB ID listed in step 3.
The Get-View cmdlet returns the vSphere inventory objects (VIObject) that correspond to the specified search criteria.
1 2 3 4 5 |
$alarmMgr = Get-View AlarmManager $entity = Get-Cluster $Cluster | Get-View $VSANAlerts.Keys | Foreach { $Name = $VSANAlerts.Get_Item($_) $Value = $_ |
5. Create the vCenter Alarm specification object
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$alarm = New-Object VMware.Vim.AlarmSpec $alarm.Name = $Name $alarm.Description = $Name $alarm.Enabled = $TRUE $expression = New-Object VMware.Vim.EventAlarmExpression $expression.EventType = Vim.Event.EventEx $expression.eventTypeId = $Value $expression.objectType = "HostSystem" $expression.status = "red" $alarm.expression = New-Object VMware.Vim.OrAlarmExpression $alarm.expression.expression += $expression $alarm.setting = New-Object VMware.Vim.AlarmSetting $alarm.setting.reportingFrequency = 0 $alarm.setting.toleranceRange = 0 |
6. Create the vCenter Alarm in vCenter
1 2 3 4 |
Write-Host "Creating Alarm on $Cluster for $Name" $CreatedAlarm = $alarmMgr.CreateAlarm($entity.MoRef, $alarm) } Write-Host "All Alarms Added to $Cluster" |
As you can see, the steps to create vCenter Alarms for Virtual SAN are actually pretty straightforward. If you have not yet began monitoring your Virtual SAN environment, these steps can accelerate the process quite rapidly and you really do not have to be an expert in PowerCLI to do so.
VMware Hands on Labs
Here is a great tip brought to you by our friends at the VMware Hands on Labs. If you would like an excellent shortcut to getting “hands on” creating vCenter Alarms for Virtual SAN, using PowerCLI cmdlets, try out the lab below:
We have many more articles on there way so share, re-tweet, or whatever your favorite social media method is. You will not want to miss these!
Thanks to @millardjk for his keen eye and to VMware genius Alan Renouf (@alanrenouf) for his contributions to this topic.