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
Criar uma definição de imagem e uma galeria
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.