Criar uma imagem do Linux e distribuí-la para uma Galeria de Computação do Azure usando a CLI do Azure

Aplica-se a: ✔️ Linux VMs ✔️ Conjuntos de escala flexível

Neste artigo, você aprenderá a usar o Construtor de Imagens de VM do Azure e a CLI do Azure para criar uma versão de imagem em uma Galeria de Computação do Azure (anteriormente Galeria de Imagens Compartilhadas) e, em seguida, distribuir a imagem globalmente. Você também pode criar uma versão de imagem usando o Azure PowerShell.

Este artigo usa um modelo JSON de exemplo para configurar a imagem. O arquivo JSON está em helloImageTemplateforSIG.json.

Para distribuir a imagem para uma Galeria de Computação do Azure, o modelo usa sharedImage como o valor para a distribute seção do modelo.

Registar os fornecedores

Para usar o VM Image Builder, você precisa registrar os provedores. Verifique o seu registo executando os seguintes comandos:

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

Se a saída não disser registrado, execute os seguintes comandos:

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

Definir variáveis e permissões

Como você usará algumas informações repetidamente, crie algumas variáveis para armazenar essas informações.

O VM Image Builder oferece suporte à criação de imagens personalizadas somente no mesmo grupo de recursos que a imagem gerenciada pela origem. No exemplo a seguir, atualize o nome do grupo de recursos para ser o mesmo grupo de recursos que a imagem gerenciada pela fonte.

# Resource group name - ibLinuxGalleryRG in this example
sigResourceGroup=ibLinuxGalleryRG
# Datacenter location - West US 2 in this example
location=westus2
# Additional region to replicate the image to - East US in this example
additionalregion=eastus
# Name of the Azure Compute Gallery - myGallery in this example
sigName=myIbGallery
# Name of the image definition to be created - myImageDef in this example
imageDefName=myIbImageDef
# Reference name in the image distribution metadata
runOutputName=aibLinuxSIG

Crie uma variável para o ID da sua subscrição:

subscriptionID=$(az account show --query id --output tsv)

Crie o grupo de recursos:

az group create -n $sigResourceGroup -l $location

Criar uma identidade atribuída pelo usuário e definir permissões no grupo de recursos

O Construtor de Imagens de VM usa a identidade de usuário fornecida para injetar a imagem em uma Galeria de Computação do Azure. Neste exemplo, você cria uma definição de função do Azure com ações específicas para distribuir a imagem. A definição de função é então atribuída à identidade do usuário.

# 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 $sigResourceGroup -n $identityName

# Get the identity ID
imgBuilderCliId=$(az identity show -g $sigResourceGroup -n $identityName --query clientId -o tsv)

# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$sigResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# Download an Azure role-definition template, and update the template with the parameters that were specified earlier
curl https://raw.githubusercontent.com/Azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json

imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')

# Update the definition
sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json
sed -i -e "s/<rgName>/$sigResourceGroup/g" aibRoleImageCreation.json
sed -i -e "s/Azure Image Builder Service Image Creation Role/$imageRoleDefName/g" aibRoleImageCreation.json

# Create role definitions
az role definition create --role-definition ./aibRoleImageCreation.json

# Grant a role definition to the user-assigned identity
az role assignment create \
    --assignee $imgBuilderCliId \
    --role "$imageRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup

Para usar o Construtor de Imagens de VM com a Galeria de Computação do Azure, você precisa ter uma galeria e uma definição de imagem existentes. O VM Image Builder não cria a definição de galeria e imagem para você.

Se ainda não tiver uma galeria e uma definição de imagem para usar, comece por criá-las.

Primeiro, crie uma galeria:

az sig create \
    -g $sigResourceGroup \
    --gallery-name $sigName

Em seguida, crie uma definição de imagem:

az sig image-definition create \
   -g $sigResourceGroup \
   --gallery-name $sigName \
   --gallery-image-definition $imageDefName \
   --publisher myIbPublisher \
   --offer myOffer \
   --sku 20_04-lts-gen2 \
   --os-type Linux \
   --hyper-v-generation V2 \
   --features SecurityType=TrustedLaunchSupported

Baixar e configurar o arquivo JSON

Baixe o modelo JSON e configure-o com suas variáveis:

curl https://raw.githubusercontent.com/Azure/azvmimagebuilder/master/quickquickstarts/1_Creating_a_Custom_Linux_Shared_Image_Gallery_Image/helloImageTemplateforSIG.json -o helloImageTemplateforSIG.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateforSIG.json
sed -i -e "s/<rgName>/$sigResourceGroup/g" helloImageTemplateforSIG.json
sed -i -e "s/<imageDefName>/$imageDefName/g" helloImageTemplateforSIG.json
sed -i -e "s/<sharedImageGalName>/$sigName/g" helloImageTemplateforSIG.json
sed -i -e "s/<region1>/$location/g" helloImageTemplateforSIG.json
sed -i -e "s/<region2>/$additionalregion/g" helloImageTemplateforSIG.json
sed -i -e "s/<runOutputName>/$runOutputName/g" helloImageTemplateforSIG.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateforSIG.json

Criar a versão da imagem

Nesta seção, você cria a versão da imagem na galeria.

Envie a configuração da imagem para o serviço Azure VM Image Builder:

az resource create \
    --resource-group $sigResourceGroup \
    --properties @helloImageTemplateforSIG.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateforSIG01

Inicie a construção da imagem:

az resource invoke-action \
     --resource-group $sigResourceGroup \
     --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
     -n helloImageTemplateforSIG01 \
     --action Run

Pode levar alguns momentos para criar a imagem e replicá-la para ambas as regiões. Aguarde até que esta parte esteja concluída antes de avançar para criar uma VM.

Criar a VM

Crie a VM a partir da versão da imagem que foi criada pelo VM Image Builder.

az vm create \
  --resource-group $sigResourceGroup \
  --name myAibGalleryVM \
  --admin-username aibuser \
  --location $location \
  --image "/subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/latest" \
  --security-type TrustedLaunch \
  --generate-ssh-keys

Conecte-se à VM via Secure Shell (SSH):

ssh aibuser@<publicIpAddress>

Assim que sua conexão SSH for estabelecida, você verá que a imagem foi personalizada com uma Mensagem do Dia:

*******************************************************
**            This VM was built from the:            **
**      !! AZURE VM IMAGE BUILDER Custom Image !!    **
**         You have just been Customized :-)         **
*******************************************************

Limpar os recursos

Nota

Se agora você quiser tentar repersonalizar a versão da imagem para criar uma nova versão da mesma imagem, ignore a etapa descrita aqui e vá para Usar o Construtor de Imagens de VM para criar outra versão da imagem.

Se você não precisar mais dos recursos que foram criados conforme seguiu o processo neste artigo, poderá excluí-los fazendo o seguinte.

Esse processo exclui a imagem que você criou e todos os outros arquivos de recurso. Certifique-se de que concluiu esta implementação antes de eliminar os recursos.

Ao excluir recursos da galeria, você precisa excluir todas as versões de imagem antes de excluir a definição de imagem que foi usada para criá-las. Para excluir uma galeria, primeiro você precisa ter excluído todas as definições de imagem na galeria.

  1. Exclua o modelo do Construtor de Imagens da VM.

    az resource delete \
        --resource-group $sigResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateforSIG01
    
  2. Exclua atribuições de permissões, funções e identidade.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. Obtenha a versão da imagem que foi criada pelo VM Image Builder (ela sempre começa com 0.) e exclua-a.

    sigDefImgVersion=$(az sig image-version list \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID --query [].'name' -o json | grep 0. | tr -d '"')
    az sig image-version delete \
    -g $sigResourceGroup \
    --gallery-image-version $sigDefImgVersion \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  4. Exclua a definição da imagem.

    az sig image-definition delete \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  5. Exclua a galeria.

    az sig delete -r $sigName -g $sigResourceGroup
    
  6. Exclua o grupo de recursos.

    az group delete -n $sigResourceGroup -y
    

Próximos passos

Saiba mais sobre a Galeria de Computação do Azure.