我需要将旧的经典 VM 迁移到新的(仍然)经典 VM 才能使用:
- 新型 VM(Standard_A 到 Standard_DS_V2)
- 高级磁盘
我制作了一个脚本,它是:
- 停止现有 VM
- 删除现有虚拟机
- 将旧磁盘(操作系统 + 数据)复制到高级存储帐户
- 注册新磁盘
然后我有另一个脚本来基于 Json 信息创建新的 VM 这个脚本已经开发了一段时间,用于基于 Json 信息和现有的 Azure 磁盘模板创建 VM。
我已经对其进行了调整,以根据磁盘副本创建一个新 VM。
除了管理员用户/密码之外,一切都运行良好。每次创建新 VM 时,我都无法使用旧管理员用户(最初用于创建 VM 的用户)访问它。为了访问虚拟机,我需要使用 Azure 门户重置密码,然后才能访问虚拟机。
问题是我想要:
- 在我的脚本中执行此步骤
- 根本不必这样做(我们使用的是操作系统磁盘/数据磁盘的副本,因此不需要它)
有人可以解释我如何管理这个吗?几天/几周以来,我一直在使用它,但我找不到正确的方法。
我的脚本为创建 VM(ubuntu VM)所做的操作:
- Set-AzureSubscription -CurrentStorageAccount $VM.StorageAccount -SubscriptionId $VM.SubscriptionId
- $GlobalOSDiskName = (Get-AzureDisk | Where-Object { $_.OS -iin "Linux","Windows" } | Select DiskName).DiskName
- $VM = Get-Content $json_file -Raw | ConvertFrom-Json
- $VMOSDisk = $VM.OSDisk
- $vmObj = New-Object -TypeName Microsoft.WindowsAzure.Commands.ServiceManagement.Model.PersistentVM
- $vmObj = New-AzureVMConfig -Name $VM.Name -InstanceSize $VM.InstanceSize -DiskName $VMOSDisk.DiskName
- $vmObj = Set-AzureOSDisk -VM $vmObj
- $VMDataDisks = $VM.DataDisks
- foreach ($VMDataDisk in $VMDataDisks) {
$vmObj = Add-AzureDataDisk -Import -DiskName $VMDataDisk.DiskName -LUN $VMDataDisk.Lun -HostCaching $VMDataDisk.HostCaching -VM $vmObj
}
- $password = Read-Host -Prompt "Enter password for admin account '$username'" -AsSecureString
- $vmObj = Set-AzureVMAccessExtension -VM $vmObj -UserName $username -Password $password
# This is the last test I've made for this but it's not better...
# Adding informations for Subnet, StaticIP, AvailabilitySet, EndPoint, ACL etc...
- New-AzureVM -VNetName $VM.Vnet -ServiceName $VM.ServiceName -VM $vmObj -WaitForBoot
# Creation of the VM based on the object $vmObj
==> 虚拟机创建正确但无法访问
此外,当我使用 Azure 门户重置密码时,如果在旧 VM 上没有提示我使用 sudo 命令,则会提示我填写密码。
这没什么大不了的,但我想知道为什么以及如何启用/禁用它。
编辑:我已经测试了这个文档中写的建议,它似乎有效。
该方法包括:
- 使用命令Export-AzureVM将源 VM 的配置导出到 xml 文件中
- 编辑导出的 xml 文件以匹配所需的设置
- 使用命令Import-AzureVM基于此创建一个新的 VM 对象
结果似乎工作正常:
- 使用所有参数很好地创建了 VM
- 管理员密码保持不变,无需在任何地方设置
对此的担忧是:
- 导出的 xml 中没有对管理员凭据的引用
- 所以新的 vm 对象中没有对管理员凭据的引用
- 创建的对象与我以我的方式创建的对象完全相同
有人可以解释一下两种解决方案之间的区别吗?
谢谢你的帮助