使用 Azure VM 映像生成器从现有映像创建新的 Windows VM 映像

适用于:✔️ Windows VM

在本文中,你将了解如何更新 Azure Compute Gallery(以前称为共享映像库)中的现有 Windows 映像版本并将其作为新映像版本发布到库中。

要配置映像,可使用示例 JSON 模板 helloImageTemplateforSIGfromWinSIG.json

注册提供程序

若要使用 VM 映像生成器,需要注册提供程序。

  1. 检查提供程序注册情况。 确保都返回“已注册”。

    az provider show -n Microsoft.VirtualMachineImages | grep registrationState
    az provider show -n Microsoft.KeyVault | grep registrationState
    az provider show -n Microsoft.Compute | grep registrationState
    az provider show -n Microsoft.Storage | grep registrationState
    az provider show -n Microsoft.Network | grep registrationState
    az provider show -n Microsoft.ContainerInstance | grep registrationState
    
  2. 如果未返回“已注册”,请运行以下命令注册提供程序:

    az provider register -n Microsoft.VirtualMachineImages
    az provider register -n Microsoft.Compute
    az provider register -n Microsoft.KeyVault
    az provider register -n Microsoft.Storage
    az provider register -n Microsoft.Network
    az provider register -n Microsoft.ContainerInstance
    

设置变量和访问权限

如果已按照创建映像并将其分发到 Azure Compute Gallery 创建了 Azure Compute Gallery,则表示你已创建所需的部分变量。

注意

VM 映像生成器仅支持在源托管映像所在的同一资源组中创建自定义映像。 在以下示例中,将资源组名称 ibsigRG 更新为源托管映像所在的资源组的名称。

  1. 如果尚未创建变量,请运行以下命令:

    # Resource group name - we are using ibsigRG in this example
    sigResourceGroup=myIBWinRG
    # Datacenter location - we are using China North 3 in this example
    location=chinanorth
    # Additional region to replicate the image to - we are using China North in this example
    additionalregion=chinanorth
    # name of the Azure Compute Gallery - in this example we are using myGallery
    sigName=my22stSIG
    # name of the image definition to be created - in this example we are using myImageDef
    imageDefName=winSvrimages
    # image distribution metadata reference name
    runOutputName=w2019SigRo
    # User name and password for the VM
    username="user name for the VM"
    vmpassword="password for the VM"
    
  2. 为你的订阅 ID 创建变量:

    subscriptionID=$(az account show --query id --output tsv)
    
  3. 获取要更新的映像版本:

    sigDefImgVersionId=$(az sig image-version list \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID --query [].'id' -o tsv)
    

创建用户分配的标识,并在资源组上设置权限

你已经在前面的示例中设置了用户标识,因此现在需要获取将追加到模板中的资源 ID。

#get identity used previously
imgBuilderId=$(az identity list -g $sigResourceGroup --query "[?contains(name, 'aibBuiUserId')].id" -o tsv)

如果你已有 Azure Compute Gallery,但没有按照前面的示例进行设置,则需要为 VM 映像生成器分配对资源组的访问权限,以便它可以访问该库。 有关详细信息,请参阅创建映像并将其分发到 Azure Compute Gallery

修改 helloImage 示例

可以在 helloImageTemplateforSIGfromSIG.json 上查看将要使用的 JSON 示例。 有关 JSON 文件的信息,请参阅创建 Azure VM 映像生成器模板

  1. 下载 JSON 示例,如创建用户分配的标识并设置资源组的权限中所示。

  2. 使用变量配置 JSON:

    curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/8_Creating_a_Custom_Win_Shared_Image_Gallery_Image_from_SIG/helloImageTemplateforSIGfromWinSIG.json -o helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s/<rgName>/$sigResourceGroup/g" helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s/<imageDefName>/$imageDefName/g" helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s/<sharedImageGalName>/$sigName/g" helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s%<sigDefImgVersionId>%$sigDefImgVersionId%g" helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s/<region1>/$location/g" helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s/<region2>/$additionalregion/g" helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s/<runOutputName>/$runOutputName/g" helloImageTemplateforSIGfromWinSIG.json
    sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateforSIGfromWinSIG.json
    

创建映像

  1. 将映像配置提交到 VM 映像生成器服务:

    az resource create \
        --resource-group $sigResourceGroup \
        --location $location \
        --properties @helloImageTemplateforSIGfromWinSIG.json \
        --is-full-object \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n imageTemplateforSIGfromWinSIG01
    
  2. 启动映像生成:

    az resource invoke-action \
        --resource-group $sigResourceGroup \
        --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
        -n imageTemplateforSIGfromWinSIG01 \
        --action Run 
    

等待生成和复制映像后,然后再进行下一步。

创建 VM

通过执行以下操作来创建 VM:

az vm create \
--resource-group $sigResourceGroup \
--name aibImgWinVm002 \
--admin-username $username \
--admin-password $vmpassword \
--image "/subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/latest" \
--location $location

验证自定义

使用创建 VM 时设置的用户名和密码创建与 VM 的远程桌面连接。 在 VM 中,打开命令提示符窗口,然后运行:

dir c:\

现在你应看到两个目录:

  • buildActions:在第一个映像版本中创建的。
  • buildActions2:在更新第一个映像版本以创建第二个映像版本时创建的。

后续步骤

要详细了解本文中使用的 JSON 文件的组件,请参阅创建 Azure VM 映像生成器模板