分享方式:


教學課程:使用 Azure PowerShell 建立 Windows VM 映像

適用於:✔️ Windows VM ✔️ 彈性擴展集

您可使用映像來啟動部署,並確保多個 VM 之間的一致性。 在本教學課程中,您將使用 PowerShell 來建立自己的 Azure 虛擬機器特製化映像,並將其儲存在 Azure Compute Gallery (先前稱為共用映像庫) 中。 您將學習如何:

  • 建立 Azure Compute Gallery
  • 建立映像定義
  • 建立映像版本
  • 從映像建立 VM
  • 共用資源庫

開始之前

下列步驟將詳細說明如何將現有 VM 轉換成可重複使用的自訂映像,以便讓您用來建立新的 VM。

若要完成本教學課程中的範例,您目前必須具有虛擬機器。 如有需要,您可以查看 PowerShell 快速入門來建立要用於本教學課程的 VM。 逐步完成教學課程之後,請視需要取代資源名稱。

概觀

Azure Compute Gallery 可簡化跨組織共用自訂映像。 自訂映像類似 Marketplace 映像,但您要自行建立它們。 自訂映像可用於啟動程序設定,例如,預先載入應用程式、應用程式設定和其他 OS 設定。

Azure Compute Gallery 可讓您與其他人共用您的自訂 VM 映像。 選擇您要共用的映像、您要開放使用的區域,以及您要共用的對象。

Azure Compute Gallery 功能有多個資源類型:

資源 描述
影像來源 此資源可用在資源庫中建立映像版本。 映像來源可以是現有的 Azure VM,其為一般化或特殊化、受控映像、快照集,或另一個資源庫中的映像版本。
資源庫 和 Azure Marketplace 一樣,資源庫是用於管理和共用映像與 VM 應用程式的存放庫,但您可以控制哪些使用者能夠存取。
映像定義 映像定義會在資源庫內建立,並包含內部使用映像和需求的相關資訊。 這包括映像是 Windows 還是 Linux、版本資訊以及最小和最大的記憶體需求。 這是映像類型的定義。
映像版本 映像版本是在使用資源庫時用來建立 VM 的項目。 您可以視需要針對您的環境擁有多個版本的映像。 和受控映像一樣,當您使用映像版本來建立 VM 時,系統會使用映像版本來建立 VM 的新磁碟。 映像版本可以使用數次。

啟動 Azure Cloud Shell

Azure Cloud Shell 是免費的互動式 Shell,可讓您用來執行本文中的步驟。 它具有預先安裝和設定的共用 Azure 工具,可與您的帳戶搭配使用。

若要開啟 Cloud Shell,只要選取程式碼區塊右上角的 [試試看] 即可。 您也可以移至 https://shell.azure.com/powershell ,從另一個瀏覽器索引標籤啟動 Cloud Shell。 選取 [複製] 即可複製程式碼區塊,將它貼到 Cloud Shell 中,然後按 enter 鍵加以執行。

取得 VM

您可以使用 Get-AzVM 來查看資源群組中的可用 VM 清單。 當您知道 VM 名稱和資源群組之後,您可以再次使用 Get-AzVM 來取得該 VM 物件,並將其儲存在變數中以供日後使用。 此範例會從 myResourceGroup 資源群組取得名為 sourceVM 的 VM,然後將其指派至 $sourceVM 變數。

$sourceVM = Get-AzVM `
   -Name sourceVM `
   -ResourceGroupName myResourceGroup

建立資源群組

使用 New-AzResourceGroup 命令來建立資源群組。

Azure 資源群組是在其中部署與管理 Azure 資源的邏輯容器。 在下列範例中,名為 myGalleryRG 的資源群組會建立在 EastUS 區域中:

$resourceGroup = New-AzResourceGroup `
   -Name 'myGalleryRG' `
   -Location 'EastUS'

資源庫是用於啟用映像共用的主要資源。 資源庫名稱允許的字元為大寫或小寫字母、數字、點和句點。 資源庫名稱不能包含連字號。 資源庫名稱在您的訂用帳戶內必須是唯一的。

使用 New-AzGallery 建立資源庫。 下列範例會在 myGalleryRG 資源群組中建立名為 myGallery 的資源庫。

$gallery = New-AzGallery `
   -GalleryName 'myGallery' `
   -ResourceGroupName $resourceGroup.ResourceGroupName `
   -Location $resourceGroup.Location `
   -Description 'Azure Compute Gallery for my organization'	

建立映像定義

映像定義會建立映像的邏輯群組。 並且可用來管理在其中建立的映像版本相關資訊。 映像定義名稱可以由大寫或小寫字母、數字、點、虛線和句點組成。 若要深入了解您可以為映像定義指定哪些值,請參閱映像定義

使用 New-AzGalleryImageDefinition 建立映像定義。 在此範例中,資源庫映像會命名為 myGalleryImage,並為特製化映像而建立。

$galleryImage = New-AzGalleryImageDefinition `
   -GalleryName $gallery.Name `
   -ResourceGroupName $resourceGroup.ResourceGroupName `
   -Location $gallery.Location `
   -Name 'myImageDefinition' `
   -OsState specialized `
   -OsType Windows `
   -Publisher 'myPublisher' `
   -Offer 'myOffer' `
   -Sku 'mySKU'

建立映像版本

使用 New-AzGalleryImageVersion 從 VM 建立映像版本。

映像版本允許的字元是數字及句點。 數字必須在 32 位元整數的範圍內。 格式:MajorVersion.MinorVersion.Patch

在此範例中,映像版本為 1.0.0,並且會複寫到「美國東部」和「美國中南部」資料中心。 選擇要複寫的目的地區域時,您必須包含作為複寫目標的「來源」區域。

若要從 VM 建立映像版本,請使用 $vm.Id.ToString() 作為 -Source

   $region1 = @{Name='South Central US';ReplicaCount=1}
   $region2 = @{Name='East US';ReplicaCount=2}
   $targetRegions = @($region1,$region2)

New-AzGalleryImageVersion `
   -GalleryImageDefinitionName $galleryImage.Name`
   -GalleryImageVersionName '1.0.0' `
   -GalleryName $gallery.Name `
   -ResourceGroupName $resourceGroup.ResourceGroupName `
   -Location $resourceGroup.Location `
   -TargetRegion $targetRegions  `
   -Source $sourceVM.Id.ToString() `
   -PublishingProfileEndOfLifeDate '2030-12-01'

將映像複寫到所有目的地區域可能需要一些時間。

建立 VM

當您擁有特製化映像之後,您就可以建立一個或多個新的 VM。 使用 New-AzVM Cmdlet。 若要使用映像,請使用 Set-AzVMSourceImage,並將 -Id 設為映像定義識別碼 (在此案例中為 $galleryImage.Id),以永遠使用最新的映像版本。

視需要取代此範例中的資源名稱。

# Create some variables for the new VM.
$resourceGroup = "myResourceGroup"
$location = "South Central US"
$vmName = "mySpecializedVM"

# Create a resource group
New-AzResourceGroup -Name $resourceGroup -Location $location

# Create the network resources.
$subnetConfig = New-AzVirtualNetworkSubnetConfig -Name mySubnet -AddressPrefix 192.168.1.0/24
$vnet = New-AzVirtualNetwork -ResourceGroupName $resourceGroup -Location $location `
  -Name MYvNET -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig
$pip = New-AzPublicIpAddress -ResourceGroupName $resourceGroup -Location $location `
  -Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4
$nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP  -Protocol Tcp `
  -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * `
  -DestinationPortRange 3389 -Access Deny
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $resourceGroup -Location $location `
  -Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP
$nic = New-AzNetworkInterface -Name $vmName -ResourceGroupName $resourceGroup -Location $location `
  -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id

# Create a virtual machine configuration using $imageVersion.Id to specify the image version.
$vmConfig = New-AzVMConfig -VMName $vmName -VMSize Standard_D1_v2 | `
Set-AzVMSourceImage -Id $galleryImage.Id | `
Add-AzVMNetworkInterface -Id $nic.Id

# Create a virtual machine
New-AzVM -ResourceGroupName $resourceGroup -Location $location -VM $vmConfig

我們建議您在資源庫層級上共用存取權。 使用電子郵件地址和 Get-AzADUser Cmdlet 來取得使用者的物件識別碼,然後使用 New-AzRoleAssignment 來提供資源庫的存取權。 以您自己的資訊取代範例電子郵件 (在此範例中為 alinne_montes@contoso.com)。

# Get the object ID for the user
$user = Get-AzADUser -StartsWith alinne_montes@contoso.com
# Grant access to the user for our gallery
New-AzRoleAssignment `
   -ObjectId $user.Id `
   -RoleDefinitionName Reader `
   -ResourceName $gallery.Name `
   -ResourceType Microsoft.Compute/galleries `
   -ResourceGroupName $resourceGroup.ResourceGroupName

清除資源

當不再需要時,您可以使用 Remove-AzResourceGroup 命令來移除資源群組及所有相關資源:

# Delete the gallery 
Remove-AzResourceGroup -Name myGalleryRG

# Delete the VM
Remove-AzResourceGroup -Name myResoureceGroup

Azure Image Builder

Azure 也提供以 Packer 為基礎的服務:Azure VM Image Builder。 只要在範本中描述您的自訂,其就會處理映像建立作業。

下一步

在本教學課程中,您已建立特製化的 VM 映像。 您已了解如何︰

  • 建立 Azure Compute Gallery
  • 建立映像定義
  • 建立映像版本
  • 從映像建立 VM
  • 共用資源庫

請前進到下一個教學課程,以了解虛擬機器擴展集。