1. 程式人生 > >[Azure]ARM模式下製作映像並建立虛擬機器

[Azure]ARM模式下製作映像並建立虛擬機器

在操作前需要明確一點:目前ARM模式下只能製作一般化(Generalized)的映像。
 
我們以一臺Windows Server 2012的虛擬機器為模板,首先在虛擬機器內使用Sysprep進行一般化操作(對於Linux虛擬機器,使用waagent -deprovision命令進行相應地一般化操作):

一般化完成後,虛擬機器會按照我們選擇的Shutdown Options變為關機狀態:


注意上面的狀態實際上是虛擬機器內關機的狀態,未取消分配,所以需要在街面上在點一下“停止”按鈕關閉虛擬機器:

 
虛擬機器變為“已停止(已取消分配)”狀態後,我們使用Azure Powershell將已經做完Sysprep的虛擬機器“標記為”一般化(這裡省略了Login和設定訂閱的過程):
Set-AzureRmVM -ResourceGroupName <Resource Group Name> -Name <VM Name> -Generalized

設定完成後,儲存映像:
Save-AzureRmVMImage -ResourceGroupName <Resource Group Name> -VMName <VM Name> -DestinationContainerName <Container Name> -VHDNamePrefix <Custom VHD Name Prefix>

注意:DestinationContainerName的名稱需要由3-63個小寫或連字元組成,不能有大寫字母。與經典模式的一般化映像有一點區別,ARM模式下捕獲完成後,原虛擬機器不會自動刪除。
 
儲存映像操作完成後,我們找到虛擬機器所在的儲存賬號下,發現下面多了一個名為system的container:

在system下面依次找到Microsoft.Compute->Images->danimagecontainer(我們前面建立的container的名字),在裡面可以找到我們捕獲的映像對應的vhd檔案,還有一個json檔案(用於Template部署):

 

接著我們就可以使用這個vhd檔案來作為模板建立虛擬機器了,下面是一個簡單的批量建立三臺虛擬機器的指令碼(序列):

# 指定建立虛擬機器的登陸賬號
$username = "<Username>";
$passwd = ConvertTo-SecureString "<Password>" -AsPlainText -Force;
$cred = New-Object System.Management.Automation.PSCredential($username, $passwd);
 
# 指定虛擬機器的建立區域,資源組,建立使用的儲存賬號,使用的自定義Image的URL
$location = "China North";
$resourceGroup = "<Resource Group Name>";
$storageAccount = "<Storage Account Name>";
# 下面換成剛剛捕獲的映像的vhd的URL
$sourceImageUri = "https://dannorthstorage.blob.core.chinacloudapi.cn/system/Microsoft.Compute/Images/danimagecontainer/DanImage-osDisk.b2aa5527-7bbe-452a-90fb-9d09ed95b801.vhd";
 
# 指定虛擬機器名稱(由於是批量建立,所以指定一個名稱模板),虛擬機器尺寸,使用映像建立,OS磁碟快取方式
$vmNameBase = "<VM Name Template>";
$vmSize = "Standard_A1";
$osCreatenOption = "FromImage";
$osDiskCaching = "ReadWrite";
 
# 指定IP對應的dns名稱(可選)
# $dnsNameLabelBase = "<DNS Name>";
 
# 指定虛擬網路和子網(已存在的)
$virtualNetworkName = "<VNet Name>";
$subnetName = "<Subnet Name>";
$vnet = Get-AzureRmVirtualNetwork -Name $virtualNetworkName -ResourceGroupName $resourceGroup;
$subnet = Get-AzureRmVirtualNetworkSubnetConfig -Name $subnetName -VirtualNetwork $vnet;
 
for ($i = 1; $i -lt 4; $i += 1)
{
    $vmName = "{0}{1}" -f $vmNameBase, $i;
    $osDiskName = "{0}Disk" -f $vmName;
    $osDiskUri = "https://{0}.blob.core.chinacloudapi.cn/vhds/{1}.vhd" -f $storageAccount, $vmName;
    $vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize;
    # 指定系統型別等
    $vmConfig = Set-AzureRmVMOperatingSystem -VM $vmConfig -Windows -ComputerName $vmName -Credential $cred -ProvisionVMAgent;
    
    # 建立public IP
    $publicIPName = "{0}publicip" -f $vmName;
    # $dnsLabel = "{0}{1}" -f $vmName, $dnsNameLabelBase
    $publicIP = New-AzureRmPublicIpAddress -Name $publicIPName -ResourceGroupName $resourceGroup -Location $location -AllocationMethod Dynamic; #-DomainNameLabel $dnsLabel;
    
    # 建立NIC
    $nicName = "{0}nic" -f $vmName;
    $nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $resourceGroup -Location $location -SubnetId $subnet.Id -PublicIpAddressId $publicIP.Id;
 
    $vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id;
    $vmConfig = Set-AzureRmVMOSDisk -VM $vmConfig -Name $osDiskName -VhdUri $osDiskUri -SourceImageUri $sourceImageUri -Caching $osDiskCaching -CreateOption $osCreatenOption -Windows;
 
    # 建立VM
    New-AzureRmVM -ResourceGroupName $resourceGroup -Location $location -VM $vmConfig;
}


建立成功: