Webinar Review – Veeam PowerShell Deep Dive

Im November hatte ich die Möglichkeit zusammen mit Stefano Heisig ein Veeam PowerShell Deep Dive Webinar zu halten. Ich hoffe, dass es allein Teilnehmern ähnlich viel Spaß bereitet hat mir zuzusehen, wie es mir selbst Spaß gemacht die 45 Minuten vorzubereiten und abzuhalten. Veeam hat auch mittlerweile die Aufzeichnung des Webinars online zur Verfügung gestellt. Als Ergänzung zum Video habe ich mein Script Runbook auf GitHub veröffentlicht.

In diesem Artikel möchte ich noch einmal die Inhalte des Webinars etwas aufarbeiten und teilweise weiter erläutern.

Veeam PowerShell Deep Dive – Basics

Auch ein Veeam PowerShell Deep Dive muss mit ein paar Grundlagen beginnen. Ich werde es aber versuchen kurz zu halten.

PowerShell SnapIn laden

Das Veeam PowerShell SnapIn wird zusammen mit der Veeam Backup & Replication Konsole ausgeliefert. Somit ist das SnapIn auf dem Backup Server direkt installiert, um noch auf weiteren Server die Veeam PowerShell zu nutzen einfach die Konsole vom Veeam Backup & Replication installations Medium installieren.

Get-PSSnapin -Registered | fl *
Add-PSSnapin VeeamPSSnapin

(Get-Command VeeamPSSnapIn\*).Count
Veeam PowerShell Deep Dive - Load PowerShell SnapIn

Veeam Backup Server verbinden

Nach dem Laden des SnapIns kann die Verbindung zum Veeam Backup & Replication Server mit anderen Credential oder den Session Credentials aufgebaut werden.

Referenz: Connect-VBRServerGet-VBRServerSession

$VeeamCred = Get-Credential -Message "Veeam Credential"
Connect-VBRServer -Server "192.168.3.100" -Credential $VeeamCred

Get-VBRServerSession
Veeam PowerShell Deep Dive - Connect VBR Server

Alle Jobs auflisten

Mit dem Cmdlet Get-VBRJob lassen sich die gängigsten Veeam Job Typen anzeigen:

  • Backup jobs
  • Replication jobs
  • Backup copy jobs
  • File copy jobs
  • VM Copy jobs

Spezielle Cmdlets gibt es zusätzlich noch für diese Veeam Job Typen:

Referenz: Get-VBRJob

Get-VBRJob | Select-Object Name, JobType, SourceType | Format-Table -AutoSize
Veeam PowerShell Deep Dive - Get All VBR Jobs

Job Objekte auflisten

Die Objekte innerhalb eines Jobs können mit einem eigenen Cmdlet oder mit einer Methode der Jobs aufgelistet werden. Wenn in einem Slript der Veeam Job bereits  in einer Variablen vorhanden (in dem Beispiel $Job) ist, ist die Methode wesentlich schneller als das Cmdlet.

Referenz: Get-VBRJobObject

Veeam PowerShell Deep Dive - Get Objects in Job -  Cmdlet vs. Methode
# Cmdlet
Get-VBRJobObject -Job "Backup PhotonOS" | Format-Table -AutoSize

# Methode
$Job = Get-VBRJob -Name "Backup PhotonOS" 
$Job.GetObjectsInJob() | Format-Table -AutoSize
Veeam PowerShell Deep Dive - Get Objects in Job

Letzte Session anzeigen

An dieser Stelle ist es denke ich wichtig den Unterschied zwischen Job und Session klar zu stellen. Ein Job ist meinen Augen die Definition und die Session die einzelne Ausführung eines Jobs. Das PowerShell Objekt einer Session beinhaltet auch das Log.

Referenz: Get-VBRSession

Get-VBRSession -Job $Job -Last

(Get-VBRSession -Job $Job -Last).Log.Title
Veeam PowerShell Deep Dive - Get last job Session and Logs

Backup Repositories anzeigen

Die Veeam Backup  Repositories lassen sich eigentlich sehr einfach mit einem eigenen Cmdlet anzeigen. Etwas komplexer wird es jedoch wenn man mit Scale Out Repositories in seiner Umgebung arbeitet (Was dringend zu empfehlen ist!).

Referenz: Get-VBRBackupRepositoryGet-VBRRepositoryExtent

Get-VBRBackupRepository  | Select-Object Name, Path, Type | Format-Table -AutoSize

## Backup Repositories Advanced
[Array]$RepoList = Get-VBRBackupRepository | Where-Object {$_.Type -ne "SanSnapshotOnly"} 
[Array]$ScaleOuts = Get-VBRBackupRepository -ScaleOut
if ($ScaleOuts) {
    foreach ($ScaleOut in $ScaleOuts) {
        $Extents = Get-VBRRepositoryExtent -Repository $ScaleOut
        foreach ($Extent in $Extents) {
            $RepoList = $RepoList + $Extent.repository
        }
    }
}
$RepoList | Select-Object Name, Path, `
@{Name="CachedTotalSpaceGB"; Expression= {[Math]::Round([Decimal]$_.info.CachedTotalSpace/1GB,2)}}, `
@{Name="CachedFreeSpaceGB"; Expression= {[Math]::Round([Decimal]$_.info.CachedFreeSpace/1GB,2)}} | Format-Table -AutoSize
Veeam PowerShell Deep Dive - Get Backup Repositories
Veeam PowerShell Deep Dive - Get Backup Repositories Advanced

Veeam PowerShell Deep Dive – Tags

In dem Webinar war das Thema vSphere Tags ursprünglich in eine kleine Story eingebettet:

Nutzung von vSphere-Tags: Auslesen der VMware vSphere-Tags für die Zuweisung von VMs nach Standort oder OS-Kriterien – damit lassen sich VMs automatisiert einem Backup-Job zuweisen.

https://www.veeam.com/de/videos/webinar-powershell-deep-dive-14574.html

Für diesen Artikel werde ich das Thema jedoch etwas anders angehen.

vSphere Tag und Veeam Inventory

In meinem Lab habe ich ein paar vSphere Tags unterschiedlicher Kategorisieren vorbereitet. Um diese anzuzeigen, muss aber zuerst das (oder die) vCenter noch zusätzlich in meiner PowerShell Session verbunden werden.

Alle vCenter im Veeam Backup & Replication Inventory lassen sich sehr einfach so verbinden:

# Get All vCenters in VBR Inventory 
[Array]$VCs = (Get-VBRServer).where{($_.Type -eq "VC")}

# Load and Configure PowerCLI
Get-Module -ListAvailable -Name VMware* | Import-Module
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -InvalidCertificateAction Ignore -Scope Session -Confirm:$false

# Connect vCenters
foreach ($VC in $VCs){
    $vCenterCred = Get-Credential -Message "Credential for '$($VC.Name)'"
    Connect-VIServer -Server $($VC.Name) -Credential $vCenterCred
}

Nun können wir und die Tag kategirien und tags im vCenter Bestand ansehen.

Veeam PowerShell Deep Dive - Get vSphere Tags and Tag Categoies

Diese vSphere Tags lassen sich auch im Veeam Inventory finden und über die Id zu Reference Beziehung auch eindeutig zuweisen.

Veeam PowerShell Deep Dive - Get vSphere Tags in Veeam Inventory
$vSphereTag = Get-TagCategory -Name "OS-Type" | Get-Tag -Name "Windows"
(Find-VBRViEntity -Tags).where({$_.Type -eq "Tag" -and $_.Reference -eq $vSphereTag.Id})
Veeam PowerShell Deep Dive - Match Tags

Tags und Backup Jobs

Den erfolgreich identifizierten vSphere Tag können wir nun einem Backup Job zuordnen beziehungsweise auch wieder entfernen.

$vSphereTag = Get-TagCategory -Name "OS-Type" | Get-Tag -Name "Windows"
$ExampleTag = (Find-VBRViEntity -Tags).where({$_.Type -eq "Tag" -and $_.Reference -eq $vSphereTag.Id})

# Get Job
$VBRJobToLocationA = Get-VBRJob -Name "Backup to LocationA"
$VBRJobToLocationA | Get-VBRJobObject | select Type, Location, Name

# Add tag to Job
Add-VBRViJobObject -Job $VBRJobToLocationA -Entities $ExampleTag | Out-Null
$VBRJobToLocationA | Get-VBRJobObject | select Type, Location, Name

# Remove tag from Job
$VBRJobToLocationA | Get-VBRJobObject | Where-Object {$_.Location -eq $ExampleTag.Path} | Remove-VBRJobObject -Completely:$true  | Out-Null
$VBRJobToLocationA | Get-VBRJobObject | select Type, Location, Name
Veeam PowerShell Deep Dive - Tags and Backup Jobs

Praktisches Beispiel

Um das etwas greifbarer zu machen, habe ich ein praktisches Beispiel für den Veeam PowerShell Deep Dive vorbereitet.

  • Veeam Backup Job für Windows VMs
  • vSphere Tag für Windows VMs
  • Zuordnung von VM zu Backup Job per vSphere Tag

Mit einem kleinen PowerCLI Skript lassen sich alle Windows VMs mit dem entsprechenden Tag versehen.

# Get Tag Category
$OsTagCategory = Get-TagCategory -Name "OS-Type"

# Get Windows Tag
Get-Tag -Category $OsTagCategory -Name "Windows"

# Assign Tag to VM
foreach ($VM in Get-VM){
    if ($VM.GuestId -match "Windows"){
        $VM | New-TagAssignment -Tag $(Get-Tag -Category $OsTagCategory -Name "Windows") | out-null
        Write-Host "'$($VM.Name)': Windows identified - Configured OS: '$($VM.GuestID) / Detected OS: '$($VM.ExtensionData.Guest.GuestId)'." -ForegroundColor Green
        }
        elseif ($VM.ExtensionData.Guest.GuestId -match "Windows") {
            $VM | New-TagAssignment -Tag $(Get-Tag -Category $OsTagCategory -Name "Windows") | out-null
            Write-Host "'$($VM.Name)': Windows identified -Configured OS: '$($VM.GuestID) / Detected OS: '$($VM.ExtensionData.Guest.GuestId)'." -ForegroundColor Green
            }
            else {
                Write-Host "'$($VM.Name)': No Windows identified." -ForegroundColor Yellow
                }      
    }
Veeam PowerShell Deep Dive - Working with vSphere Tags Example
Veeam PowerShell Deep Dive - Backup Job with vSphere Tag
Veeam PowerShell Deep Dive - vSphere VM with Tag

Veeam PowerShell Deep Dive – Job Optionen

Das Bearbeiten von Job Optionen per PowerShell kann sehr schnell interessant werden, wenn man für eine große Anzahl von Jobs einzelne Optionen verändern möchte.

Job Optionen anzeigen

Die Job Optionen lassen sich sehr schnell mit der Job Methode GetOptions() aufrufen.

$ExampleJob = Get-VBRJob -Name "Backup Job 1"
$ExampleJobOptions = $ExampleJob.GetOptions()

# Show all Job Options
$ExampleJobOptions

# Show single Backup Storage Options
$ExampleJobOptions.BackupStorageOptions
Veeam PowerShell Deep Dive - Get Job Options

Job Optionen exportieren

Zur Dokumentationszwecken oder auch zur weiteren Verarbeitung, kann es sehr nützlich sein die gesamten Job Optionen zu exportieren. Hierzu habe ich mir einen kleinen Trick ausgedacht.

$ExampleJob = Get-VBRJob -Name "Backup Job 1"
$ExampleJobOptions = $ExampleJob.GetOptions()

# Convert to JSON
$JsonObject = $ExampleJobOptions | ConvertTo-Json
$Object = $JsonObject | ConvertFrom-Json

# Remove "non-readable" Options Object
$Object.PSObject.Properties.Remove('Options')

# Export to JSON
$Object | ConvertTo-Json | Out-File "C:\temp\ExampleJobOptions.json"
Start-Process "C:\temp\ExampleJobOptions.json"
Veeam PowerShell Deep Dive - Job Options Export

Job Optionen verändern

Grundlegend kann mit dem Veeam PowerShell SnapIn entweder eine einzelne Option verändert werden oder alle Optionen vom einem anderen Job übernommen werden.

$ExampleJob = Get-VBRJob -Name "Backup Job 1"
$ExampleJobOptions = $ExampleJob.GetOptions()

$BackupJob = Get-VBRJob -Name "Backup Job 2"

# Modify Options
$BackupJobOptions = $BackupJob.GetOptions()
$BackupJobOptions.BackupStorageOptions.EnableDeletedVmDataRetention = $True
Set-VBRJobOptions -Job $BackupJob -Options $BackupJobOptions

# Set all Options from other Job
Set-VBRJobOptions -Job $BackupJob -Options $ExampleJobOptions
Veeam PowerShell Deep Dive - Modify Job Options
Veeam PowerShell Deep Dive - Modify Job Options from Reference Job

Natürlich lassen sich auch nicht nur die Optionen eines einzelnen Jobs verändern, auch die Massen-Konfiguration anhand eines Referenz Jobs ist möglich.

$TemplateBackupJob = Get-VBRJob -Name "Template Job 1"

# Show Template Options
($TemplateBackupJob.GetOptions()).BackupStorageOptions | ft -AutoSize

# Show Job Options
(Get-VBRJob -Name "Backup Job*" | Get-VBRJobOptions).BackupStorageOptions | ft -AutoSize

# Update multiple Jobs
Get-VBRJob -Name "Backup Job*" | Set-VBRJobOptions -Options  ($TemplateBackupJob.GetOptions()) | Out-Null
Veeam PowerShell Deep Dive - Mass Modify Job Options from Reference Job

Weitere Projekte

Für alle, die sich noch weiter mit dem Thema Veeam PowerShell beschäftigen möchten habe ich hier eine Sammlung weiterer spannender Projekte zusammengestellt:

Leave a Reply