Azure VM selective LUN Backup

Azure Backup mittels Azure Recovery Service Vaults sind eine effektive und bequeme Möglichkeit Azure VMs zu sichern. Die OS Disk wird immer gesichert, jedoch gibt es einen Fallstrick: Man zusätzlich ALLE Daten Disks sichern, oder GAR keine. Zumindest per GUI…

Um dem entgegenzuwirken, habe ich hier ein Skript für euch, womit ihr euch durch die ResourceGroups, die VMs, die auszuwählenden LUNs, die RSVs und Policies klickt, um dann das Backup zu aktivieren.

ACHTUNG:

  • Das Skript beinhaltet praktisch keine Fehlerbehandlungen. Also bitte den eigenen Kopf benutzen.
  • Das Skript erstellt keine neuen Ressourcen. Ihr müsst die RGs, VMs, Disks, RSVs und Policies schon vorher erstellt haben.
  • Ich war zu faul für Kommentare.
function Select-FromMenue (
	[String]$Question,
	[Parameter(Mandatory=$true)][String]$Command,
	[Parameter(Mandatory=$true)][Array]$Attributes
){
 
	if(!$Question){
		$Question = "Welcher Eintrag genommen werden?"
	}
	 
	$Attributes = ,"Selection" + $Attributes
	# Auswahlmenü erstellen
	$AllResults = Invoke-Expression $Command
	$InputIDMappings = @()
	$i = 0
	foreach($Result in $AllResults){
	 
		$InputIDMapping = "" | Select $Attributes
		$InputIDMapping.Selection = $i
		foreach($Attribute in $Attributes){
			if($Attribute -ne "Selection"){
				$InputIDMapping.$Attribute = $Result.$Attribute
			}
		}
		$InputIDMappings += $InputIDMapping
		$i++
	}
	 
	# Auswahlmenü anzeigen
	$Selection = $null
	while($InputIDMappings.Selection -notcontains $Selection){
		Write-Host $Question -ForegroundColor Yellow
		$Display = $InputIDMappings | Out-String
		Write-Host $Display
		$Selection = Read-Host "Please choose"
	}
	 
	$Return = ($InputIDMappings | ? {$_.Selection -eq $Selection})
	return $Return
}

$Cred = Get-Credential
$TenantID = Read-Host "Enter Azure AD TenantID"
Connect-AzAccount -Credential $Cred -Tenant $TenantID

$rgName = (Select-FromMenue -Question "Which ResourceGroup" -Command "Get-AzResourceGroup" -Attributes "ResourceGroupName").ResourceGroupName
$vmName = (Select-FromMenue -Question "Which VM" -Command "Get-AzVM -ResourceGroupName $rgName" -Attributes "Name").Name

$Disks = @()
$AdditonalLun = ""
$FirstRun = $True
While (1){

	if ($AdditonalLun -ne "n"){
		if (!$FirstRun){
			Write-Host "Selected LUNs so far:"
			Write-Host "$($Disks | Out-String)"
		}
		$Disks += (Select-FromMenue -Question "Which DataDisks (do not use something different than shown, otherwise it will choose LUN 0!)" -Command "(Get-AzVM -ResourceGroupName $rgName -VMName $vmName).StorageProfile.DataDisks" -Attributes @("Name","LUN")).LUN
		$AdditonalLun = Read-Host "Add an additional Data LUN (y/n)"
		$FirstRun = $False
		cls
	}else{
		break
	}
}

$Disks = $Disks | Select -Unique | Sort

$vaultName = (Select-FromMenue -Question "Which Vault" -Command "Get-AzRecoveryServicesVault" -Attributes "Name").Name
$vaultID = (Get-AzRecoveryServicesVault -Name $vaultName).ID

$policyName = (Select-FromMenue -Question "Which Policy" -Command "Get-AzRecoveryServicesBackupProtectionPolicy -VaultId $vaultID" -Attributes "Name").Name
$policy = Get-AzRecoveryServicesBackupProtectionPolicy -VaultId $vaultID -Name $policyName

Enable-AzRecoveryServicesBackupProtection -Policy $policy -Name $vmName -ResourceGroupName $rgName -VaultId $vaultID -InclusionDisksList $Disks

Anmeldedaten eingeben:

Tenant ID eingeben:

ResourceGroup und VM auswählen. Anschl. die erste gewünschte Daten Disk auswählen und entscheiden ob man noch mehr möchte oder nicht:

Falls man „y“ gesagt hat, geht es weiter mit der Auswahl:

Wenn man fertig ist und „n“ eingebt, geht es zum RSV:

Recovery Service Vault und Policy auswählen:

Backup wird konfiguriert:

Anschl. ist im Backup Item auch zu sehen, welche Disks inkludiert sind.