你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何使用 Azure 映像生成器触发器设置自动映像生成

可以使用 Azure 映像生成器 (AIB) 中的触发器来设置在生成管道满足某些条件时自动生成映像。

重要

请注意,每个区域允许的触发器数量存在限制,具体来讲,每个订阅每个区域 100 个触发器。

注意

目前,我们仅支持为新的源映像设置触发器,但预计将来会支持不同种类的触发器。

先决条件

在设置第一个触发器之前,请确保使用的是 Azure 映像生成器 API 版本 2022-07-01。

如何在 Azure 映像生成器中设置触发器

注册提供程序

若要使用带触发器的 VM 映像生成器,需要注册以下提供程序。 运行以下命令来检查注册:

az provider show -n Microsoft.VirtualMachineImages -o json | grep registrationState
az provider show -n Microsoft.KeyVault -o json | grep registrationState
az provider show -n Microsoft.Compute -o json | grep registrationState
az provider show -n Microsoft.Storage -o json | grep registrationState
az provider show -n Microsoft.Network -o json | grep registrationState
az provider show -n Microsoft.ContainerInstance -o json | grep registrationState

如果输出未显示“已注册”,请运行以下命令:

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

注册自动映像生成触发器功能:

az feature register --namespace Microsoft.VirtualMachineImages --name Triggers

设置变量

首先,需要设置一些在命令中重复使用的变量。

# Resource group name - ibTriggersTestRG in this example
resourceGroupName=ibTriggersRG
# Datacenter location - West US 2 in this example
location=westus2
# Additional region to replicate the image to - East US in this example
additionalregion=eastus2
# Name of the Azure Compute Gallery - ibTriggersGallery in this example
acgName=ibTriggersGallery
# Name of the image definition to be created - ibTriggersImageDef in this example
imageDefName=ibTriggersImageDef
# Name of the Trigger to be created - ibTrigger in this example
ibTriggerName=ibTrigger
# Name of the image template to be created - ibTriggersImageTemplate in this example
imageTemplateName=ibTriggersImageTemplate
# Reference name in the image distribution metadata
runOutputName=ibTriggersTestRun
# Create a variable for your subscription ID
subscriptionID=$(az account show --query id --output tsv)

创建资源组

现在,需要创建一个资源组,可在其中存储映像模板。 运行以下命令创建资源组:

az group create -n $resourceGroupName -l $location

为服务创建托管标识

还需要创建一个托管标识,该标识将用于映像模板(并可能用于 Azure 映像生成器生成 VM)。 在此示例中,我们将创建具有“参与者”访问权限的托管标识,但你可以根据需要优化分配给托管标识的权限或角色,只要包含 Azure 映像生成器服务正常运行所需的权限即可。

有关 Azure 映像生成器服务所需的权限的详细信息,请参阅以下文档:使用 Azure CLI 配置 Azure VM 映像生成器权限

有关如何在 Azure 映像生成器中分配和使用托管标识的详细信息,请参阅以下文档:VM 映像生成器模板参考:标识

使用以下命令创建将用于映像模板的托管标识:

# Create user-assigned identity for VM Image Builder to access the storage account where the script is stored
identityName=aibBuiUserId$(date +'%s')
az identity create -g $resourceGroupName -n $identityName

# Get the identity client and principal ID
imgBuilderCliId=$(az identity show -g $resourceGroupName -n $identityName --query clientId -o tsv)

# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# Grant "Contributor" access to the user-assigned identity
az role assignment create \
    --assignee $imgBuilderCliId \
    --role "Contributor" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$resourceGroupName

若要将 VM 映像生成器与 Azure Compute Gallery 配合使用,需要现有的库和映像定义。 VM 映像生成器不会创建库和映像定义。

如果还没有可使用的库和映像定义,请先创建它们。

首先,创建库:

az sig create \
    -g $resourceGroupName \
    --gallery-name $acgName

然后,创建映像定义:

az sig image-definition create \
   -g $resourceGroupName \
   --gallery-name $acgName \
   --gallery-image-definition $imageDefName \
   --publisher myIbPublisher \
   --offer myOffer \
   --sku 18.04-LTS \
   --os-type Linux

创建映像模板

下载示例 JSON 模板,并使用自己的变量对它进行配置。 以下映像模板使用平台映像作为其源,但如果你想要设置在 Azure Compute Gallery 中有新映像版本时就自动生成映像,则可以将源更改为 Azure Compute Gallery 映像。

curl https://raw.githubusercontent.com/Azure/azvmimagebuilder/main/quickquickstarts/9_Setting_up_a_Trigger_with_a_Custom_Linux_Image/helloImageTemplate.json -o helloImageTemplateforTriggers.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateforTriggers.json
sed -i -e "s/<rgName>/$resourceGroupName/g" helloImageTemplateforTriggers.json
sed -i -e "s/<imageDefName>/$imageDefName/g" helloImageTemplateforTriggers.json
sed -i -e "s/<acgName>/$acgName/g" helloImageTemplateforTriggers.json
sed -i -e "s/<region1>/$location/g" helloImageTemplateforTriggers.json
sed -i -e "s/<region2>/$additionalregion/g" helloImageTemplateforTriggers.json
sed -i -e "s/<runOutputName>/$runOutputName/g" helloImageTemplateforTriggers.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateforTriggers.json

映像模板要求:

  • source 必须是平台映像或 Azure Compute Gallery 映像(目前仅允许这两个源)
  • 如果使用平台映像,则源中的版本需要为 Latest。 对于 Azure Compute Gallery 映像,需要将具有版本名称的资源 ID 的最后部分设置为 Latest
  • 如果要将映像分发到 Azure Compute Gallery,则无法指定版本。 版本会自动递增。
  • 将源设置为 Azure Compute Gallery 映像并将分发设置为 Azure Compute Gallery 时,源库映像和分发库映像不能相同。 源库映像和分发库映像的 Azure Compute Gallery 映像定义 ID 不能相同。
  • 映像模板在 provisioningState 中应当具有“Succeeded”,这意味着创建模板时没有任何问题。 如果未成功预配模板,将无法创建触发器。

配置模板后,使用以下命令将映像配置提交到 Azure 映像生成器服务:

az image builder create -g $resourceGroupName -n $imageTemplateName --image-template helloImageTemplateforTriggers.json

可以使用以下命令进行检查,以确保已成功创建映像模板:

az image builder show --name $imageTemplateName --resource-group $resourceGroupName

注意

运行上述命令时,provisioningState 应显示为“Succeeded”,这意味着创建模板时没有任何问题。 如果 provisioningState 未显示为“Succeeded”,则无法使用映像模板创建触发器。

创建源触发器

下载示例触发器模板,并使用自己的变量对它进行配置。 以下触发器在源映像发生更新时就开始生成新的映像。

curl https://raw.githubusercontent.com/kof-f/azvmimagebuilder/main/quickquickstarts/9_Setting_up_a_Trigger_with_a_Custom_Linux_Image/trigger.json -o trigger.json
sed -i -e "s/<region1>/$location/g" trigger.json

触发器要求:

  • 触发器中的位置需要与映像模板中的位置相同。 这是 az resource create cmdlet 的要求。
  • 我们目前支持触发器的一个 kind,即“SourceImage”
  • 仅支持每个映像一个“SourceImage”触发器。 如果映像上已有“SourceImage”触发器,则无法创建新的触发器。
  • 无法将 kind 字段更新为其他类型的触发器。 必须删除触发器并重新创建它,或使用相应的配置创建另一个触发器。

使用以下命令将触发器添加到资源组。

az image builder trigger create --name $ibTriggerName --resource-group $resourceGroupName --image-template-name $imageTemplateName --kind SourceImage

还可以使用以下命令检查是否已成功创建触发器:

az image builder trigger show --name $ibTriggerName --image-template-name $imageTemplateName --resource-group $resourceGroupName

注意

运行上述命令时,provisioningState 应显示为 Succeeded,这意味着创建模板时没有任何问题。 在 status 中,代码应显示为 Healthy,消息应显示为 Trigger is active.

清理资源

删除触发器

使用以下命令删除触发器:

az image builder trigger delete --name $ibTriggerName --image-template-name $imageTemplateName --resource-group $resourceGroupName

删除映像模板

使用以下命令删除映像模板:

az image builder delete --name $imageTemplateName --resource-group $resourceGroupName

后续步骤

有关详细信息,请查看映像生成器模板参考