From b5563cc11a4adf1ea6ba155a05388865c80d90d1 Mon Sep 17 00:00:00 2001 From: Kyle Ruddy Date: Fri, 14 Jun 2019 10:10:09 -0400 Subject: [PATCH 1/3] Update VMware.Community.CISTag.psm1 Add Datastore support for New-CISTagAssignment --- .../VMware.Community.CISTag.psm1 | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/Modules/VMware.Community.CISTag/VMware.Community.CISTag.psm1 b/Modules/VMware.Community.CISTag/VMware.Community.CISTag.psm1 index 05594e4..062cd95 100644 --- a/Modules/VMware.Community.CISTag/VMware.Community.CISTag.psm1 +++ b/Modules/VMware.Community.CISTag/VMware.Community.CISTag.psm1 @@ -40,7 +40,7 @@ function Get-CISTag { } else { $tagArray = @() $tagIdList = $tagSvc.list() | Select-Object -ExpandProperty Value - [integer]$counter = 1 + [int]$counter = 1 foreach ($t in $tagIdList) { $tagArray += $tagSvc.get($t) $counter++ @@ -49,11 +49,11 @@ function Get-CISTag { } if ($PSBoundParameters.ContainsKey("Name")) { if ($vCenterConn){ - $tagOutput = $vCTagList | where {$_.Name -eq $Name} - } else {$tagOutput = $tagArray | Where {$_.Name -eq $Name}} + $tagOutput = $vCTagList | Where-Object {$_.Name -eq $Name} + } else {$tagOutput = $tagArray | Where-Where-Object {$_.Name -eq $Name}} } elseif ($PSBoundParameters.ContainsKey("Category")) { if ($vCenterConn){ - $tagOutput = $vCTagList | where {$_.Category -eq $Category} + $tagOutput = $vCTagList | Where-Object {$_.Category -eq $Category} } else { $tagCatid = Get-CISTagCategory -Name $Category | Select-Object -ExpandProperty Id $tagIdList = $tagSvc.list_tags_for_category($tagCatid) @@ -199,7 +199,7 @@ function Get-CISTagCategory { $tagCatArray += $tagCatSvc.get($tc) } if ($PSBoundParameters.ContainsKey("Name")) { - $tagCatOutput = $tagCatArray | Where {$_.Name -eq $Name} + $tagCatOutput = $tagCatArray | Where-Where-Object {$_.Name -eq $Name} } else { $tagCatOutput = $tagCatArray } @@ -337,6 +337,8 @@ function Get-CISTagAssignment { if ($PSBoundParameters.ContainsKey("ObjectId")) { if ($ObjectId.split('-')[0] -eq 'vm') { $objType = 'VirtualMachine' + } elseif ($ObjectId.Split('-')[0] -eq 'datastore') { + $objType = 'Datastore' } else {Write-Warning 'Only VirtualMachine types currently supported.'; break} $objObject = $tagAssocSvc.help.list_attached_tags.object_id.create() $objObject.id = $ObjectId @@ -366,7 +368,7 @@ function Get-CISTagAssignment { $tagIdOutput = @() $tagCategories = Get-CISTagCategory | Sort-Object -Property Name if ($Category) { - $tagCatId = $tagCategories | where {$_.Name -eq $Category} | Select-Object -ExpandProperty Id + $tagCatId = $tagCategories | Where-Object {$_.Name -eq $Category} | Select-Object -ExpandProperty Id $tagIdOutput += $tagSvc.list_tags_for_category($tagCatId) } else { foreach ($tagCat in $tagCategories) { @@ -380,9 +382,9 @@ function Get-CISTagAssignment { foreach ($tagId in $tagIdOutput) { $tagAttObj = @() if ($Entity) { - $tagAttObj += $tagAssocSvc.list_attached_objects($tagId) | where {$_.type -eq $viObject.type -and $_.id -eq $viObject.Value} + $tagAttObj += $tagAssocSvc.list_attached_objects($tagId) | Where-Object {$_.type -eq $viObject.type -and $_.id -eq $viObject.Value} } else { - $tagAttObj += $tagAssocSvc.list_attached_objects($tagId) | where {$_.id -eq $ObjectId} + $tagAttObj += $tagAssocSvc.list_attached_objects($tagId) | Where-Object {$_.id -eq $ObjectId} } foreach ($obj in $tagAttObj) { if ($obj.type -eq "VirtualMachine") { @@ -393,7 +395,7 @@ function Get-CISTagAssignment { } else {$objName = 'Object Not Found'} $tempObject = "" | Select-Object Tag, Entity - $tempObject.Tag = $tagReference | where {$_.id -eq $tagId} | Select-Object -ExpandProperty Name + $tempObject.Tag = $tagReference | Where-Object {$_.id -eq $tagId} | Select-Object -ExpandProperty Name $tempObject.Entity = $objName $tagOutput += $tempObject } @@ -419,7 +421,7 @@ function Get-CISTagAssignment { $objName = $vmSvc.list($filterVmObj) | Select-Object -ExpandProperty Name } else {$objName = 'Object Not Found'} $tempObject = "" | Select-Object Tag, Entity - $tempObject.Tag = $tagReference | where {$_.id -eq $tagId} | Select-Object -ExpandProperty Name + $tempObject.Tag = $tagReference | Where-Object {$_.id -eq $tagId} | Select-Object -ExpandProperty Name $tempObject.Entity = $objName $tagOutput += $tempObject } @@ -536,7 +538,9 @@ function New-CISTagAssignment { } elseif ($PSBoundParameters.ContainsKey("TagId") -and $PSBoundParameters.ContainsKey("ObjectId")) { if ($ObjectId.split('-')[0] -eq 'vm') { $objType = 'VirtualMachine' - } else {Write-Warning 'Only VirtualMachine types currently supported.'; break} + } elseif ($ObjectId.Split('-')[0] -eq 'datastore') { + $objType = 'Datastore' + } else {Write-Warning 'Only VirtualMachine and Datastore types currently supported.'; break} if ($TagId -is [array] -and $ObjectId -isnot [array]) { $objObject = $tagAssocSvc.help.attach_multiple_tags_to_object.object_id.create() $objObject.id = $ObjectId @@ -674,7 +678,9 @@ function Remove-CISTagAssignment { } elseif ($PSBoundParameters.ContainsKey("TagId") -and $PSBoundParameters.ContainsKey("ObjectId")) { if ($ObjectId.split('-')[0] -eq 'vm') { $objType = 'VirtualMachine' - } else {Write-Warning 'Only VirtualMachine types currently supported.'; break} + } elseif ($ObjectId.Split('-')[0] -eq 'datastore') { + $objType = 'Datastore' + }else {Write-Warning 'Only VirtualMachine types currently supported.'; break} if ($TagId -is [array] -and $ObjectId -isnot [array]) { $objObject = $tagAssocSvc.help.detach_multiple_tags_from_object.object_id.create() $objObject.id = $ObjectId From b3e9ffc51d63c7e0c879ea25c917f093dcc2aca8 Mon Sep 17 00:00:00 2001 From: Kyle Ruddy Date: Fri, 14 Jun 2019 16:59:43 -0400 Subject: [PATCH 2/3] Update VMware.Community.CISTag.psm1 Issues fixed with "where-where-object" typos Loop fixed for detecting the Object Type Get/Remove-CISTagAssignment updated to work with Datastore objects --- .../VMware.Community.CISTag.psm1 | 111 ++++++++++++++---- 1 file changed, 85 insertions(+), 26 deletions(-) diff --git a/Modules/VMware.Community.CISTag/VMware.Community.CISTag.psm1 b/Modules/VMware.Community.CISTag/VMware.Community.CISTag.psm1 index 062cd95..4ca717c 100644 --- a/Modules/VMware.Community.CISTag/VMware.Community.CISTag.psm1 +++ b/Modules/VMware.Community.CISTag/VMware.Community.CISTag.psm1 @@ -50,7 +50,7 @@ function Get-CISTag { if ($PSBoundParameters.ContainsKey("Name")) { if ($vCenterConn){ $tagOutput = $vCTagList | Where-Object {$_.Name -eq $Name} - } else {$tagOutput = $tagArray | Where-Where-Object {$_.Name -eq $Name}} + } else {$tagOutput = $tagArray | Where-Object {$_.Name -eq $Name}} } elseif ($PSBoundParameters.ContainsKey("Category")) { if ($vCenterConn){ $tagOutput = $vCTagList | Where-Object {$_.Category -eq $Category} @@ -199,7 +199,7 @@ function Get-CISTagCategory { $tagCatArray += $tagCatSvc.get($tc) } if ($PSBoundParameters.ContainsKey("Name")) { - $tagCatOutput = $tagCatArray | Where-Where-Object {$_.Name -eq $Name} + $tagCatOutput = $tagCatArray | Where-Object {$_.Name -eq $Name} } else { $tagCatOutput = $tagCatArray } @@ -336,10 +336,10 @@ function Get-CISTagAssignment { $tagAssocSvc = Get-CisService -Name com.vmware.cis.tagging.tag_association if ($PSBoundParameters.ContainsKey("ObjectId")) { if ($ObjectId.split('-')[0] -eq 'vm') { - $objType = 'VirtualMachine' + $objType = "VirtualMachine" } elseif ($ObjectId.Split('-')[0] -eq 'datastore') { $objType = 'Datastore' - } else {Write-Warning 'Only VirtualMachine types currently supported.'; break} + } else {Write-Warning 'Only VirtualMachine and Datastore types currently supported.'; break} $objObject = $tagAssocSvc.help.list_attached_tags.object_id.create() $objObject.id = $ObjectId $objObject.type = $objType @@ -356,8 +356,15 @@ function Get-CISTagAssignment { $filterVmNameObj = $vmsvc.help.list.filter.create() $filterVmNameObj.names.add($Entity) | Out-Null $objId = $vmSvc.list($filterVmNameObj) | Select-Object -ExpandProperty vm - if ($objId) {$objType = 'VirtualMachine'} - else {Write-Warning "No entities found."; break} + if ($objId) {$objType = "VirtualMachine"} + else { + $dsSvc = Get-CisService com.vmware.vcenter.datastore + $filterDsNameObj = $dsSvc.Help.list.filter.Create() + $filterDsNameObj.names.add($Entity) | Out-Null + $objId = $dsSvc.list($filterDsNameObj) | Select-Object -ExpandProperty datastore + if ($objId) {$objType = "Datastore"} + else {Write-Warning "No entities found."; break} + } $objObject = $tagAssocSvc.help.list_attached_tags.object_id.create() $objObject.id = $objId $objObject.type = $objType @@ -392,8 +399,12 @@ function Get-CISTagAssignment { $filterVmObj = $vmsvc.help.list.filter.create() $filterVmObj.vms.add($obj.Id) | Out-Null $objName = $vmSvc.list($filterVmObj) | Select-Object -ExpandProperty Name - } - else {$objName = 'Object Not Found'} + } elseif ($obj.type -eq "Datastore") { + if (-Not $dsSvc) {$dsSvc = Get-CisService -Name com.vmware.vcenter.datastore} + $filterDsObj = $dsSvc.help.list.filter.create() + $filterDsObj.datastores.add($obj.Id) | Out-Null + $objName = $dsSvc.list($filterDsObj) | Select-Object -ExpandProperty Name + } else {$objName = 'Object Not Found'} $tempObject = "" | Select-Object Tag, Entity $tempObject.Tag = $tagReference | Where-Object {$_.id -eq $tagId} | Select-Object -ExpandProperty Name $tempObject.Entity = $objName @@ -406,8 +417,10 @@ function Get-CISTagAssignment { $tagAttObj += $tagAssocSvc.list_attached_objects($tagId) if ($global:DefaultVIServer -and $global:DefaultVIServer.Name -eq $global:DefaultCisServers.Name) { [Boolean]$vCenterConn = $true - } elseif ($tagAttObj.Type -contains 'VirtualMachine') { + } elseif ($tagAttObj.Type -contains "VirtualMachine") { if (-Not $vmSvc) {$vmSvc = Get-CisService -Name com.vmware.vcenter.vm} + } elseif ($tagAttObj.Type -contains "Datastore") { + if (-Not $dsSvc) {$dsSvc = Get-CisService -Name com.vmware.vcenter.datastore} } foreach ($obj in $tagAttObj) { if ($vCenterConn) { @@ -419,6 +432,10 @@ function Get-CISTagAssignment { $filterVmObj = $vmsvc.help.list.filter.create() $filterVmObj.vms.add($obj.Id) | Out-Null $objName = $vmSvc.list($filterVmObj) | Select-Object -ExpandProperty Name + } elseif ($obj.type -eq "Datastore") { + $filterDsObj = $dsSvc.help.list.filter.create() + $filterDsObj.datastores.add($obj.Id) | Out-Null + $objName = $dsSvc.list($filterDsObj) | Select-Object -ExpandProperty Name } else {$objName = 'Object Not Found'} $tempObject = "" | Select-Object Tag, Entity $tempObject.Tag = $tagReference | Where-Object {$_.id -eq $tagId} | Select-Object -ExpandProperty Name @@ -481,12 +498,19 @@ function New-CISTagAssignment { $objObject.id = $viObject.Value $objObject.type = $viObject.type } else { - $vmSvc = Get-CisService -Name com.vmware.vcenter.vm + if (-Not $vmSvc) {$vmSvc = Get-CisService -Name com.vmware.vcenter.vm} $filterVmNameObj = $vmsvc.help.list.filter.create() $filterVmNameObj.names.add($Entity) | Out-Null $objId = $vmSvc.list($filterVmNameObj) | Select-Object -ExpandProperty vm - if ($objId) {$objType = 'VirtualMachine'} - else {Write-Warning "No entities found."; break} + if ($objId) {$objType = "VirtualMachine"} + else { + if (-Not $dsSvc) {$dsSvc = Get-CisService -Name com.vmware.vcenter.datastore} + $filterDsNameObj = $dsSvc.Help.list.filter.Create() + $filterDsNameObj.names.add($Entity) | Out-Null + $objId = $dsSvc.list($filterDsNameObj) | Select-Object -ExpandProperty datastore + if ($objId) {$objType = "Datastore"} + else {Write-Warning "No entities found."; break} + } $objObject = $tagAssocSvc.help.list_attached_tags.object_id.create() $objObject.id = $objId $objObject.type = $objType @@ -502,12 +526,19 @@ function New-CISTagAssignment { $objObject.id = $viObject.Value $objObject.type = $viObject.type } else { - $vmSvc = Get-CisService -Name com.vmware.vcenter.vm + if (-Not $vmSvc) {$vmSvc = Get-CisService -Name com.vmware.vcenter.vm} $filterVmNameObj = $vmsvc.help.list.filter.create() $filterVmNameObj.names.add($Entity) | Out-Null $objId = $vmSvc.list($filterVmNameObj) | Select-Object -ExpandProperty vm - if ($objId) {$objType = 'VirtualMachine'} - else {Write-Warning "No entities found."; break} + if ($objId) {$objType = "VirtualMachine"} + else { + if (-Not $dsSvc) {$dsSvc = Get-CisService -Name com.vmware.vcenter.datastore} + $filterDsObj = $dsSvc.help.list.filter.create() + $filterDsObj.datastores.add($obj.Id) | Out-Null + $objId = $dsSvc.list($filterDsObj) | Select-Object -ExpandProperty Datastore + if ($objId) {$objType = "Datastore"} + else {Write-Warning "No entities found."; break} + } $objObject = $tagAssocSvc.help.list_attached_tags.object_id.create() $objObject.id = $objId $objObject.type = $objType @@ -523,12 +554,19 @@ function New-CISTagAssignment { $objObject.id = $viObject.Value $objObject.type = $viObject.type } else { - $vmSvc = Get-CisService -Name com.vmware.vcenter.vm + if (-Not $vmSvc) {$vmSvc = Get-CisService -Name com.vmware.vcenter.vm} $filterVmNameObj = $vmsvc.help.list.filter.create() $filterVmNameObj.names.add($Entity) | Out-Null $objId = $vmSvc.list($filterVmNameObj) | Select-Object -ExpandProperty vm - if ($objId) {$objType = 'VirtualMachine'} - else {Write-Warning "No entities found."; break} + if ($objId) {$objType = "VirtualMachine"} + else { + if (-Not $dsSvc) {$dsSvc = Get-CisService -Name com.vmware.vcenter.datastore} + $filterDsNameObj = $dsSvc.Help.list.filter.Create() + $filterDsNameObj.names.add($Entity) | Out-Null + $objId = $dsSvc.list($filterDsNameObj) | Select-Object -ExpandProperty datastore + if ($objId) {$objType = "Datastore"} + else {Write-Warning "No entities found."; break} + } $objObject = $tagAssocSvc.help.list_attached_tags.object_id.create() $objObject.id = $objId $objObject.type = $objType @@ -537,7 +575,7 @@ function New-CISTagAssignment { } } elseif ($PSBoundParameters.ContainsKey("TagId") -and $PSBoundParameters.ContainsKey("ObjectId")) { if ($ObjectId.split('-')[0] -eq 'vm') { - $objType = 'VirtualMachine' + $objType = "VirtualMachine" } elseif ($ObjectId.Split('-')[0] -eq 'datastore') { $objType = 'Datastore' } else {Write-Warning 'Only VirtualMachine and Datastore types currently supported.'; break} @@ -625,8 +663,15 @@ function Remove-CISTagAssignment { $filterVmNameObj = $vmsvc.help.list.filter.create() $filterVmNameObj.names.add($Entity) | Out-Null $objId = $vmSvc.list($filterVmNameObj) | Select-Object -ExpandProperty vm - if ($objId) {$objType = 'VirtualMachine'} - else {Write-Warning "No entities found."; break} + if ($objId) {$objType = "VirtualMachine"} + else { + if (-Not $dsSvc) {$dsSvc = Get-CisService -Name com.vmware.vcenter.datastore} + $filterDsNameObj = $dsSvc.Help.list.filter.Create() + $filterDsNameObj.names.add($Entity) | Out-Null + $objId = $dsSvc.list($filterDsNameObj) | Select-Object -ExpandProperty datastore + if ($objId) {$objType = "Datastore"} + else {Write-Warning "No entities found."; break} + } $objObject = $tagAssocSvc.help.detach_multiple_tags_from_object.object_id.create() $objObject.id = $objId $objObject.type = $objType @@ -646,8 +691,15 @@ function Remove-CISTagAssignment { $filterVmNameObj = $vmsvc.help.list.filter.create() $filterVmNameObj.names.add($Entity) | Out-Null $objId = $vmSvc.list($filterVmNameObj) | Select-Object -ExpandProperty vm - if ($objId) {$objType = 'VirtualMachine'} - else {Write-Warning "No entities found."; break} + if ($objId) {$objType = "VirtualMachine"} + else { + if (-Not $dsSvc) {$dsSvc = Get-CisService -Name com.vmware.vcenter.datastore} + $filterDsNameObj = $dsSvc.Help.list.filter.Create() + $filterDsNameObj.names.add($Entity) | Out-Null + $objId = $dsSvc.list($filterDsNameObj) | Select-Object -ExpandProperty datastore + if ($objId) {$objType = "Datastore"} + else {Write-Warning "No entities found."; break} + } $objObject = $tagAssocSvc.help.detach_tag_from_multiple_objects.object_ids.element.create() $objObject.id = $objId $objObject.type = $objType @@ -667,8 +719,15 @@ function Remove-CISTagAssignment { $filterVmNameObj = $vmsvc.help.list.filter.create() $filterVmNameObj.names.add($Entity) | Out-Null $objId = $vmSvc.list($filterVmNameObj) | Select-Object -ExpandProperty vm - if ($objId) {$objType = 'VirtualMachine'} - else {Write-Warning "No entities found."; break} + if ($objId) {$objType = "VirtualMachine"} + else { + if (-Not $dsSvc) {$dsSvc = Get-CisService -Name com.vmware.vcenter.datastore} + $filterDsNameObj = $dsSvc.Help.list.filter.Create() + $filterDsNameObj.names.add($Entity) | Out-Null + $objId = $dsSvc.list($filterDsNameObj) | Select-Object -ExpandProperty datastore + if ($objId) {$objType = "Datastore"} + else {Write-Warning "No entities found."; break} + } $objObject = $tagAssocSvc.help.detach.object_id.create() $objObject.id = $objId $objObject.type = $objType @@ -677,7 +736,7 @@ function Remove-CISTagAssignment { } } elseif ($PSBoundParameters.ContainsKey("TagId") -and $PSBoundParameters.ContainsKey("ObjectId")) { if ($ObjectId.split('-')[0] -eq 'vm') { - $objType = 'VirtualMachine' + $objType = "VirtualMachine" } elseif ($ObjectId.Split('-')[0] -eq 'datastore') { $objType = 'Datastore' }else {Write-Warning 'Only VirtualMachine types currently supported.'; break} From a7ff78fee0f8a7d1d24ac7b04f0dc7ee70dec522 Mon Sep 17 00:00:00 2001 From: Kyle Ruddy Date: Mon, 18 Nov 2019 19:09:41 -0500 Subject: [PATCH 3/3] Create Get-TriggeredAlarm.ps1 Adding a new function to view triggered alarms for vSphere objects --- Scripts/Get-TriggeredAlarm.ps1 | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Scripts/Get-TriggeredAlarm.ps1 diff --git a/Scripts/Get-TriggeredAlarm.ps1 b/Scripts/Get-TriggeredAlarm.ps1 new file mode 100644 index 0000000..a5d8dc6 --- /dev/null +++ b/Scripts/Get-TriggeredAlarm.ps1 @@ -0,0 +1,62 @@ +function Get-TriggeredAlarm { +<# + .SYNOPSIS + This function lists the triggered alarms for the specified entity in vCenter + .DESCRIPTION + List the triggered alarms for the given object + .NOTES + Author: Kyle Ruddy, @kmruddy, kmruddy.com + .PARAMETER VM + Specifies the name of the VM + .PARAMETER VMHost + Specifies the name of the VMHost + .PARAMETER Datacenter + Specifies the name of the Datacenter + .PARAMETER Datastore + Specifies the name of the Datastore + .EXAMPLE + Get-TriggeredAlarm -VM VMname + + Entity Alarm AlarmStatus AlarmMoRef EntityMoRef + ---- ---- ---- ---- ---- + VMname Name Yellow Alarm-MoRef Entity-MoRef +#> + + [CmdletBinding()] + param( + [string]$VM, + [string]$VMHost, + [string]$Datacenter, + [string]$Datastore + ) + BEGIN { + switch ($PSBoundParameters.Keys) { + 'VM' {$entity = Get-VM -Name $vm -ErrorAction SilentlyContinue} + 'VMHost' {$entity = Get-VMHost -Name $VMHost -ErrorAction SilentlyContinue} + 'Datacenter' {$entity = Get-Datacenter -Name $Datacenter -ErrorAction SilentlyContinue} + 'Datastore' {$entity = Get-Datastore -Name $Datastore -ErrorAction SilentlyContinue} + default {$entity = $null} + } + + if ($null -eq $entity) { + Write-Warning "No vSphere object found." + break + } + } + PROCESS { + if ($entity.ExtensionData.TriggeredAlarmState -ne "") { + $alarmOutput = @() + foreach ($alarm in $entity.ExtensionData.TriggeredAlarmState) { + $tempObj = "" | Select-Object -Property Entity, Alarm, AlarmStatus, AlarmMoRef, EntityMoRef + $tempObj.Entity = Get-View $alarm.Entity | Select-Object -ExpandProperty Name + $tempObj.Alarm = Get-View $alarm.Alarm | Select-Object -ExpandProperty Info | Select-Object -ExpandProperty Name + $tempObj.AlarmStatus = $alarm.OverallStatus + $tempObj.AlarmMoRef = $alarm.Alarm + $tempObj.EntityMoRef = $alarm.Entity + $alarmOutput += $tempObj + } + $alarmOutput | Format-Table -AutoSize + } + } + +} \ No newline at end of file