Crie uma imagem do Linux e distribua-a para uma Galeria de Computação do Azure usando a CLI do Azure

Aplica-se a: ✔️ VMs do Linux ✔️ Conjuntos de dimensionamento flexíveis

Este artigo mostra como 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 (antiga Galeria de Imagens Compartilhadas) e distribuir a imagem globalmente. Você também pode criar uma versão da 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 a uma Galeria de Computação do Azure, o modelo usa sharedImage como o valor da seção distribute do modelo.

Registrar os provedores

Para usar o Construtor de Imagens de VM, é preciso registrar os provedores. Verifique seu registro 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

Caso não conste como registrado, execute o seguinte comando:

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 armazená-las.

O Construtor de Imagens de VM é compatível com a criação de imagens personalizadas apenas no mesmo grupo de recursos da imagem gerenciada de origem. No exemplo a seguir, atualize o nome do grupo de recursos para que seja o mesmo grupo de recursos da imagem gerenciada de origem.

# 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 a ID da assinatura:

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 do usuário fornecida para injetar a imagem em uma Galeria de Computação do Azure. Neste exemplo, você cria uma definição de regra do Azure com ações específicas para distribuir a imagem. A definição de função será 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 definição de imagem e de galeria. O Construtor de Imagens de VM cria a definição de imagem e de galeria para você.

Se você ainda não tiver uma definição de imagem e a definição de galeria para usar, comece criando-as.

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ê criará a versão da imagem na galeria.

Envie a configuração da imagem ao serviço Construtor de Imagens de VM do Azure:

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

Inicie o build da imagem:

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

Pode levar alguns instantes para criar e replicar imagem para ambas as regiões. Aguarde a conclusão dessa tarefa para passar à criação de uma VM.

Criar a VM

Crie uma VM com base na versão da imagem criada pelo Construtor de Imagens de VM.

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 com o SSH (Secure Shell):

ssh aibuser@<publicIpAddress>

Logo que a conexão SSH é estabelecida, você deve 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

Observação

Caso deseje tentar personalizar novamente a versão da imagem para criar uma nova versão dessa mesma imagem, ignore as próximas etapas e acesse Usar o Construtor de Imagens de VM para criar outra versão de imagem.

Se os recursos criados não forem mais necessários na sequência do processo descrito neste artigo, você pode excluí-los com o procedimento a seguir.

Esse processo exclui a imagem que você criou e todos os outros arquivos de recurso. Verifique se você concluiu essa implantação antes de excluir os recursos.

Antes de excluir os recursos da galeria, exclua todas as versões da imagem, para poder excluir a definição de imagem usada para criá-las. Para excluir uma galeria, primeiro você precisará excluir todas as definições de imagem ali contidas.

  1. Exclua o modelo do Construtor de Imagens de 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 criada pelo Construtor de Imagens de VM (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óximas etapas

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