如何使用资源组中现有虚拟机资源重建 Azure 资源管理器(ARM)虚拟机
在虚拟机的系统盘出现故障导致虚拟机无法启动时,我们通常会借助一个 Helper 虚拟机,将故障虚拟机的系统盘作为数据磁盘挂载到 Helper 虚拟机,再进行排查修复。挂载故障系统盘到 Helper 虚拟机,有两种操作方式。
方法一
- 删除故障虚拟机(其系统盘以及其他资源如网卡等会得到保留)。
- 将系统盘挂载到 Helper 虚拟机。
在完成修复工作后,我们需重使用这个虚拟机资源组中的现有资源来对它进行重建,从而保留它的 IP 地址等信息。可以使用以下 PowerShell 示例代码来实现。
注意
示例代码仅供参考,在对生产环境虚拟机使用上述方法前,请先在测试环境进行充分测试。
使用托管磁盘的 ARM 虚拟机(方法一)
使用 PowerShell
#登录 Azure Connect-AzureRmAccount -Environment AzureChinaCloud -Subscription "订阅 ID" #定义变量,如果使用可用性集,多个数据盘或者网卡,请删除对应的变量的注释符号 $subid = "订阅 ID" $rgName = "资源组名称"; $loc = "区域名称"; $vmSize = "虚拟机 SKU"; $vmName = "虚拟机名称"; $nic1Name = "网卡名称"; #$nic2Name = "第二个网卡名称"; #$avName = "可用性集名称"; $osDiskName = "系统盘名称"; #$DataDiskName = "数据盘名称" #系统盘和数据盘的资源 ID,在需要时请删除将对应的变量的注释符号 $osDiskResouceId = "/subscriptions/$subid/resourceGroups/$rgname/providers/Microsoft.Compute/disks/$osDiskName"; #$dataDiskResourceId = "/subscriptions/$subid/resourceGroups/$rgname/providers/Microsoft.Compute/disks/$DataDiskName"; $vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize; #在需要时删除注释符号以便添加可用性集 #$avSet = Get-AzureRmAvailabilitySet –Name $avName –ResourceGroupName $rgName; #$vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize -AvailabilitySetId $avSet.Id; #获取网卡资源 ID 并添加网卡信息 $nic1 = Get-AzureRmNetworkInterface -Name $nic1Name -ResourceGroupName $rgName; $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic1.Id -Primary; #在需要时删除注释符号以便添加第二块网卡 #$nic2 = Get-AzureRmNetworkInterface -Name $nic2Name -ResourceGroupName $rgName; #$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic2.Id; #Windows 虚拟机 #$vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osDiskResouceId -name $osDiskName -CreateOption Attach -Windows; #Linux 虚拟机 $vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osDiskResouceId -name $osDiskName -CreateOption Attach -Linux; #删除注释符号以便添加数据磁盘 #Add-AzureRmVMDataDisk -VM $vm -ManagedDiskId $dataDiskResourceId -Name $dataDiskName -Caching None -DiskSizeInGB 1023 -Lun 0 -CreateOption Attach; New-AzureRmVM -ResourceGroupName $rgName -Location $loc -VM $vm;
使用 Json 文件
#登录 Azure Connect-AzureRmAccount -Environment AzureChinaCloud -Subscription "订阅 ID" $subscriptionID = "订阅 ID" $rgname = "资源组名称" $vmname = "虚拟机名称" #关闭虚拟机 Stop-AzureRmVM -ResourceGroupName $rgname -Name $vmname #删除虚拟机之前,将虚拟机资源信息导出到 json 文件 Get-AzureRmVM -ResourceGroupName $rgname -Name $vmname |ConvertTo-Json -depth 100|Out-file -FilePath c:\temp\$vmname.json #此时可以删除虚拟机进行修复工作 #以下为重建操作 #从 json 文件读取资源信息 $json = "c:\temp\$vmname.json"; $import = gc $json -Raw|ConvertFrom-Json; #定义变量 $rgname = $import.ResourceGroupName; $loc = $import.Location; $vmsize = $import.HardwareProfile.VmSize; $vmname = $import.Name; #创建虚拟机配置文件 $vm = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize; #网卡信息 $importnicid = $import.NetworkProfile.NetworkInterfaces.Id; $nicname = $importnicid.split("/")[-1]; $nic = Get-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $rgname; $nicId = $nic.Id; $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nicId; #系统磁盘信息 $osDiskName = $import.StorageProfile.OsDisk.Name; $osManagedDiskId = $import.StorageProfile.OsDisk.ManagedDisk.Id; $vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osManagedDiskId -Name $osDiskName -CreateOption attach -Windows; #创建虚拟集 New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $vm -Verbose;
使用非托管磁盘的 ARM 虚拟机(方法一)
使用 PowerShell
#登录 Azure Connect-AzureRmAccount -Environment AzureChinaCloud -Subscription "订阅 ID" $rgname = "资源组名称" $loc = "区域名称" $vmsize = "虚拟机 SKU" $vmname = "虚拟机名字" $vm = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize; $nic1 = Get-AzureRmNetworkInterface -Name ("第一个网卡名称") -ResourceGroupName $rgname; $nic1Id = $nic1.Id; #如果使用多块网卡,请删除注释符号 #$nic2 = Get-AzureRmNetworkInterface -Name ("第二个网卡名称") -ResourceGroupName $rgname; #$nic2Id = $nic2.Id; $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic1Id; #删除注释符号以便添加多块网卡 #$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic2Id; $osDiskName = "虚拟机系统盘名称" $osDiskVhdUri = "系统盘 URL" #Windows 虚拟机 $vm = Set-AzureRmVMOSDisk -VM $vm -VhdUri $osDiskVhdUri -name $osDiskName -CreateOption attach -Windows #Linux 虚拟机 $vm = Set-AzureRmVMOSDisk -VM $vm -VhdUri $osDiskVhdUri -name $osDiskName -CreateOption attach -Linux New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $vm -Verbose
使用 Json 文件
#登录 Azure Connect-AzureRmAccount -Environment AzureChinaCloud -Subscription "订阅 ID" $subscriptionID = "订阅 ID" $rgname = "资源组名称" $vmname = "虚拟机名称" #关闭虚拟机 Stop-AzureRmVM -ResourceGroupName $rgname -Name $vmname #删除虚拟机之前,将虚拟机资源信息导出到 json 文件 Get-AzureRmVM -ResourceGroupName $rgname -Name $vmname |ConvertTo-Json -depth 100|Out-file -FilePath c:\temp\$vmname.json #此时可以删除虚拟机进行修复工作 #以下为重建操作 #从 json 文件读取资源信息 $json = "c:\temp\$vmname.json" $import = gc $json -Raw|ConvertFrom-Json #定义变量 $rgname = $import.ResourceGroupName $loc = $import.Location $vmsize = $import.HardwareProfile.VmSize $vmname = $import.Name #创建虚拟机配置文件 $vm = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize; #网卡信息 $importnicid = $import.NetworkProfile.NetworkInterfaces.Id $nicname = $importnicid.split("/")[-1] $nic = Get-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $rgname; $nicId = $nic.Id; $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nicId; #系统磁盘信息 $osDiskName = $import.StorageProfile.OsDisk.Name $osDiskVhdUri = $import.StorageProfile.OsDisk.Vhd.Uri $vm = Set-AzureRmVMOSDisk -VM $vm -VhdUri $osDiskVhdUri -name $osDiskName -CreateOption attach -Windows #创建虚拟机 New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $vm -Verbose
方法二
- 对故障虚拟机的系统盘创建一个快照,再用快照创建一个新的磁盘。
- 将新的磁盘挂载到 Helper 虚拟机进行修复。
在完成修复工作后,用新的磁盘替换故障虚拟机的系统盘,可以使用以下 PowerShell 示例代码来实现。
注意
示例代码仅供参考,在对生产环境虚拟机使用上述方法前,请先在测试环境进行充分测试。
使用托管磁盘的 ARM 虚拟机(方法二)
#登录 Azure
Connect-AzureRmAccount -Environment AzureChinaCloud -Subscription "订阅 ID"
$subscriptionID = "订阅 ID"
$name = "虚拟机名称"
$resourceGroupName = "资源组名称"
$diskname="系统盘名称"
$diskResourceInstanceID="/subscriptions/$subscriptionID/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/disks/$diskname"
#获取 VM 资源信息
$vm = get-azurermvm -ResourceGroupName $resourceGroupName -Name $name
#设置 VM 磁盘属性并更新 VM
Set-AzureRmVMOSDisk -VM $vm -Name $diskname -ManagedDiskId $diskResourceInstanceID | Update-AzureRmVM
使用非托管磁盘的 ARM 虚拟机(方法二)
#登录 Azure
Connect-AzureRmAccount -Environment AzureChinaCloud -Subscription "订阅 ID"
#定义变量
$rgname = "资源组名称"
$vmname = "虚拟机名称"
$vhduri = "非托管磁盘 URL"
#获取 VM 资源信息,设置VM磁盘属性并更新 VM
$vm = Get-AzureRMVM -ResourceGroupName $rgname -Name $vmname
$vm.StorageProfile.OsDisk.Vhd.Uri = $vhduri
Update-AzureRmVM -ResourceGroupName $rgname -VM $vm