Compartilhar via


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

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

Este artigo mostra como usar o Construtor de Imagens do Azure e a CLI do Azure para criar uma versão de imagem em uma Galeria de Computação do Azure (previamente chamada de Galeria de Imagens Compartilhadas) e distribuir a imagem globalmente. Faça isso também com o Azure PowerShell.

Usaremos um modelo .json de exemplo para configurar a imagem. O arquivo .json que estamos usando está aqui: 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 do Azure, você precisa registrar o recurso.

Verifique seu registro.

az provider show -n Microsoft.VirtualMachineImages | grep registrationState
az provider show -n Microsoft.KeyVault | grep registrationState
az provider show -n Microsoft.Compute | grep registrationState
az provider show -n Microsoft.Storage | grep registrationState
az provider show -n Microsoft.Network | grep registrationState
az provider show -n Microsoft.ContainerInstance | grep registrationState

Caso o status não seja mostrado como registrado, execute o seguinte:

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

Usaremos algumas informações repetidamente, ou seja, vamos criar algumas variáveis para armazená-las.

O Construtor de Imagens é compatível somente com a criação de imagens personalizadas no mesmo grupo de recursos da imagem gerenciada de origem. Atualize o nome do grupo de recursos neste exemplo para que seja o mesmo grupo de recursos da imagem gerenciada de origem.

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

Criar 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 usa a identidade do usuário fornecida para injetar a imagem na Galeria de Computação do Azure. Neste exemplo, você criará uma definição de função do Azure que tem as ações granulares a fim de distribuir a imagem para a galeria. A definição de função será então atribuída à identidade do usuário.

# create user assigned identity for image builder to access the storage account where the script is located
identityName=aibBuiUserId$(date +'%s')
az identity create -g $sigResourceGroup -n $identityName

# get identity id
imgBuilderCliId=$(az identity show -g $sigResourceGroup -n $identityName --query clientId -o tsv)

# get the user identity URI, needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$sigResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# this command will download an Azure role definition template, and update the template with the parameters 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 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 com uma Galeria de Computação do Azure, você precisa ter uma galeria de imagens e uma definição de imagem. O Construtor de Imagens não criará a galeria de imagens e a definição de imagem 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 18.04-LTS \
   --os-type Linux

Baixar e configurar o .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

Esta próxima parte criará a versão da imagem na galeria.

Envie a configuração de imagem para o serviço Construtor de Imagens 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

Criar a imagem e replicá-la para ambas as regiões pode levar algum tempo. Aguarde até que essa parte seja concluída antes de passar para a criação de uma VM.

Criar a VM

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

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" \
  --generate-ssh-keys

Execute o SSH na VM.

ssh aibuser@<publicIpAddress>

Você deve ver que a imagem foi personalizada com uma Mensagem do Dia assim que a conexão SSH é estabelecida.

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

Limpar os recursos

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

Isso excluirá a imagem criada, junto com todos os outros arquivos de recurso. Verifique se você concluiu essa implantação antes de excluir os recursos.

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

Exclua o modelo do Construtor de Imagens.

az resource delete \
    --resource-group $sigResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateforSIG01

Excluir 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

Obtenha a versão da imagem criada pelo Construtor de Imagens, que sempre começa com 0., e exclua a versão da imagem

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

Exclua a definição da imagem.

az sig image-definition delete \
   -g $sigResourceGroup \
   --gallery-name $sigName \
   --gallery-image-definition $imageDefName \
   --subscription $subscriptionID

Exclua a galeria.

az sig delete -r $sigName -g $sigResourceGroup

Exclua o grupo de recursos.

az group delete -n $sigResourceGroup -y

Próximas etapas

Saiba mais sobre as Galerias de Computação do Azure.