在Azure门户中更改Azure虚拟机名称

30

我们能否在Azure门户中更改Azure虚拟机的名称?我确定我们无法通过门户更改它,我们是否有任何PowerShell cmdlet可以更改虚拟机名称?

注意:我指的不是虚拟机内部的VM名称,而是在Azure门户中显示的名称。


1
对不起,该资源名称不可变。请捕获镜像并使用新名称重新创建虚拟机。 - evilSnobu
6个回答

31

虚拟机的资源名称是不可变的。因此,您需要重新部署虚拟机。

最好的方法是删除当前虚拟机,保留磁盘,然后创建一个新的虚拟机,指向那些磁盘,并使用正确的名称。


3

Ryanman已经发布了一个脚本,最初由Oliver Miossec编写。但是,这个脚本只适用于Windows虚拟机。

我添加了一个参数(-osType),以指定osType,因此它也适用于Linux虚拟机。

更新1: 我更新了脚本,自动检测源VM的操作系统。

更新2: 添加了新参数“-newSubnetId”,可以将VM移动到新的vnet或子网(必须在同一订阅中)。

您需要指定子网ID的完整URL,例如:

/subscriptions/<subscriptionID>/resourceGroups/<ressourceGroupName>/providers/Microsoft.Network/virtualNetworks/<virtualNetworkName>/subnets/<subnetName>

#Deletes and recreates a VM
param (
    [Parameter(Mandatory=$true)]
    [string]$vmOldName,
    [Parameter(Mandatory=$true)]
    [string]$vmNewName,
    [Parameter(Mandatory=$true)]
    [string]$rgName,
    [string]$newLocation, #Optional, moves the VM to a new Geographic Location
    [string]$newSubnetId #Optional, moves the VM to a new Subnet
)

$ErrorActionPreference = "Stop"

Write-Host "Get and shutdown old VM, Create new config"
$SourceVmObject = get-azvm -Name $vmOldName -ResourceGroupName $rgName

if ([string]::IsNullOrEmpty($newLocation)) {    
    $newLocation = $SourceVmObject.Location
    Write-Host "No new location specified, using the current VM's existing location: $newLocation"
}

$SourceVmPowerStatus = (get-azvm -Name $SourceVmObject.Name -ResourceGroupName $SourceVmObject.ResourceGroupName -Status).Statuses | where-object code -like "PowerState*"

if ($SourceVmPowerStatus -ne "VM deallocated") {
    stop-azVm -Name $SourceVmObject.Name -ResourceGroupName $SourceVmObject.ResourceGroupName -Force
    Start-Sleep -Seconds 30 #Wait to ensure VM is shutdown.
}

$NewVmObject = New-AzVMConfig -VMName $vmNewName -VMSize $SourceVmObject.HardwareProfile.VmSize 

Write-Host "Create new Network Objects"
if ([string]::IsNullOrEmpty($newSubnetId)) {    
    $subnetID = (Get-AzNetworkInterface -ResourceId $SourceVmObject.NetworkProfile.NetworkInterfaces[0].id).IpConfigurations.Subnet.id
    Write-Host "No new Subnet specified, using the current VM's existing subnet: $subnetID"
} else {
    $subnetID = $newSubnetId
    Write-Host "new Subnet specified, $subnetID"
}


$nic = New-AzNetworkInterface -Name "$($vmNewName.ToLower())-0-nic" -ResourceGroupName $SourceVmObject.ResourceGroupName  -Location $SourceVmObject.Location -SubnetId $SubnetId 

Add-AzVMNetworkInterface -VM $NewVmObject -Id $nic.Id

Write-Host "Move OS Disk"
$SourceOsDiskSku = (get-azdisk -ResourceGroupName $SourceVmObject.ResourceGroupName -DiskName $SourceVmObject.StorageProfile.OsDisk.name).Sku.Name

$SourceOsDiskSnapConfig =  New-AzSnapshotConfig  -SourceUri $SourceVmObject.StorageProfile.OsDisk.ManagedDisk.Id -Location $SourceVmObject.Location -CreateOption copy

$SourceOsDiskSnap = New-AzSnapshot -Snapshot $SourceOsDiskSnapConfig  -SnapshotName "$($SourceVmObject.Name)-os-snap"  -ResourceGroupName $SourceVmObject.ResourceGroupName

$TargetOsDiskConfig = New-AzDiskConfig -AccountType $SourceOsDiskSku -Location $SourceVmObject.Location -CreateOption Copy -SourceResourceId $SourceOsDiskSnap.Id

$TargetOsDisk = New-AzDisk -Disk $TargetOsDiskConfig -ResourceGroupName $SourceVmObject.ResourceGroupName -DiskName "$($vmNewName.ToLower())-os-vhd"

Set-AzVMOSDisk -VM $NewVmObject -ManagedDiskId $TargetOsDisk.Id -CreateOption Attach $SourceVmObject.StorageProfile.OSDisk.OsType

$NewVmObject.StorageProfile.OSDisk.OsType = $SourceVmObject.StorageProfile.OSDisk.OsType
$NewVmObject.StorageProfile.OSDisk.Name = "$($vmNewName.ToLower())-os-vhd"

Write-Host "Create new Data Disks"
Foreach ($SourceDataDisk in $SourceVmObject.StorageProfile.DataDisks) { 

    $SourceDataDiskSku = (get-azdisk -ResourceGroupName $SourceVmObject.ResourceGroupName -DiskName $SourceDataDisk.name).Sku.Name

    $SourceDataDiskSnapConfig =  New-AzSnapshotConfig  -SourceUri $SourceDataDisk.ManagedDisk.Id -Location $SourceVmObject.Location -CreateOption copy

    $SourceDataDiskSnap = New-AzSnapshot -Snapshot $SourceDataDiskSnapConfig  -SnapshotName "$($SourceVmObject.Name)-$($SourceDataDisk.name)-snap"  -ResourceGroupName $SourceVmObject.ResourceGroupName

    $TargetDataDiskConfig = New-AzDiskConfig -AccountType $SourceDataDiskSku -Location $SourceVmObject.Location -CreateOption Copy -SourceResourceId $SourceDataDiskSnap.Id

    $TargetDataDisk = New-AzDisk -Disk $TargetDataDiskConfig -ResourceGroupName $SourceVmObject.ResourceGroupName -DiskName "$($vmNewName.ToLower())-$($SourceDataDisk.lun)-vhd"


    Add-AzVMDataDisk -VM $NewVmObject -Name "$($vmNewName.ToLower())-$($SourceDataDisk.lun)-vhd" -ManagedDiskId $TargetDataDisk.Id -Lun $SourceDataDisk.lun -CreateOption "Attach"
}

Write-Host "Creating..."
New-AzVM -VM $NewVmObject -ResourceGroupName $SourceVmObject.ResourceGroupName -Location $SourceVmObject.Location
Write-Host "VM Created..."

2

感谢Oliver Miossec提供这个非破坏性的Azure Powershell脚本,它可以创建一个新的虚拟机,并针对参数做出一些更改。您可以在这里找到他的文章。它还特别棒,因为它也可以修复与该机器关联的错误命名的磁盘和网络接口。

#Deletes and recreates a VM
param (
    [Parameter(Mandatory=$true)]
    [string]$vmOldName,
    [Parameter(Mandatory=$true)]
    [string]$vmNewName,
    [Parameter(Mandatory=$true)]
    [string]$rgName,
    [string]$newLocation #Optional, moves the VM to a new Geographic Location
)

$ErrorActionPreference = "Stop"

Write-Host "Get and Shutdown old VM, Create new config"
$SourceVmObject = get-azvm -Name $vmOldName -ResourceGroupName $rgName

if ([string]::IsNullOrEmpty($newLocation)) {    
    $newLocation = $SourceVmObject.Location
    Write-Host "No new location specified, using the current VM's existing location: $newLocation"
}

$SourceVmPowerStatus = (get-azvm -Name $SourceVmObject.Name -ResourceGroupName $SourceVmObject.ResourceGroupName -Status).Statuses | where-object code -like "PowerState*"

if ($SourceVmPowerStatus -ne "VM deallocated") {
    stop-azVm -Name $SourceVmObject.Name -ResourceGroupName $SourceVmObject.ResourceGroupName -Force
    Start-Sleep -Seconds 30 #Wait to ensure VM is shutdown.
}

$NewVmObject = New-AzVMConfig -VMName $vmNewName -VMSize $SourceVmObject.HardwareProfile.VmSize 

Write-Host "Create new Network Objects"
$subnetID = (Get-AzNetworkInterface -ResourceId $SourceVmObject.NetworkProfile.NetworkInterfaces[0].id).IpConfigurations.Subnet.id

$nic = New-AzNetworkInterface -Name "$($vmNewName.ToLower())-0-nic" -ResourceGroupName $SourceVmObject.ResourceGroupName  -Location $SourceVmObject.Location -SubnetId $SubnetId 

Add-AzVMNetworkInterface -VM $NewVmObject -Id $nic.Id

Write-Host "Move OS Disk"
$SourceOsDiskSku = (get-azdisk -ResourceGroupName $SourceVmObject.ResourceGroupName -DiskName $SourceVmObject.StorageProfile.OsDisk.name).Sku.Name

$SourceOsDiskSnapConfig =  New-AzSnapshotConfig  -SourceUri $SourceVmObject.StorageProfile.OsDisk.ManagedDisk.Id -Location $SourceVmObject.Location -CreateOption copy

$SourceOsDiskSnap = New-AzSnapshot -Snapshot $SourceOsDiskSnapConfig  -SnapshotName "$($SourceVmObject.Name)-os-snap"  -ResourceGroupName $SourceVmObject.ResourceGroupName

$TargetOsDiskConfig = New-AzDiskConfig -AccountType $SourceOsDiskSku -Location $SourceVmObject.Location -CreateOption Copy -SourceResourceId $SourceOsDiskSnap.Id

$TargetOsDisk = New-AzDisk -Disk $TargetOsDiskConfig -ResourceGroupName $SourceVmObject.ResourceGroupName -DiskName "$($vmNewName.ToLower())-os-vhd"

Set-AzVMOSDisk -VM $NewVmObject -ManagedDiskId $TargetOsDisk.Id -CreateOption Attach -Windows

Write-Host "Create new Data Disks"
Foreach ($SourceDataDisk in $SourceVmObject.StorageProfile.DataDisks) { 

    $SourceDataDiskSku = (get-azdisk -ResourceGroupName $SourceVmObject.ResourceGroupName -DiskName $SourceDataDisk.name).Sku.Name

    $SourceDataDiskSnapConfig =  New-AzSnapshotConfig  -SourceUri $SourceDataDisk.ManagedDisk.Id -Location $SourceVmObject.Location -CreateOption copy

    $SourceDataDiskSnap = New-AzSnapshot -Snapshot $SourceDataDiskSnapConfig  -SnapshotName "$($SourceVmObject.Name)-$($SourceDataDisk.name)-snap"  -ResourceGroupName $SourceVmObject.ResourceGroupName

    $TargetDataDiskConfig = New-AzDiskConfig -AccountType $SourceDataDiskSku -Location $SourceVmObject.Location -CreateOption Copy -SourceResourceId $SourceDataDiskSnap.Id

    $TargetDataDisk = New-AzDisk -Disk $TargetDataDiskConfig -ResourceGroupName $SourceVmObject.ResourceGroupName -DiskName "$($vmNewName.ToLower())-$($SourceDataDisk.lun)-vhd"


    Add-AzVMDataDisk -VM $NewVmObject -Name "$($vmNewName.ToLower())-$($SourceDataDisk.lun)-vhd" -ManagedDiskId $TargetDataDisk.Id -Lun $SourceDataDisk.lun -CreateOption "Attach"
}

Write-Host "Creating..."
New-AzVM -VM $NewVmObject -ResourceGroupName $SourceVmObject.ResourceGroupName -Location $SourceVmObject.Location
Write-Host "VM Created..."

0
在 Azure VM 资源中,一旦部署后就无法修改名称,因此最佳实践是保留磁盘并创建一个新的 VM,使用之前磁盘的适当名称。

0

如果您在内部VM/Application实例连接到VM时遇到任何问题,可以在/etc/hosts和/etc/hostname中更改名称。

编辑这两个文件后,需要重新启动实例。

vi /etc/hosts

127.0.0.1 localhost localhost.localdomain

vi /etc/hostname

localhost.localdomain


-2

您无法重命名虚拟机名称,但可以更新虚拟机大小,甚至将虚拟机移动到另一个订阅或更改资源组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接