Share via


如何使用 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 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 映像,必須將具有版本名稱的資源識別碼最後一個部分設定為 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 範本參考