如何使用 Azure Image Builder 觸發程式啟用自動建立映像
您可以使用 Azure Image Builder (AIB) 中的觸發程式,在組建管線中符合特定準則時啟用自動建立映像。
重要
請注意,每個區域允許的觸發程序數目有限制,特別是每個訂用帳戶每個區域 100 個。
注意
目前,我們只支援為新的來源映像設定觸發程序,但我們預期未來會支援不同類型的觸發程序。
注意
為避免不必要的建置失敗,如果映像範本組建連續多次失敗(手動或自動觸發),則透過觸發程式自動建立映像將會停用。 您仍然可以手動建置映像範本,一旦手動建置成功,就會重新啟用自動觸發程式。
必要條件
設定第一個觸發程序之前,請確定您使用的是 Azure Image Builder API 版本 2022-07-01。
如何在 Azure Image Builder 中設定觸發程序
註冊提供者
若要搭配觸發程序使用 VM Image Builder,您必須註冊下列提供者。 執行下列命令來檢查您的註冊:
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 Image Builder 組建 VM)。 在此範例中,我們會建立具有「參與者」存取權的受控識別,但只要包含 Azure Image Builder 服務正常運作所需的權限,就可以精簡指派給受控識別的權限或角色。
如需 Azure Image Builder 服務所需權限的詳細資訊,請參閱下列文件: 使用 Azure CLI 設定 Azure VM Image Builder 權限
如需如何在 Azure Image Builder 中指派和使用受控識別的詳細資訊,請參閱下列文件: VM Image Builder 範本參考: 身分識別
使用下列命令來建立將用於映像範本的受控識別:
# 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
建立資源庫和映像定義
若要搭配使用 Azure Compute Gallery 和 VM Image Builder,您需要有現有的資源庫和映像定義。 VM Image Builder 不會為您建立資源庫和映像定義。
如果您尚未有可用的映像庫和映像定義,請先建立。
首先,建立資源庫:
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 計算資源庫中有新的映射版本時啟用自動映像建立,您可以將來源變更為 Azure 計算資源庫映像。
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 映像,必須將具有版本名稱的資源識別碼最後一個部分設定為Latest
。 - 如果您將映像散發至 Azure Compute Gallery,則無法指定版本。 版本會自動遞增。
- 當來源設定為 Azure Compute Gallery 映像,而散發會設定為 Azure Compute Gallery 時,來源資源庫映像和散發資源庫映像不能相同。 來源資源庫映像和散發資源庫映像的 Azure Compute Gallery 映像定義標識碼不能相同。
- 映像範本應該在
provisioningState
中有「成功」,這表示範本已建立而沒有任何問題。 如果未成功佈建範本,您將無法建立觸發程序。
設定範本之後,請使用下列命令將映像設定提交至 Azure Image Builder 服務:
az image builder create -g $resourceGroupName -n $imageTemplateName --image-template helloImageTemplateforTriggers.json
您可以使用下列命令來檢查,以確定已成功建立映像範本:
az image builder show --name $imageTemplateName --resource-group $resourceGroupName
注意
執行上述 provisioningState
命令時,應該會顯示 「成功」,這表示範本已建立而沒有任何問題。 provisioningState
如果沒有說成功,您將無法使用映像範本來建立觸發程序。
建立來源觸發程序
下載範例觸發程序範本,並使用您的變數進行設定。 下列觸發程序會在每次更新來源映像時,啟動新的映像組建。
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
下一步
如需詳細資訊,請參閱 Image Builder 範本參考。