Creare un'immagine e usare un'identità gestita assegnata dall'utente per accedere ai file in un account di archiviazione di Azure
Si applica a: ✔️ macchine virtuali di Linux ✔️ set di scalabilità flessibili
Questo articolo illustra come creare un'immagine personalizzata usando Image Builder di macchine virtuali di Azure. Il servizio usa un'identità gestita assegnata dall'utente per accedere ai file in un account di archiviazione di Azure e può ottenere il blocco dell'accesso non autenticato all'account di archiviazione.
Image Builder di macchine virtuali di Azure supporta l'uso di script e la copia di file da GitHub, account di archiviazione di Azure e altre posizioni. Per usare i percorsi, è necessario che siano accessibili esternamente a Image Builder della macchina virtuale.
Nell'esempio seguente verranno creati due gruppi di risorse, uno per l'immagine personalizzata e l'altro per ospitare un account di archiviazione di Azure che contiene un file di script. Questo esempio simula uno scenario reale, in cui potrebbero essere presenti artefatti di compilazione o file di immagine in vari account di archiviazione. Si creerà un'identità assegnata dall'utente e si concederanno le autorizzazioni di lettura dell'identità per il file di script, ma non si consentirà l'accesso pubblico al file. Si userà quindi la funzione di personalizzazione della shell per scaricare ed eseguire uno script dall'account di archiviazione.
Creare un gruppo di risorse
Poiché si useranno ripetutamente alcune informazioni, creare alcune variabili per archiviare tali informazioni.
# 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
Creare una variabile per l'ID di sottoscrizione:
subscriptionID=$(az account show --query id --output tsv)
Creare gruppi di risorse sia per l'immagine che per l'archiviazione di script:
# 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
Creare un'identità assegnata dall'utente e impostare autorizzazioni per il gruppo di risorse:
VM Image Builder usa l'identità utente fornita per inserire l'immagine nel gruppo di risorse. In questo esempio viene creata una definizione di ruolo di Azure con azioni specifiche per la distribuzione dell'immagine. La definizione del ruolo viene quindi assegnata all'identità utente.
# 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
Creare l'account di archiviazione e copiarlo da GitHub:
# 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
Concedere a Image Builder di macchine virtuali l'autorizzazione per creare risorse nel gruppo di risorse immagine. Il valore
--assignee
è l'ID identità utente.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
Modificare l'esempio
Scaricare il file JSON di esempio e configurarlo con le variabili create in precedenza.
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
Creare l'immagine
Inviare la configurazione dell'immagine al servizio Image Builder per macchine virtuali:
az resource create \ --resource-group $imageResourceGroup \ --properties @helloImageTemplateMsi.json \ --is-full-object \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateMsi01
Avviare la compilazione dell'immagine:
az resource invoke-action \ --resource-group $imageResourceGroup \ --resource-type Microsoft.VirtualMachineImages/imageTemplates \ -n helloImageTemplateMsi01 \ --action Run
Il completamento della compilazione può richiedere circa 15 minuti.
Creare una VM
Creare una macchina virtuale dall'immagine:
az vm create \ --resource-group $imageResourceGroup \ --name aibImgVm00 \ --admin-username aibuser \ --image $imageName \ --location $location \ --generate-ssh-keys
Dopo aver creato la macchina virtuale, avviare una sessione Ssh (Secure Shell).
ssh aibuser@<publicIp>
Dopo aver stabilito la connessione SSH, si dovrebbe ricevere un messaggio "Messaggio del giorno" che informa che l'immagine è stata personalizzata:
*******************************************************
** This VM was built from the: **
** !! AZURE VM IMAGE BUILDER Custom Image !! **
** You have just been Customized :-) **
*******************************************************
Pulire le risorse
Se non sono più necessarie le risorse create durante questo processo, è possibile eliminarle eseguendo il codice seguente:
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
Passaggi successivi
Se si verificano problemi durante l'uso di Image Builder di macchine virtuali, vedere Risolvere i problemi di Image Builder di macchine virtuali di Azure.