如何从Azure ASM迁移VM到ARM架构下
前面的一些文章,已经详细的说过ARM模式的一些特性及好处,也探讨过ASM的一些弊端。当然探讨的角度都是从产品设计,用户体验,市场需求方面,从某种程度上来讲接下来探讨是基于大众化。
所谓利弊都是在于用途,如果ASM完全够用,完全满足于现在的IT需求,而且IT运营已经能够非常,重要的是现有的IT架构都在ASM模式下部署,那么建议还是用ASM吧,如果有新的业务,完全独立的模块尝尝鲜上ARM也未尝不可,毕竟是趋势,极力推荐。
如果,对Azure是全新的认识,那么的话,极力推荐上ARM。毕竟任何新事物的产生都是有原因的,这是一个亘古不变的哲学道理,所以呢,以后Azure有什么新的Feature都是基于ARM的,如果以后想用发现部署模式不同,当然咱们不讨论迂回的解决方案哈,那么问题来了,早知现在何必当初,嘿嘿。
从ASM迁移到ARM的变与不变?
资源组是管理员可以用来捆绑特定应用程序或项目的Azure资源的逻辑容器。同一个组中的资源应具有相同的部署,更新和停用的生命周期,这意味着如果某个特定资源(例如数据库)被用于多个应用程序,则它应该被分在单独的组中。
资源模板是Azure服务配置的标准描述。由于模板还可以应用于资源组,因此它们可以定义应用程序所使用的Azure服务之间的依赖和相互关系。模板是描述资源,变量,参数以及(如果需要的话)资源组输出的声明性JSON描述。模板替换了传统门户中使用的临时脚本,让Azure用户能使用相同的安全策略,以相同的配置方式来部署同一组服务。
基于角色的访问控制(RBAC)通过确保用户只能访问那些他们执行任务所需的Azure服务与功能来提高安全性。管理员可以在订阅,资源组或单个资源上应用RBAC。这意味着特定用户有可能有权限访问订阅的所有数据库,但除此之外不再有其他权限,而另一个用户则只能使用资源组定义的特定应用程序所使用的虚拟机。
标签是管理员可以应用于Azure资源的元数据,目标是在订阅中进行逻辑组织。标签可按照部门,工作组,项目或位置代码对资源进行分组,以及用于汇总资源使用情况和费用。管理员可以使用标签标记超出预算的用户或项目。
以上都是ARM模式的特点,是新事物的特征,这些都是重要的变化。
通常不变的是机房的位置,机房的硬件配置,底层的计算方式(云计算技术角度不是部署计算方式)。
IaaS VM产品角度变化分析。
ASM(VM) |
ARM(VM) |
||
操作系统 |
自定义,官方 |
自定义,官方 |
自定义VHD |
磁盘 |
Storage V1 |
Storage V2 |
RM VM只能用V2 |
网络 |
Vnet V1 |
Vnet V2 |
RM VM只能用V2 |
IP属性 |
Cloud Service+VM |
LB+NetworkInterface |
|
负载均衡 |
Cloud Service |
LB |
|
可用性集 |
Set V2 |
Set V3 |
RM VM只能用V3,RM VM创建没有加入Set,后期如果再加有宕机时限 |
启动诊断 |
Diag |
Diag |
未分离VM属性 |
镜像捕获 |
门户,Powershell |
Powershell |
RM做完镜像,这台VM将不可用,有宕机时限,可恢复 |
扩展 |
BGinfo,Agent |
BGinfo,Agent |
|
安全 |
ACL |
NSG |
RM VM如果没有加入NSG,默认放行端口3389或者22 |
创建方式 |
门户,Powershell |
门户,Powershell, |
FromInmage,Attach,Empty(方法) |
如果对于以上一个表讨论,那么我相信可以写一篇毕业论文了,
这不是我们的主要工作。
那么, 我将会Share 如何通过Powershell把ASM模式下的VM迁移到ARM模式下,
尽管官方也有迁移方案和社区工具:
有兴趣的小伙伴可以自行研究,我们的脚步做的事情是把ASM的虚拟机复制到ARM下,就这么简单的一个逻辑,与其说迁移倒不如说是复制。我们不用担心ASM下VM的状态如何。
只按要求填写参数即可,但是后期需要验证VM Agent千万不要忘了。
PS脚本:
<# ++++++++++++++++++++++++++++++++++++++++++++++++++++++ This scrips is that how to migration IaaS Service(VM) in Azure. IaaS Service: Virtual Machine. .NOTES Author: Luna-Star Last Updated: 11/28/2016 Version 1.1 #> Param ( #待迁移虚拟机订阅ID [string] $SubscriptionId="8b5da570-2b06-4596-9597-c84a1ac863fe", #待迁移虚拟机云服务名称 [string] $CloudServiceName="ie10", #待迁移虚拟机名称 [string] $MigrationVM="ie10", #目标虚拟机存放资源组名称 [string] $VMResourceGroup="ie10", #目标虚拟机名称 [string] $DestVMName="ie11", #目标存储账户名称 [string] $DestStorageAccountName="ie12", #目标存储账户所在资源组 [string] $DestStorageAccountrg="ie11", #目标镜像所在Container Name [string] $DestStorageContainerName="vhds", #目标虚拟机设置登录的用户名 [string] $DestUsername="locyu", #目标虚拟机设置登录的密码 [string] $DestPassword="Apple123", #目标虚拟机所在数据中心,分别为China North和China East [string] $DestLocation="China North", #目标虚拟机所在虚拟网络名称 [string] $DestVNetName="locyu01", #目标虚拟机所在虚拟网络的资源组名称 [string] $DestVNetNameResourceGroup="locyu01", #目标虚拟机所在子网数组号,例如:在页面上从上至下顺序第二个子网,那么它的数组号为1 [string] $DestSubNet="1" ) #登陆待迁移的订阅账号 Add-AzureAccount -Environment AzureChinaCloud Select-AzureSubscription -SubscriptionId $SubscriptionId -Current ############################################################################## # This part is the info of migration VM. ############################################################################## $InfoVM = Get-AzureVM -ServiceName $CloudServiceName -Name $MigrationVM $StorVM = Get-AzureOSDisk -VM $InfoVM $HostCaching = $StorVM.HostCaching $AvailabilitySetName = $InfoVM.AvailabilitySetName $InstanceSize = $InfoVM.InstanceSize.ToString() $OSType = $StorVM.OS.ToString() $OSMediaLink = $StorVM.MediaLink.ToString() $OSStorageAccount = $StorVM.MediaLink.Host.Split(".")[0] $OSStorageAccountKey = (Get-AzureStorageKey -StorageAccountName $OSStorageAccount).Primary $Context = New-AzureStorageContext -StorageAccountName $OSStorageAccount -StorageAccountKey $OSStorageAccountKey #登陆目标的订阅账号 Login-AzureRmAccount -EnvironmentName AzureChinaCloud ############################################################################## # This part is that how to creat VM. ############################################################################## #获取订阅下目标资源组 $Ps = ConvertTo-SecureString -String $DestPassword -AsPlainText -force $cred = New-Object System.Management.Automation.PSCredential($DestUsername,$Ps) $rg = Get-AzureRmResourceGroup -Name $VMResourceGroup IF ($rg -eq $null){ New-AzureRmResourceGroup -Name $VMResourceGroup -Location $DestLocation} $srg = Get-AzureRmResourceGroup -Name $DestStorageAccountrg IF ($srg -eq $null){ New-AzureRmResourceGroup -Name $DestStorageAccountrg -Location $DestLocation} #获取订阅下目标存储 $st = Get-AzureRmStorageAccount -ResourceGroupName $DestStorageAccountrg -Name $DestStorageAccountName IF ($st -eq $null){ New-AzureRmStorageAccount -ResourceGroupName $DestStorageAccountrg ` -Name $DestStorageAccountName ` -SkuName Standard_GRS ` -Location $DestLocation } #为目标存储创建vhds容器 $destStorageAccountKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $DestStorageAccountrg -Name $DestStorageAccountName).Value[0] $destContext = New-AzureStorageContext -StorageAccountName $DestStorageAccountName -StorageAccountKey $destStorageAccountKey $rq = New-AzureStorageContainer -Name $DestStorageContainerName -Context $destContext IF($rq -eq $null){ New-AzureStorageContainer -Name vhds -Context $destContext } #创建虚拟机pip和网络接口 $net = Get-AzureRmVirtualNetwork -Name $DestVNetName -ResourceGroupName $DestVNetNameResourceGroup $pip = New-AzureRmPublicIpAddress -Name $DestVMName -ResourceGroupName $VMResourceGroup -Location $DestLocation ` -AllocationMethod Dynamic $nic = New-AzureRmNetworkInterface -Name $DestVMName -ResourceGroupName $VMResourceGroup -Location $DestLocation ` -SubnetId $net.Subnets[$DestSubNet].Id -PublicIpAddressId $pip.Id #复制VHD并且配置VHD $blob = Start-AzureStorageBlobCopy -srcUri $OSMediaLink ` -DestContainer $DestStorageContainerName ` -DestBlob ($DestVMName +".vhd")` -DestContext $destContext -Context $Context $osDiskUri = "https://" + $DestStorageAccountName + ".blob.core.chinacloudapi.cn/"+ $DestStorageContainerName + "/"+ $DestVMName + ".vhd" #创建可用性集 #如果源机器没有可用性集,那么将会重新赋值,因为RM下的VM创建没有加可用性后期会很麻烦 IF($AvailabilitySetName -eq $null){$AvailabilitySetName = ($DestVMName+"AvailabilitySet")} $av = Get-AzureRmAvailabilitySet -ResourceGroupName $VMResourceGroup -Name $AvailabilitySetName IF($av -eq $null){ $av = New-AzureRmAvailabilitySet -ResourceGroupName $VMResourceGroup -Name $AvailabilitySetName -Location $DestLocation } #创建虚拟机 $vmConfig = New-AzureRmVMConfig -VMName $DestVMName -VMSize $InstanceSize -AvailabilitySetId $av.Id #$vm = Set-AzureRmVMOperatingSystem -VM $DestVMName -ComputerName $DestVMName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate $vm = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id $osDiskName = $DestVMName + "osDisk" #如果有数据盘可以先copy到vhd在添加,这里就不加了 #$dataDiskName = $DestVMName + "dataDisk" #$vm = Add-AzureRmVMDataDisk -VM $vm -Name $dataDiskName -VhdUri $dataDiskUri -Lun 0 -CreateOption attach $vm = Set-AzureRmVMOSDisk -VM $vm -Name $osDiskName -VhdUri $osDiskUri -Caching $HostCaching -CreateOption Attach -Windows #开始创建 New-AzureRmVM -ResourceGroupName $VMResourceGroup -Location $DestLocation -VM $vm