Repair-AzVM.psm1
#### BEGIN CONSTANTS #### #### END CONSTANTS #### #### BEGIN FUNCTIONS #### function Repair-AzVM { [CmdletBinding()] Param ( [Parameter(Mandatory=$true, HelpMessage='Name of the Problem VM.')] [String] $VMname, [Parameter(Mandatory=$true, HelpMessage='RG of the Problem VM')] [String] $RGname ) try { $vm = Get-AzVM -ResourceGroupName $RGname -Name $VMname $diskname = $vm.StorageProfile.OsDisk.Name $disk = Get-AzDisk | ? {$_.Name -eq $diskname} $rvmName = 'Repair-VM'+(Get-Random -Maximum 100) $RrgName = 'Repair-VM-RG'+(Get-Random -Maximum 100) $vnet = ('Rep-'+$VMname+'-vnet').Trim() $nsg = ('Rep-'+$VMname+'-NSG').Trim() $pip =('Rep-'+$VMname+'-pip').Trim() $location = $vm.Location $encryption = $disk.EncryptionSettingsCollection.Enabled #encryption check if($encryption -eq $true){ $keyurl = $disk.EncryptionSettingsCollection.EncryptionSettings.KeyEncryptionKey.KeyUrl $secret = $disk.EncryptionSettingsCollection.EncryptionSettings.DiskEncryptionKey.SecretUrl Write-Host "The VM is encrypted. the disk will be unlocked at the target" -ForegroundColor Yellow }else{ Write-Host "No encryption proceeding with Repair VM creation" -ForegroundColor Green } #create Repaair VM $create = New-AzVm ` -ResourceGroupName $RrgName ` -Name $rvmName ` -Location $location ` -VirtualNetworkName $vnet ` -SubnetName "default" ` -SecurityGroupName $nsg ` -PublicIpAddressName $pip ` -OpenPorts 3389 -Size Standard_D4s_v3 Write-Host "Repair VM is created" -ForegroundColor Green Write-Host "Attaching the faulty disk..." -ForegroundColor Yellow #get OS disk & create copy $newdiskname = $vmname+'-osdisk'+(Get-Random -Maximum 100) $diskConfig = New-AzDiskConfig -SourceResourceId $disk.Id -Location $disk.Location -CreateOption Copy $newdiskcreate = New-AzDisk -Disk $diskConfig -DiskName $newdiskname -ResourceGroupName $RGname -WarningAction SilentlyContinue #Attach to repair VM $rvm = Get-AzVM -Name $rvmName -ResourceGroupName $RrgName $rvm = Add-AzVMDataDisk -VM $rvm -CreateOption Attach -ManagedDiskId $newdiskcreate.Id -Lun 1 Update-AzVM -VM $rvm -ResourceGroupName $RrgName Write-Host "Faulty disk attached" -ForegroundColor Green #unlocking the disk if encrypted if($encryption -eq $true){ $vault = ($keyurl.Split('/')[2]).split('.')[0] $KeyVault = Get-AzKeyVault | ? {$_.Vaultname -eq $vault} $getvault = Get-AzKeyVault -VaultName $vault -ResourceGroupName $KeyVault.ResourceGroupName Write-Host "Unlocking disk,Please wait" -ForegroundColor Yellow $encrypt = Set-AzVMDiskEncryptionExtension -ResourceGroupName $RrgName -VMName $rvmName -DiskEncryptionKeyVaultUrl $getVault.VaultUri -DiskEncryptionKeyVaultId $getvault.ResourceId -VolumeType All -Force Write-Host "Disk Unlocked" -ForegroundColor Green Start-Sleep -Seconds 20 }else{ Write-Host "Skipping encryption" -ForegroundColor Yellow} #Enable Hyper-V Write-Host "Final Step, Enabling Hyper-V on $rvmName" -ForegroundColor Yellow $fileUri = @("https://120061622000248sr.blob.core.windows.net/script/install.ps1") $settings = @{"fileUris" = $fileUri}; $protectedSettings = @{"commandToExecute" = "powershell -ExecutionPolicy Unrestricted -File install.ps1"}; $cse = Set-AzVMExtension -ResourceGroupName $rvm.ResourceGroupName ` -Location $rvm.Location ` -VMName $rvm.Name ` -Name "enablehyperv" ` -Publisher "Microsoft.Compute" ` -ExtensionType "CustomScriptExtension" ` -TypeHandlerVersion "1.10" ` -Settings $settings ` -ProtectedSettings $protectedSettings Write-Host "Hyper-V enabled & restarted, please wait until the VM is back online" -ForegroundColor Green Start-Sleep -Seconds 20 Write-Host "Repair VM $rvmName is ready now" -ForegroundColor Green } catch { throw } finally { } } Export-ModuleMember -Function Repair-AzVM #### END FUNCTIONS #### |