Skip to content

Instantly share code, notes, and snippets.

@RylandDeGregory
Last active May 11, 2021 01:20
Show Gist options
  • Save RylandDeGregory/49ba4e88311fcefd710a298eba0790c1 to your computer and use it in GitHub Desktop.
Save RylandDeGregory/49ba4e88311fcefd710a298eba0790c1 to your computer and use it in GitHub Desktop.
Rename an Azure Virtual Machine resource
<#
.SYNOPSIS
Rename Azure Virtual Machine(s).
.DESCRIPTION
Rename an Azure Virtual Machine by disconnecting dependent resources, creating new Virtual Machine resource object, and reattaching all dependent resources.
.EXAMPLE
./Rename-AzVM.ps1 -ComputerName 'MyAzureVM1', 'MyAzureVM2' -NewName 'myazvm01', 'AZVM02' -Linux
.EXAMPLE
./Rename-AzVM.ps1 -ComputerName 'AnotherAzureVM' -NewName 'MySuperSpecialAzVM' -Windows
.NOTES
Disclaimer: All Virtual Machines must have the same OS platform (either all Windows or all Linux)
Created By: Ryland DeGregory
#>
[CmdletBinding()]
Param (
# A list of Virtual Machines to rename. Must match VM resource names in Azure.
[Parameter(Mandatory)]
[string[]] $ComputerName,
# A list of new Virtual Machine names. Names must be in the same order as -ComputerName.
[Parameter(Mandatory)]
[string[]] $NewComputerName,
# If provided, the virtual machine(s) provided in -ComputerName are Linux-based Virtual Machines.
[Parameter()]
[switch] $Linux,
# If provided, the virtual machine(s) provided in -ComputerName are Windows-based Virtual Machines.
[Parameter()]
[switch] $Windows
)
# Login to Azure
try {
Connect-AzAccount
Get-AzSubscription | Out-GridView -PassThru | Set-AzContext
$SubscriptionName = (Get-AzContext | Select-Object -ExpandProperty Name) -replace '\(.*$', ''
} catch {
Write-Error "[ERROR] Error connecting to Azure: $_" -ErrorAction Stop
}
for ($i = 0; $i -le $ComputerName.Count; $i++) {
try {
# Set current and updated name
$VirtualMachine = $ComputerName[$i]
$NewVMName = $NewComputerName[$i]
Write-Output "`nRenaming [$VirtualMachine] to [$NewVMName]..."
# Get the details of the VM to be renamed
$OriginalVMResource = Get-AzResource -ResourceType 'Microsoft.Compute/VirtualMachines' -Name $VirtualMachine
if ($OriginalVMResource) {
$OriginalVM = Get-AzVM -Name $OriginalVMResource.Name -ResourceGroupName $OriginalVMResource.ResourceGroupName
} else {
Write-Error -Message "[ERROR] No Virtual Machine with the name [$VirtualMachine] found in Azure Subscription $SubscriptionName" -ErrorAction Continue
}
# Remove the original VM
Write-Output "Removing Original VM [$($OriginalVM.Name)]"
Remove-AzVM -ResourceGroupName $OriginalVMResource.ResourceGroupName -Name $VirtualMachine -Force
# Create the basic configuration for the replacement VM
Write-Output "[$NewVMName] Creating new Azure Virtual Machine config"
$NewVM = New-AzVMConfig -VMName $NewVMName -VMSize $OriginalVM.HardwareProfile.VmSize -AvailabilitySetId $OriginalVM.AvailabilitySetReference.Id -Tags $OriginalVM.Tags
# Add OS disk
if ($Linux) {
Write-Output "[$NewVMName] Adding OS Disk [Linux]"
Set-AzVMOSDisk -VM $NewVM -CreateOption Attach -ManagedDiskId $OriginalVM.StorageProfile.OsDisk.ManagedDisk.Id -Name $OriginalVM.StorageProfile.OsDisk.Name -Linux
}
if ($Windows) {
Write-Output "[$NewVMName] Adding OS Disk [Windows]"
Set-AzVMOSDisk -VM $NewVM -CreateOption Attach -ManagedDiskId $OriginalVM.StorageProfile.OsDisk.ManagedDisk.Id -Name $OriginalVM.StorageProfile.OsDisk.Name -Windows
}
# Add Data Disk(s)
foreach ($Disk in $OriginalVM.StorageProfile.DataDisks) {
Write-Output "[$NewVMName] Adding data disk [$($Disk.Name)]"
Add-AzVMDataDisk -VM $NewVM -Name $Disk.Name -ManagedDiskId $Disk.ManagedDisk.Id -Caching $Disk.Caching -Lun $Disk.Lun -DiskSizeInGB $Disk.DiskSizeGB -CreateOption Attach
}
# Add NIC(s)
foreach ($NetworkInterface in $OriginalVM.NetworkProfile.NetworkInterfaces) {
if ($NetworkInterface.Primary) {
Write-Output "[$NewVMName] Adding primary network interface"
Add-AzVMNetworkInterface -VM $NewVM -Id $NetworkInterface.Id -Primary
} else {
Write-Output "[$NewVMName] Adding secondary network interface"
Add-AzVMNetworkInterface -VM $NewVM -Id $NetworkInterface.Id
}
}
# Create Virtual Machine with updated name
Write-Output "[$NewVMName] Creating new VM in [$($OriginalVMResource.ResourceGroupName)]"
New-AzVM -ResourceGroupName $OriginalVMResource.ResourceGroupName -Location $OriginalVM.Location -VM $NewVM
Write-Output "Rename operation complete: [$VirtualMachine] -> [$NewVMName]"
} catch {
Write-Error -Message "[ERROR] Error renaming VM [$VirtualMachine] to [$NewVMName] at line $($_.InvocationInfo.ScriptLineNumber): $_" -ErrorAction Continue
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment