Image erstellen und mit einer benutzerseitig zugewiesenen verwalteten Identität auf Dateien in Azure Storage zugreifen
Gilt für: ✔️ Linux-VMs ✔️ Flexible Skalierungsgruppen
In diesem Artikel erfahren Sie, wie Sie mit dem Azure VM Image Builder ein benutzerdefiniertes Image erstellen. Der Dienst verwendet eine benutzerseitig zugewiesene verwaltete Identität für den Zugriff auf Dateien in einem Azure-Speicherkonto, und er kann den nicht authentifizierten Zugriff auf das Speicherkonto blockieren.
Azure VM Image Builder unterstützt die Verwendung von Skripts und das Kopieren von Dateien aus GitHub, Azure-Speicherkonten und anderen Speicherorten. Diese Speicherorte müssen allerdings für den VM Image Builder extern zugänglich sein.
Im folgenden Beispiel erstellen Sie zwei Ressourcengruppen: eine wird für das benutzerdefinierte Image verwendet, die andere hostet das Azure-Speicherkonto, das eine Skriptdatei enthält. Dadurch wird realitätsnah ein Szenario simuliert, in dem Sie Artefakte oder Imagedateien in verschiedenen Speicherkonten erstellt haben. Sie erstellen eine benutzerseitig zugewiesene Identität und erteilen dann die Berechtigungen zum Lesen der Identität in der Skriptdatei, erlauben aber keinen öffentlichen Zugriff auf die Datei. Anschließend verwenden Sie die Shellanpassung, um das Skript aus dem Speicherkonto herunterzuladen und auszuführen.
Erstellen einer Ressourcengruppe
Da Sie einige Informationen wiederholt verwenden werden, erstellen Sie einige Variablen, um diese Informationen zu speichern.
# Image resource group name imageResourceGroup=aibmdimsi # Storage resource group strResourceGroup=aibmdimsistor # Location location=WestUS2 # Name of the image to be created imageName=aibCustLinuxImgMsi01 # Image distribution metadata reference name runOutputName=u1804ManImgMsiro
Erstellen Sie eine Variable für Ihre Abonnement-ID:
subscriptionID=$(az account show --query id --output tsv)
Erstellen Sie die Ressourcengruppen für das Image und das Speichern des Skripts:
# Create a resource group for the image template az group create -n $imageResourceGroup -l $location # Create a resource group for the script storage az group create -n $strResourceGroup -l $location
Erstellen Sie eine benutzerseitig zugewiesene Identität und legen Berechtigungen für die Ressourcengruppe fest:
VM Image Builder verwendet die angegebene Benutzeridentität, um das Image in die Ressourcengruppe einzufügen. In diesem Beispiel erstellen Sie eine Azure-Rollendefinition mit spezifischen Aktionen für die Verteilung des Images. Die Rollendefinition wird dann der Benutzeridentität zugewiesen.
# Create a user-assigned identity for VM Image Builder to access the storage account where the script is located identityName=aibBuiUserId$(date +'%s') az identity create -g $imageResourceGroup -n $identityName # Get an identity ID imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv) # Get the user-identity URI, which is needed for the template imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName # Download the preconfigured role definition example curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json # Update the definition sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json sed -i -e "s/<rgName>/$imageResourceGroup/g" aibRoleImageCreation.json # Create role definitions az role definition create --role-definition ./aibRoleImageCreation.json # Grant the role definition to the user-assigned identity az role assignment create \ --assignee $imgBuilderCliId \ --role "Azure Image Builder Service Image Creation Role" \ --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
Erstellen Sie das Speicherkonto, kopieren Sie das Beispielskript von GitHub und fügen Sie es ein:
# Script storage account scriptStorageAcc=aibstorscript$(date +'%s') # Script container scriptStorageAccContainer=scriptscont$(date +'%s') # Script URL scriptUrl=https://$scriptStorageAcc.blob.core.windows.net/$scriptStorageAccContainer/customizeScript.sh # Create the storage account and blob in the resource group az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS az storage container create -n $scriptStorageAccContainer --fail-on-exist --account-name $scriptStorageAcc # Copy in an example script from the GitHub repo az storage blob copy start \ --destination-blob customizeScript.sh \ --destination-container $scriptStorageAccContainer \ --account-name $scriptStorageAcc \ --source-uri https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/customizeScript.sh
Erteilen Sie Azure Image Builder die Berechtigung, Ressourcen in dieser Imageressourcengruppe zu erstellen. Der Wert
--assignee
ist die Benutzeridentitäts-ID.az role assignment create \ --assignee $imgBuilderCliId \ --role "Storage Blob Data Reader" \ --scope /subscriptions/$subscriptionID/resourceGroups/$strResourceGroup/providers/Microsoft.Storage/storageAccounts/$scriptStorageAcc/blobServices/default/containers/$scriptStorageAccContainer
Anpassen des Beispiels
Laden Sie die JSON-Beispieldatei herunter und konfigurieren Sie sie mit den Variablen, die Sie zuvor erstellt haben.
curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/7_Creating_Custom_Image_using_MSI_to_Access_Storage/helloImageTemplateMsi.json -o helloImageTemplateMsi.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateMsi.json
sed -i -e "s/<rgName>/$imageResourceGroup/g" helloImageTemplateMsi.json
sed -i -e "s/<region>/$location/g" helloImageTemplateMsi.json
sed -i -e "s/<imageName>/$imageName/g" helloImageTemplateMsi.json
sed -i -e "s%<scriptUrl>%$scriptUrl%g" helloImageTemplateMsi.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateMsi.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateMsi.json
Erstellen des Images
Senden Sie die Imagekonfiguration an den VM-Image Builder-Dienst.
az resource create \ --resource-group $imageResourceGroup \ --properties @helloImageTemplateMsi.json \ --is-full-object \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateMsi01
Starten Sie die Imageerstellung:
az resource invoke-action \ --resource-group $imageResourceGroup \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateMsi01 \ --action Run
Es kann etwa 15 Minuten dauern, bis das Kompilieren abgeschlossen ist.
Erstellen einer VM
Erstellen Sie eine VM aus dem Image:
az vm create \ --resource-group $imageResourceGroup \ --name aibImgVm00 \ --admin-username aibuser \ --image $imageName \ --location $location \ --generate-ssh-keys
Erstellen Sie die VM und starten Sie dann eine SSH-Sitzung.
ssh aibuser@<publicIp>
Sobald die SSH-Verbindung hergestellt wurde, sollten Sie eine „Nachricht des Tages“ erhalten, dass das Image angepasst wurde.
*******************************************************
** This VM was built from the: **
** !! AZURE VM IMAGE BUILDER Custom Image !! **
** You have just been Customized :-) **
*******************************************************
Bereinigen von Ressourcen
Wenn Sie die Ressourcen, die während dieses Vorgangs erstellt wurden, nicht mehr benötigen, können Sie sie mit dem folgenden Code löschen:
az role definition delete --name "$imageRoleDefName"
```azurecli-interactive
az role assignment delete \
--assignee $imgBuilderCliId \
--role "$imageRoleDefName" \
--scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
az identity delete --ids $imgBuilderId
az resource delete \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n helloImageTemplateMsi01
az group delete -n $imageResourceGroup
az group delete -n $strResourceGroup
Nächste Schritte
Falls bei der Verwendung des VM Image Builder Probleme auftreten, lesen Sie den Artikel Problembehandlung beim Azure VM Image Builder.