Azure LINUX Classic VM migration to ARM VM PowerShell

 最近有一些客戶需要將虛擬機由傳統轉換成新的資源群組式VM
所以寫了這個powershell
原理很簡單

1.將原本的VM的磁碟轉換為受控磁碟
2.並由受控磁碟建立新的虛擬機
3.指定新的虛擬網路

1.首先是建LAB
   我起一個UBUNTU 16.04的LINUX VM(傳統)




建立好後
測試登入 確定機器運作正常




為模擬真實環境
我掛了一顆資料磁碟


首先
複製以下資訊到powershell變數上
以下說明變數

$resourceGroupName = 'CLASSICVM'    // 原來的資源群組
$destinationResourceGroup = 'CLASSICVM'  //// 移轉後資源群組 可以是一樣的
$location = 'southeastasia'     //地點  如美東就是US East
$virtualNetworkName = 'VNET'                   // new VM vnet   新機器的虛擬網路名稱
$virtualMachineName = 'NewLinuxVM'       // new VM name
$virtualMachineSize = 'Standard_DS1_V2'   //規格  注意D系列與A系列磁碟的不同

 $imageName = 'classicVMImage'
$osVhdUri = 'https://mylinuxclassicvmstorage.blob.core.windows.net/vhds/linuxvm-os-9631.vhd' // OS槽的VHD路徑
$osDiskName = 'LinuxOsDisk'
$dataVhdUri = 'https://classic2136.blob.core.windows.net/vhds/linuxvm-20180816-datadisk.vhd' // // DATA槽的VHD路徑
$dataDiskName = 'LinuxVMDataDisk01'

VM舊磁碟的路徑可以再虛擬機的磁碟中找到


2.準備好資訊便可以開始跑了
  先登入取得存取權限
Connect-AzureRmAccount
Get-AzureRMSubscription | Format-Table  #從這個表中取得subscrID

再貼更新下面的訂閱ID (subscrID)
$subscrID="132cdab3-5b8a-4920-b89b-81fdaadb46fd"
Get-AzureRmSubscription -SubscriptionId $subscrID | Select-AzureRmSubscription

完成會看到以下畫面



 3. 首先將就磁碟轉換為受控磁碟(包含掛載碟)
     這邊要注意你的磁碟型態是要選HDD還是SSD 參數要下對應的Standard_LRS或 Premium_LRS

 #使用傳統 VM 中的 VHD 建立受控 OS 磁碟。
$osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk `
    (New-AzureRmDiskConfig -AccountType Standard_LRS  `
    -Location $location -CreateOption Import `
    -SourceUri $osVhdUri) `
    -ResourceGroupName $destinationResourceGroup
#將 OS 磁碟附加至新的 VM。
$VirtualMachine = New-AzureRmVMConfig -VMName $virtualMachineName -VMSize $virtualMachineSize

#$VirtualMachine = Set-AzureRmVMOSDisk -VM $VirtualMachine -ManagedDiskId $osDisk.Id -StorageAccountType Standard_LRS -DiskSizeInGB 128 -CreateOption Attach -Linux
$VirtualMachine = Set-AzureRmVMOSDisk -VM $VirtualMachine -ManagedDiskId $osDisk.Id -StorageAccountType Premium_LRS -DiskSizeInGB 32 -CreateOption Attach -Linux

#從資料 VHD 檔案建立受控資料磁碟,並將它新增到新的 VM  premium_lrs
#$dataDisk1 = New-AzureRmDisk -DiskName $dataDiskName -Disk (New-AzureRmDiskConfig -AccountType Premium_LRS -Location $location -CreateOption Import -SourceUri $dataVhdUri ) -ResourceGroupName $resourceGroupName

$dataDisk1 = New-AzureRmDisk -DiskName $dataDiskName -Disk (New-AzureRmDiskConfig -AccountType Standard_LRS -Location $location -CreateOption Import -SourceUri $dataVhdUri ) -ResourceGroupName $resourceGroupName

 #------------------  convert data disk to manager disk 如果有多個掛接磁碟才需要--------------
# New-AzureRmDisk -DiskName "pccoc02DataDisk06" -Disk (New-AzureRmDiskConfig -AccountType Standard_LRS -Location $location -CreateOption Import -SourceUri "https://pccstorage00002.blob.core.windows.net/storcontainer002/VMDisk-006.vhd" ) -ResourceGroupName $resourceGroupName
 #----------------------------------------------------------------------







 順利執行完會看到資源群組中多了受控磁碟(綠色的ITEM)


4.再來執行網路卡與虛擬網路的綁定
  並執行建立虛擬機

$VirtualMachine = Add-AzureRmVMDataDisk -VM $VirtualMachine -Name $dataDiskName -CreateOption Attach -ManagedDiskId $dataDisk1.Id -Lun 1  #掛載磁碟


#設定公用 IP、虛擬網路和 NIC,建立新的 VM。

$publicIp = New-AzureRmPublicIpAddress -Name ($VirtualMachineName.ToLower()+'_ip') -ResourceGroupName $resourceGroupName -Location $location -AllocationMethod Dynamic
$vnet = Get-AzureRmVirtualNetwork -Name $virtualNetworkName -ResourceGroupName 'vent'
$nic = New-AzureRmNetworkInterface -Name ($VirtualMachineName.ToLower()+'_nic') -ResourceGroupName $resourceGroupName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $publicIp.Id
$VirtualMachine = Add-AzureRmVMNetworkInterface -VM $VirtualMachine -Id $nic.Id


New-AzureRmVM -VM $VirtualMachine -ResourceGroupName $destinationResourceGroup -Location $location



跑一陣子後 會看到新的虛擬機已建立起來

建立好後
因為目前尚沒試出直接用Set-AzureRmVMAccessExtension把密碼設好的方式
所以新的虛擬機我們要做一次重設密碼


設定好後 我們就可以SSH試試看新機器的狀態


新掛進來的磁碟也需要重新掛接(因為UUID已變)
可以參考以下(圖片是sdc是datadisk)
https://docs.microsoft.com/zh-tw/azure/virtual-machines/linux/add-disk





以下是整個的powershell
Azure Classic VM migration to ARM VM PowerShell
 
Connect-AzureRmAccount

Get-AzureRMSubscription | Format-Table
$subscrID="132cdab3-5b8a-4920-b89b-81fdaadb46fd"
Get-AzureRmSubscription -SubscriptionId $subscrID | Select-AzureRmSubscription
 
$resourceGroupName = 'CLASSICVM'
$destinationResourceGroup = 'CLASSICVM'
$location = 'southeastasia' 
$virtualNetworkName = 'VNET' # new VM vnet
$virtualMachineName = 'NewLinuxVM' # new VM name
$virtualMachineSize = 'Standard_DS1_V2'
$adminUserName = "fender"
$adminPassword = "Xyz=123456789" | ConvertTo-SecureString -AsPlainText -Force

$cred = New-Object System.Management.Automation.PSCredential ($adminUserName, $adminPassword)
#$cred=Get-Credential -Message "Type the name and password of the local administrator account."

$imageName = 'classicVMImage'
$osVhdUri = 'https://mylinuxclassicvmstorage.blob.core.windows.net/vhds/linuxvm-os-9631.vhd'
$osDiskName = 'LinuxOsDisk'
$dataVhdUri = 'https://classic2136.blob.core.windows.net/vhds/linuxvm-20180816-datadisk.vhd'
$dataDiskName = 'LinuxVMDataDisk01'
 
 #使用傳統 VM 中的 VHD 建立受控 OS 磁碟。
$osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk `
    (New-AzureRmDiskConfig -AccountType Standard_LRS  `
    -Location $location -CreateOption Import `
    -SourceUri $osVhdUri) `
    -ResourceGroupName $destinationResourceGroup
#將 OS 磁碟附加至新的 VM。
$VirtualMachine = New-AzureRmVMConfig -VMName $virtualMachineName -VMSize $virtualMachineSize 

#$VirtualMachine = Set-AzureRmVMOSDisk -VM $VirtualMachine -ManagedDiskId $osDisk.Id -StorageAccountType Standard_LRS -DiskSizeInGB 128 -CreateOption Attach -Linux
$VirtualMachine = Set-AzureRmVMOSDisk -VM $VirtualMachine -ManagedDiskId $osDisk.Id -StorageAccountType Premium_LRS -DiskSizeInGB 32 -CreateOption Attach -Linux

#從資料 VHD 檔案建立受控資料磁碟,並將它新增到新的 VM  premium_lrs
#$dataDisk1 = New-AzureRmDisk -DiskName $dataDiskName -Disk (New-AzureRmDiskConfig -AccountType Premium_LRS -Location $location -CreateOption Import -SourceUri $dataVhdUri ) -ResourceGroupName $resourceGroupName

$dataDisk1 = New-AzureRmDisk -DiskName $dataDiskName -Disk (New-AzureRmDiskConfig -AccountType Standard_LRS -Location $location -CreateOption Import -SourceUri $dataVhdUri ) -ResourceGroupName $resourceGroupName

 #------------------  convert data disk to manager disk 如果有多個掛接磁碟才需要--------------
# New-AzureRmDisk -DiskName "pccoc02DataDisk06" -Disk (New-AzureRmDiskConfig -AccountType Standard_LRS -Location $location -CreateOption Import -SourceUri "https://pccstorage00002.blob.core.windows.net/storcontainer002/VMDisk-006.vhd" ) -ResourceGroupName $resourceGroupName
 #----------------------------------------------------------------------

$VirtualMachine = Add-AzureRmVMDataDisk -VM $VirtualMachine -Name $dataDiskName -CreateOption Attach -ManagedDiskId $dataDisk1.Id -Lun 1


#設定公用 IP、虛擬網路和 NIC,建立新的 VM。

$publicIp = New-AzureRmPublicIpAddress -Name ($VirtualMachineName.ToLower()+'_ip') -ResourceGroupName $resourceGroupName -Location $location -AllocationMethod Dynamic
$vnet = Get-AzureRmVirtualNetwork -Name $virtualNetworkName -ResourceGroupName 'vent'
$nic = New-AzureRmNetworkInterface -Name ($VirtualMachineName.ToLower()+'_nic') -ResourceGroupName $resourceGroupName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $publicIp.Id
$VirtualMachine = Add-AzureRmVMNetworkInterface -VM $VirtualMachine -Id $nic.Id
 

New-AzureRmVM -VM $VirtualMachine -ResourceGroupName $destinationResourceGroup -Location $location  
footer See also :

留言

這個網誌中的熱門文章

Office 2021 離線安裝封裝與KMS啟動步驟

Ollama使用心得與模型導入教學

ARC下NSMutableDictionary 無法使用retainCount