【问题标题】:Change Azure virtual machine name in Azure portal在 Azure 门户中更改 Azure 虚拟机名称
【发布时间】:2018-09-20 05:19:23
【问题描述】:

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

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

【问题讨论】:

  • 对不起,资源名称是不可变的。捕获映像并使用新名称重新创建虚拟机。

标签: azure azure-powershell azureportal


【解决方案1】:

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

执行此操作的最佳方法是删除当前磁盘,维护磁盘,然后创建一个具有指向这些磁盘的正确名称的新磁盘。

【讨论】:

    【解决方案2】:

    感谢 Oliver Miossec 这个非破坏性的 azure powershell 脚本,它创建了一个新的虚拟机,对参数进行了一些更改。你可以找到他的帖子here。它非常棒,因为它还可以修复与机器关联的命名错误的磁盘和 NIC。

    #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..."
    

    【讨论】:

      【解决方案3】:

      Ryanman already posted 最初由 Oliver Miossec 编写的脚本。但是,此脚本仅适用于 Windows VM。

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

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

      更新 2: 添加了新参数“-newSubnetId”,它将虚拟机移动到新的 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..."
      

      【讨论】:

        【解决方案4】:

        如果您在从内部虚拟机/应用程序实例连接到虚拟机时遇到任何问题。您可以在 /etc/hosts 和 /etc/hostname 中更改名称。 编辑完这两个文件后,需要重启实例。

        vi /etc/hosts

        127.0.0.1 本地主机 localhost.localdomain

        vi /etc/主机名

        localhost.localdomain

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】: