Skript – Report über neue und entfernte VMs

Um eine häufig gestellte Frage immer wieder schnell beantworten zu können habe ich mir ein PowerCLI Skript für einen Report über neue und entfernte VMs erstellt. Das Skript sollte einerseits einen kompletten Report mit allen relevanten Informationen ausgeben können, aber auch einfach nur einen schnellen Überblick in Form eines Summary verschaffen können.

In dem folgenden Beispiel ist die Funktion einmal mit und einmal ohne den Schalter -Summary ausgeführt. In allen meinen Beispielen habe ich für den Zeitraum des Report mit dem Schalter -Days auf 60 Tage erweitert, Standard ist 30 Tage.

Report über neue und entfernte VMs

Eine Detailabfrage von VMs, welche aus einem Template bereitgestellt wurden, könnte zum Beispiel so aussehen:

Detailed Report über neue und entfernte VMs

Report über neue und entfernte VMs im Detail

Der wichtigste Teil meines Skripts ist die Funktion „Get-VIEventPlus„, welche initial durch Luc Dekens in dem Artikel Get The VMotion/SvMotion History veröffentlicht wurde und nun etwas abgewandelt im vCheck for vSphere Anwendung findet. Ich verwende hier die etwas abgewandelte Version.

function Get-NewAndRemovedVMs {
<#	
    .NOTES
    ===========================================================================
    Created by: Markus Kraus
    Twitter: @VMarkus_K
    Private Blog: mycloudrevolution.com
    ===========================================================================
    Changelog:  
    2016.12 ver 1.0 Base Release 
	2017.01 ver 1.1 Added Summary
    ===========================================================================
    External Code Sources:  
    https://github.com/alanrenouf/vCheck-vSphere
    ===========================================================================
    Tested Against Environment:
    vSphere Version: 5.5 U2, 6.5
    PowerCLI Version: PowerCLI 6.3 R1, PowerCLI 6.5 R1
    PowerShell Version: 4.0, 5.0
    OS Version: Windows 8.1, Server 2012 R2
    ===========================================================================
    Keywords vSphere, VM
    ===========================================================================

    .DESCRIPTION
    This Function report newly created and deleted VMs by Cluster.       

    .Example
    Get-NewAndRemovedVMs -ClusterName Cluster* | ft -AutoSize  

    .Example
    Get-NewAndRemovedVMs -ClusterName Cluster01 -Days 90

	.Example
    Get-NewAndRemovedVMs -ClusterName * -Days 90 -Summary

    .PARAMETER ClusterName
    Name or Wildcard of your vSphere Cluster Name(s) to report.

	.PARAMETER Summary
    Displays only a short summary instead of the whole report.

    .PARAMETER Day
    Range in Days to report.


#Requires PS -Version 4.0
#Requires -Modules VMware.VimAutomation.Core, @{ModuleName="VMware.VimAutomation.Core";ModuleVersion="6.3.0.0"}
#>

param(
    [Parameter(Mandatory=$True, ValueFromPipeline=$False, Position=0, HelpMessage = "Name or Wildcard of your vSphere Cluster Name to report")]
    [ValidateNotNullorEmpty()]
        [String]$ClusterName,
	[Parameter(Mandatory=$False, ValueFromPipeline=$False, Position=1, HelpMessage = "Displays only a summary")]
		[Switch]$Summary = $False,
    [Parameter(Mandatory=$False, ValueFromPipeline=$False, Position=2, HelpMessage = "Range in Days to report")]
		[String]$Days = "30"
)
Begin {
	If (!(Get-Cluster -Name $ClusterName -ErrorAction SilentlyContinue)) {throw "No vSphere Cluster matching the Name '$ClusterName' found."}
    function Get-VIEventPlus {
	 
	param(
		[VMware.VimAutomation.ViCore.Impl.V1.Inventory.InventoryItemImpl[]]$Entity,
		[string[]]$EventType,
		[DateTime]$Start,
		[DateTime]$Finish = (Get-Date),
		[switch]$Recurse,
		[string[]]$User,
		[Switch]$System,
		[string]$ScheduledTask,
		[switch]$FullMessage = $false,
		[switch]$UseUTC = $false
	)

	process {
		$eventnumber = 100
		$events = @()
		$eventMgr = Get-View EventManager
		$eventFilter = New-Object VMware.Vim.EventFilterSpec
		$eventFilter.disableFullMessage = ! $FullMessage
		$eventFilter.entity = New-Object VMware.Vim.EventFilterSpecByEntity
		$eventFilter.entity.recursion = &{if($Recurse){"all"}else{"self"}}
		$eventFilter.eventTypeId = $EventType
		if($Start -or $Finish){
			$eventFilter.time = New-Object VMware.Vim.EventFilterSpecByTime
			if($Start){
				$eventFilter.time.beginTime = $Start
			}
			if($Finish){
				$eventFilter.time.endTime = $Finish
			}
		}
		if($User -or $System){
			$eventFilter.UserName = New-Object VMware.Vim.EventFilterSpecByUsername
			if($User){
				$eventFilter.UserName.userList = $User
			}
			if($System){
				$eventFilter.UserName.systemUser = $System
			}
		}
		if($ScheduledTask){
			$si = Get-View ServiceInstance
			$schTskMgr = Get-View $si.Content.ScheduledTaskManager
			$eventFilter.ScheduledTask = Get-View $schTskMgr.ScheduledTask |
			where {$_.Info.Name -match $ScheduledTask} |
			Select -First 1 |
			Select -ExpandProperty MoRef
		}
		if(!$Entity){
			$Entity = @(Get-Folder -NoRecursion)
		}
		$entity | %{
			$eventFilter.entity.entity = $_.ExtensionData.MoRef
			$eventCollector = Get-View ($eventMgr.CreateCollectorForEvents($eventFilter))
			$eventsBuffer = $eventCollector.ReadNextEvents($eventnumber)
			while($eventsBuffer){
				$events += $eventsBuffer
				$eventsBuffer = $eventCollector.ReadNextEvents($eventnumber)
			}
			$eventCollector.DestroyCollector()
		}
		if (-not $UseUTC)
		{
			$events | % { $_.createdTime = $_.createdTime.ToLocalTime() }
		}
		
		$events
	}
}
}

process {
	$result = Get-VIEventPlus -Start ((get-date).adddays(-$Days)) -EventType @("VmCreatedEvent", "VmBeingClonedEvent", "VmBeingDeployedEvent","VmRemovedEvent")
	$sortedResult = $result | Select CreatedTime, @{N='Cluster';E={$_.ComputeResource.Name}}, @{Name="VMName";Expression={$_.vm.name}}, UserName, @{N='Type';E={$_.GetType().Name}}, FullFormattedMessage | Sort CreatedTime
	$Output = $sortedResult | where {$_.Cluster -like $ClusterName}
	
}
end {
	If ($Summary) {

		$Created 	= [Array]$($Output | Where-Object {$_.Type -like "VmCreatedEvent"})
		$Cloned		= [Array]$($Output | Where-Object {$_.Type -like "VmBeingClonedEvent"})
		$Deployed 	= [Array]$($Output | Where-Object {$_.Type -like "VmBeingDeployedEvent"})
		$Removed 	= [Array]$($Output | Where-Object {$_.Type -like "VmRemovedEvent"})
		
		$Report = [PSCustomObject] @{
							Created 	= ($Created).count
							Cloned 		= ($Cloned).count
							Deployed 	= ($Deployed).count
							Removed 	= ($Removed).count

						}
		$Report
	}
	else {
		$Output
	}
}
}

 

Report über neue und entfernte VMs auf GitHub

Das Modul ist natürlich auch wieder in meinem vSphere Modules GitHub Projekt zu finden:

My VMware vSphere Modules

 

 

Welches nun auch eine Doku auf Read The Docs hat:

Read the Docs

 

Leave a Reply