教程:使用 Azure PowerShell 创建 Windows VM 映像

适用于:✔️ Windows VM ✔️ 灵活规模集

映像可用于启动部署并确保多个 VM 的一致性。 在本教程中,我们使用 PowerShell 创建自己的 Azure 虚拟机专用化映像,并将其存储在 Azure Compute Gallery(以前称为共享映像库)中。 学习如何:

  • 创建 Azure Compute Gallery
  • 创建映像定义
  • 创建映像版本
  • 从映像创建 VM
  • 共享库

开始之前

下列步骤详细说明如何将现有 VM 转换为可重用自定义映像,以便将其用于创建新的 VM。

若要完成本教程中的示例,必须现有一个虚拟机。 如果需要,可以参阅 PowerShell 快速入门来创建本教程所用的 VM。 在学习本教程期间,请根据需要替换资源名称。

概述

Azure Compute Gallery 简化了整个组织中的自定义映像共享。 自定义映像类似于市场映像,不同的是自定义映像的创建者是自己。 自定义映像可用于启动配置,例如预加载应用程序、应用程序配置和其他 OS 配置。

使用 Azure Compute Gallery,你可以与他人共享自定义 VM 映像。 选择要共享哪些映像,要在哪些区域中共享,以及希望与谁共享它们。

Azure Compute Gallery 功能具有多种资源类型:

资源 说明
映像源 这是可用于在库中创建“映像版本”的资源。 映像源可以是现有的 Azure VM(通用或专用)、托管映像、快照或其他库中的映像版本。
与 Azure 市场一样,库是用于管理及共享映像和 VM 应用程序的存储库,但你可以控制谁有权访问该库。
映像定义 映像定义在库中创建,携带有关该映像以及在内部使用该映像的要求的信息。 这包括了该映像是 Windows 还是 Linux 映像、发行说明以及最低和最高内存要求。 它是某种映像类型的定义。
映像版本 使用库时,将使用映像版本来创建 VM。 可根据环境的需要创建多个映像版本。 与托管映像一样,在使用映像版本创建 VM 时,将使用映像版本来创建 VM 的新磁盘。 可以多次使用映像版本。

启动 Azure PowerShell

打开 Azure Powershell 控制台,并以管理员权限运行以下脚本。

获取 VM

可以使用 Get-AzVM 查看资源组中可用的 VM 列表。 了解 VM 名称和资源组后,可以再次使用 Get-AzVM 来获取 VM 对象并将其存储在变量中,供稍后使用。 此示例从“myResourceGroup”资源组获取名为 sourceVM 的 VM,并将其分配给变量 $sourceVM。

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

创建资源组

使用 New-AzResourceGroup 命令创建资源组。

Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 以下示例在“ChinaEast”区域中创建名为“myGalleryRG”的资源组 :

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

库是用于启用映像共享的主要资源。 允许用于库名称的字符为大写或小写字母、数字、点和句点。 库名称不能包含短划线。 库名称在你的订阅中必须唯一。

使用 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 创建映像版本,请对 -Source 使用 $vm.Id.ToString()

   $region1 = @{Name='China East';ReplicaCount=1}
   $region2 = @{Name='China North';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 设置为映像定义 ID(在本例中为 $galleryImage.Id),以始终使用最新的映像版本。

在此示例中,请根据需要替换资源名称。

# Create some variables for the new VM.
$resourceGroup = "myResourceGroup"
$location = "China North"
$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 获取用户的对象 ID,然后使用 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 cmdlet 删除资源组和所有相关资源:

# Delete the gallery 
Remove-AzResourceGroup -Name myGalleryRG

# Delete the VM
Remove-AzResourceGroup -Name myResoureceGroup

Azure 映像生成器

Azure 还提供一个基于 Packer 的服务:Azure VM 映像生成器。 只需在模板中描述你的自定义设置,然后该模板即会处理映像的创建。

后续步骤

在本教程中,你已创建一个专用化 VM 映像。 你已了解如何:

  • 创建 Azure Compute Gallery
  • 创建映像定义
  • 创建映像版本
  • 从映像创建 VM
  • 共享库

请转到下一教程,了解虚拟机规模集。