你当前正在访问 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
后续步骤
有关详细信息,请查看映像生成器模板参考。