我们在创建VM时如果要考虑到该虚拟机要确保在Azure平台计划或非计划的维护期间,至少有一台虚拟机可用,也就是俗称的让该虚拟机高可用。那么就一定要创建可用性集,但门户上也写出了在创建后不能更改。
首选需要大家注意一点就是可用性集有一个特点:
在一个可用性集的虚拟机采用的是托管磁盘,那么后面新建的虚拟机加入到这个可用性集的磁盘是否必须是托管磁盘。简单说就是同一个可用性集的所有虚拟机是必须是同一种磁盘类型,要么都是托管磁盘,要么都是非托管磁盘,不能并存2种磁盘的虚拟机在同一个可用性集里。
查看您的可用性集是属于只能放托管磁盘还是非托管磁盘的虚拟机可以查看该可用性集的属性,如果“已管理”——“是”表示为只能存放托管磁盘的虚拟机;“否”表示为只能存放非托管磁盘的虚拟机。
在单独创建可用性集的时候也可以定义该可用性集是存放托管磁盘的虚拟机还是非托管磁盘的虚拟机
那如果我们创建好的VM后期想要更改可用性集怎么办呢?
那必须将该虚拟机删除但保留该虚拟机的磁盘,然后使用这个保留下虚拟机磁盘重新创建虚拟机时指定可用性集。
在这里我准备了2台VM都是托管磁盘的虚拟机,一台是LinuxWeb01,创建时该虚拟机的可用性集是WEBAVSET
一台是LinuxWeb02,创建时没有创建或添加到现在的任何可用性集
这2台都是提供相同的WEB服务
接下来我希望把LinuxWeb02添加到可用性集WEBAVSET里,接下来会使用Azure Powershell,先登陆您的Azure账号,国内版登陆执行Login-AzureRmAccount -EnvironmentName AzureChinaCloud;国际版登陆执行Login-AzureRmAccount;关于登陆可以看我之前写的《PowerShell连接Azure(国内&国际)》
可以查看所有VM的信息
Get-AzureRmVM
以及查看某一个VM的详细信息
Get-AzureRmVM -ResourceGroupName "ServersResourceGroup" -Name "LinuxWeb01"
查询现有指定可用性集的详细信息
Get-AzureRmAvailabilitySet -ResourceGroupName "ServersResourceGroup" -Name "WEBAVSET"
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如果您的虚拟机是托管磁盘,那么是可以直接按照如下步骤来操作:
定义要修改VM的信息,首先是VM名称
$vm = Get-AzureRmVM -ResourceGroupName ServersResourceGroup -Name LinuxWeb02
$vm.Name
接下来是VM的大小
$vm.HardwareProfile.VmSize
主要网络接口和可选的网络接口(如果在 VM 上存在)
$vm.NetworkProfile.NetworkInterfaces[0].Id
OS 磁盘配置文件
$vm.StorageProfile.OsDisk.OsType
$vm.StorageProfile.OsDisk.Name
$vm.StorageProfile.OsDisk.Vhd.Uri
每个数据磁盘的磁盘配置文件
$vm.StorageProfile.DataDisks[<index>].Lun
$vm.StorageProfile.DataDisks[<index>].Vhd.Uri
如果要获取数据磁盘的配置文件可以执行
Get-AzureRmVM -ResourceGroupName "ServersResourceGroup" -Name "LinuxWeb02"
所以数据磁盘的配置文件我这里是:
$vm.StorageProfile.DataDisks.Lun
$vm.StorageProfile.DataDisks.Vhd.Uri
已安装VM扩展
$vm.Extensions
定义完VM的信息后,接下来删除VM但不删除任何磁盘或网络接口
Remove-AzureRmVM -ResourceGroupName ServersResourceGroup -Name LinuxWeb02
可以看到Linuxweb02在Azure上剩下这些资源,如果您不想用到之前剩下的这些网卡,公网IP以及NSG的话那么可以删除掉这些,后面新建
下面是2选1的步骤:
New-AzureRmAvailabilitySet -ResourceGroupName ServersResourceGroup -Name <availabilitySetName> -Location "eastasia"
通过门户选择OSDisk磁盘创建新的VM即可
剩下的就是按照图形化基于该磁盘创建虚拟机了,创建时选择现有可用性集即可
创建完成后将数据磁盘附加的新建的这台VM上即可,后面也可以为这台新建的VM指定监视存储帐户。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如果您的虚拟机是非托管磁盘,把之前的托管磁盘LinuxWeb01和LinuxWeb02虚拟机删除掉,把可用性集WEBAVSET也删除掉,重新准备同样的2台非托管磁盘的虚拟机LinuxWeb01和LinuxWeb02,LinuxWeb01在新建的用性集WEBAVSET里,LinuxWeb02没有在任何可用性集里。
先把LinuxWeb02关机停止
那么执行如下脚本即可完成删除虚拟机保留磁盘,从该磁盘创建指定可用性集的虚拟机即可
定义需要收集的信息成为变量、删除原始VM,并在新可用性集中重新创建VM
#设置变量
#定义资源组
$rg = "ServersResourceGroup"
#指定需要更改可用性集的虚拟机名称
$vmName = "Linuxweb02"
#指定可用性集名称
$newAvailSetName = "WEBAVSET"
#定义输出原始虚拟机详细信息的文件位置,这个temp目录必须提前创建好
$outFile = "C:\temp\outfile.txt"
#Get VM Details
$OriginalVM = get-azurermvm -ResourceGroupName $rg -Name $vmName
#输出虚拟机详细信息到文件
"VM Name: " | Out-File -FilePath $outFile
$OriginalVM.Name | Out-File -FilePath $outFile -Append
"Extensions: " | Out-File -FilePath $outFile -Append
$OriginalVM.Extensions | Out-File -FilePath $outFile -Append
"VMSize: " | Out-File -FilePath $outFile -Append
$OriginalVM.HardwareProfile.VmSize | Out-File -FilePath $outFile -Append
"NIC: " | Out-File -FilePath $outFile -Append
$OriginalVM.NetworkProfile.NetworkInterfaces[0].Id | Out-File -FilePath $outFile -Append
"OSType: " | Out-File -FilePath $outFile -Append
$OriginalVM.StorageProfile.OsDisk.OsType | Out-File -FilePath $outFile -Append
"OS Disk: " | Out-File -FilePath $outFile -Append
$OriginalVM.StorageProfile.OsDisk.Vhd.Uri | Out-File -FilePath $outFile -Append
if ($OriginalVM.StorageProfile.DataDisks) {
"Data Disk(s): " | Out-File -FilePath $outFile -Append
$OriginalVM.StorageProfile.DataDisks | Out-File -FilePath $outFile -Append
}
#删除原始虚拟机
Remove-AzureRmVM -ResourceGroupName $rg -Name $vmName
#创建新的可用性集,如果它不存在
$availSet = Get-AzureRmAvailabilitySet -ResourceGroupName $rg -Name $newAvailSetName -ErrorAction Ignore
if (-Not $availSet) {
$availset = New-AzureRmAvailabilitySet -ResourceGroupName $rg -Name $newAvailSetName -Location $OriginalVM.Location
}
#为替换虚拟机创建基本配置
$newVM = New-AzureRmVMConfig -VMName $OriginalVM.Name -VMSize $OriginalVM.HardwareProfile.VmSize -AvailabilitySetId $availSet.Id
Set-AzureRmVMOSDisk -VM $NewVM -VhdUri $OriginalVM.StorageProfile.OsDisk.Vhd.Uri -Name $OriginalVM.Name -CreateOption Attach -Linux
#添加数据磁盘
foreach ($disk in $OriginalVM.StorageProfile.DataDisks ) {
Add-AzureRmVMDataDisk -VM $newVM -Name $disk.Name -VhdUri $disk.Vhd.Uri -Caching $disk.Caching -Lun $disk.Lun -CreateOption Attach -DiskSizeInGB $disk.DiskSizeGB
}
#添加网卡
foreach ($nic in $OriginalVM.NetworkProfile.NetworkInterfaces) {
Add-AzureRmVMNetworkInterface -VM $NewVM -Id $nic.Id
}
#创建虚拟机
New-AzureRmVM -ResourceGroupName $rg -Location $OriginalVM.Location -VM $NewVM -DisableBginfoExtension
这样就搞定了,看看LinuxWeb02已经加入到可用性集WEBAVSET里了
LinuxWeb02的数据磁盘也会自动添加好
可用性集里就有LinuxWeb01和LinuxWeb02两台虚拟机了
唯一需要自己动手修改的就是诊断存储帐户
业务一切正常
原文地址:http://blog.51cto.com/rdsrv/2104001