Restore Azure Multi NIC VM from Backup

Sharing is caring!

Prerequisites:

Source VM must be deleted prior to running the script or the network card mapping will fail. And this will be due to the network interfaces being in use on the source VM.

The script below will perform the following steps:

    Enumerate and list for selection available replicas of the named VM on given Vault Name
    Upon selecting desired replica, vhd or vhd’s will be place on selected storage account
    JSON file will be download to a configured temp location and enumerated for VM type and network config
    VM will then be created with the configuration built from the JSON file.

Should you do a restore to disk, the script below can be adjusted to build the VM using the disks from the restore.

Script to restore as VM

### START SCRIPT ###

#### Login to Azure subscription

Login-AzureRmAccount

#### Define variables

$VaultName = “TestRecovery2” # Vault Name for Recovery Points (Backups)

$VmName = “FM032017-02” # VM Name of the backup to be used

$StAcName = “testrecoverydisk02” # Storage Account Name to be used for recovery

$StAcRGName = “TestRecovery2” # Storage Account Resource Group Name

$Region = “West Europe”

$RestoredVmName = “FM032017-02A” # Name for Restored VM (Can be same name as source if souce has been deleted)

$destination_path = “D:tempvmconfig.json” # Path to download config file

#### Set context

Get-AzureRmRecoveryServicesVault -Name $VaultName | Set-AzureRmRecoveryServicesVaultContext

#### Select required VM

$backupitem = Get-AzureRmRecoveryServicesBackupItem -BackupManagementType AzureVM -WorkloadType AzureVM -Name $VmName

#### List available recovery points for up to 7 days old or alter value (-7)

$startDate = (Get-Date).AddDays(-7)

$endDate = Get-Date

$rp = Get-AzureRmRecoveryServicesBackupRecoveryPoint -Item $backupitem -StartDate $startdate.ToUniversalTime() -EndDate $enddate.ToUniversalTime()

$rp | ft

#Select the restore point – 0 = Most recent RP, 1 = 2nd newest RP etc…

Write-Host “Select the restore point – latest is 0, next is 1 etc…” -ForegroundColor Red

$rpselected = ($input = Read-Host)

$rps = $rp[$rpselected]

#### Define Storage Account to be used

$restorejob = Restore-AzureRMRecoveryServicesBackupItem -RecoveryPoint $rps -StorageAccountName $StAcName -StorageAccountResourceGroupName $StAcRGName

#### Start Restore Job

$restorejob

#### Monitor job status

Do {

Start-Sleep -Seconds 180

Get-Date -Format T

$JobStatus = Get-AzureRmRecoveryServicesBackupJobDetails -job $restorejob

$JobStatus

$JobStatusCheck = $JobStatus.Status

} While ($JobStatusCheck -eq “InProgress”)

If ($JobStatusCheck -ne “Completed”) {

Write-Host “Seems Job has not completed successfully!”

exit

}

Write-Host “Creating VM from restored disks” -ForegroundColor Yellow

### Get details for restored disks

Write-Host “Getting details for restored disks” -ForegroundColor Yellow

$details = Get-AzureRmRecoveryServicesBackupJobDetails -job $restorejob

#### used for the restore process. Do not alter

$properties = $details.properties

$storageAccountName = $properties[“Target Storage Account Name”]

$containerName = $properties[“Config Blob Container Name”]

$blobName = $properties[“Config Blob Name”]

#### Set the Azure storage context and restore the JSON configuration file

Write-Host “Setting Azure storage context and restore the JSON configuration file” -ForegroundColor Yellow

Set-AzureRmCurrentStorageAccount -Name $storageaccountname -ResourceGroupName $StAcRGName

Get-AzureStorageBlobContent -Container $containerName -Blob $blobName -Destination $destination_path

$obj = ((Get-Content -Path $destination_path -Encoding Unicode)).TrimEnd([char]0x00) | ConvertFrom-Json

#### Use the JSON configuration file to create the VM configuration

Write-Host “Creating VM configuration from JSON config” -ForegroundColor Yellow

$vm = New-AzureRmVMConfig -VMSize $obj.HardwareProfile.VirtualMachineSize -VMName $RestoredVmName

#### Attach the OS disk and data disks

Write-Host “Attaching OS and data disks” -ForegroundColor Yellow

Set-AzureRmVMOSDisk -VM $vm -Name “OsDisk12” -VhdUri $obj.StorageProfile.OSDisk.VirtualHardDisk.Uri -CreateOption “Attach”

$vm.StorageProfile.OsDisk.OsType = $obj.StorageProfile.OSDisk.OperatingSystemType

foreach($dd in $obj.StorageProfile.DataDisks)

    {

    $vm = Add-AzureRmVMDataDisk -VM $vm -Name “datadisk1” -VhdUri $dd.VirtualHardDisk.Uri -DiskSizeInGB $null -Lun $dd.Lun -CreateOption Attach

    }

#### Network settings

Write-Host “Configuring Network settings” -ForegroundColor Yellow

## Get Nic URI

$PrimaryNIC = $obj.NetworkProfile | select -ExpandProperty NetworkInterfaces | Where-Object {$_.Primary -eq “True”} | select ReferenceURI | Format-Table -HideTableHeaders

## Get Nic Name from URI

$NicURIstring = $PrimaryNIC | Out-String

$PNicNameURI = $NicURIstring.Split(“/”)[-1]

$PNicName = $PNicNameURI.trim()

$GetPrimaryNic = Get-AzureRmNetworkInterface -Name $PNicName -ResourceGroupName $StAcRGName

$VM = Add-AzureRmVMNetworkInterface -VM $VM -Id $GetPrimaryNic.Id -Primary

$OtherNICs = ($obj.NetworkProfile | select -ExpandProperty NetworkInterfaces | Where-Object {$_.Primary -ne “True”} | select ReferenceURI | Format-Table -HideTableHeaders | Out-String).Trim()

$OtherNICs.Split(“`r”) | % {

$NicURIstring = $_

$ONicNameURI = $NicURIstring.Split(“/”)[-1]

$ONicName = $ONicNameURI.trim()

$GetOtherNic = Get-AzureRmNetworkInterface -Name $ONicName -ResourceGroupName $StAcRGName

$VM = Add-AzureRmVMNetworkInterface -VM $VM -Id $GetOtherNic.Id}

#### Create VM

Write-Host “Creating VM $RestoredVmName” -ForegroundColor Yellow

$vm.StorageProfile.OsDisk.OsType = $obj.StorageProfile.OSDisk.OperatingSystemType

New-AzureRmVM -ResourceGroupName $StAcRGName -Location $Region -VM $vm

### END SCRIPT ### 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.