Script to Delete Azure ARM Virtual Machine
We had a request to create a script which will take care of deleting a Virtual Machine from Azure subscription and perform the clean up of all the associated objects as a deleting the virtual machine from the azure portal will remove the VM object alone and does not delete the disks, vNICs, etc.
We wanted to automate this as much as possible and ended up with the script and process to explain how it is done. Thanks to a wonderful and talented colleague in the team (Gaurav G) who had developed this script.
Steps to backup Azure server
- Pre-requisites
The following prerequisites must be met, before performing the Core capacity check steps.
- Internet connection
- Valid Azure Subscription
- The person who will perform the below steps must have one of the following roles in the Azure subscription
- Owner
- Contributor
- Some familiarity with the Azure Portal would be beneficial, although not necessary
- Latest version of Microsoft .NET Framework (download link)
- Latest version of Microsoft Windows Management Framework (download link)
- Latest version of Microsoft PowerShell (download link including detailed installation guide)
- Latest version of Azure cmdlets (installation guide), although steps are provided below
- Some familiarity with PowerShell ISE, although not necessary (documentation)
- Some familiarity with the Azure Portal would be beneficial, although not necessary
- Some familiarity with PowerShell scripting would be beneficial, although not necessary
- Deletion Script
Windows PowerShell scripts can also be used for automating the VM Deletion process. It minimizes the human efforts and errors. It can be used to Delete multiple VM’s at once, therefore saving a lot of time. Windows Azure PowerShell module should be installed to use azure based commend lets (as mentioned in pre requisites). Follow the following link to download and configure the module – https://azure.microsoft.com/en-in/documentation/articles/powershell-install-configure
- Script using this particular method can be downloaded from the bottom of this post. For using this script,
- Open PowerShell ISE and type below command
# connecting your azure account to powershell
Add-AzureRMaccount
It gives the following popup
-
- Enter your credentials and click sign in. Once your account is added, just open the CSV file attached with script you downloaded.
- Add the VM details as required and save the file before closing it
-
- Now go back to the PowerShell and execute the script –
Downloads
Input File:
Please create a coma separated CSV file, save the file as “Input_files.csv” and keep it in the same folder as the script before executing the script. The sample of the input file is below
hostname, resourceGroupName, subscriptionName, StorageaccRG S-UAT-SQL200, AZ-RG-UAT-ODS0001, AZ-TG-UAT-SUB001, azsauatods0001 S-UAT-SQL201, AZ-RG-UAT-ODS0001, AZ-TG-UAT-SUB001, azsauatods0001
The script is below, please save it as a .PS1 file before executing the script in a PowerShell window
# Add credentials Add-AzureRmAccount #Script to Delete the VM #Import the VM details from CSV files $CurrentPath = Split-Path -path $myInvocation.MyCommand.Definition -Parent $ErrorActionPreference = "STOP" $serverList = Import-Csv "$currentpath\Input_files.csv" FOREACH ($server in $serverList) { try{ $vmName = $server.hostname $ResourceGroup = $server.resourceGroupName $subscription = $server.subscriptionName $storageaccRG = $server.StorageaccRG Select-AzureRmSubscription -SubscriptionName $subscription | Out-Null #get all resources to remove $vm = get-azureRMvm -Name $vmname -ResourceGroupName $ResourceGroup #if ($vm -eq $null) {continue} $osDisk = $vm.StorageProfile.OSDisk.Vhd.Uri $dataDisks = $vm.StorageProfile.DataDisks $nic = $vm.NetworkProfile.NetworkInterfaces $nicString = ([uri]$nic.id).OriginalString $nicName = $nicString.Split("/")[-1] $nicObject = Get-AzureRmNetworkInterface -ResourceGroupName $vm.ResourceGroupName -Name $nicName #stop vm stop-azureRmvm -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -force write-host "VM is getting stopped" Start-Sleep -Seconds 120 #remove Vm Write-Host "Removing VM $($vm.Name) in Resource Group $($vm.ResourceGroupName)" Remove-AzureRmVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force -Verbose Start-sleep -seconds 120 #remove osdisk $ErrorActionPreference = "silentlycontinue" Write-Host "Removing osDisk $osDisk" $osDiskSourceStorageAccount = ([System.Uri]$osDisk).Host.Split('.')[0] $osDiskSourceContainer = ([System.Uri]$osDisk).Segments[-2] -replace '/' $osDiskBlob = ([System.Uri]$osDisk).Segments[-1] $osDiskStorageKey = Get-AzureRmStorageAccountKey -Name $osDiskSourceStorageAccount -ResourceGroupName $ResourceGroup $osDiskContext = New-AzureStorageContext -StorageAccountName $osDiskSourceStorageAccount -StorageAccountKey ($osDiskStorageKey.value)[-1] Remove-AzureStorageBlob -Blob $osDiskBlob -Container $osDiskSourceContainer -Context $osDiskContext $ErrorActionPreference = "Stop" #remove datadisks foreach ($dataDisk in $dataDisks) { $dataDiskUri = $dataDisk.Vhd.Uri $dataDiskSourceStorageAccount = ([System.Uri]$dataDiskUri).Host.Split('.')[0] $dataDiskSourceContainer = ([System.Uri]$dataDiskUri).Segments[-2] -replace '/' $dataDiskBlob = ([System.Uri]$dataDiskUri).Segments[-1] $dataDiskRG = $vm.ResourceGroupName $dataDiskStorageKey = Get-AzureRmStorageAccountKey -ResourceGroupName $dataDiskRG -Name $dataDiskSourceStorageAccount $dataDiskContext = New-AzureStorageContext -StorageAccountName $dataDiskSourceStorageAccount -StorageAccountKey ($dataDiskstoragekey.value)[-1] Write-Host "Removing dataDisk $dataDiskBlob" Remove-AzureStorageBlob -Blob $dataDiskBlob -Container $dataDiskSourceContainer -Context $dataDiskContext } #remove nic Write-host "Removing NIC $nicName" Remove-AzureRmNetworkInterface -ResourceGroupName $vm.ResourceGroupName -Name $nicName -Force } catch{ Write-Host "Script execution stopped" $_.exception.message " $vmname Could not be deleted because $_.exception.message" |out-file "$CurrentPath\Error.txt" -Append } } Get-PSSession | Remove-PSSession