Создание образа Linux и его распространение в коллекцию вычислений Azure с помощью Azure CLI

Область применения: ✔️ Виртуальные машины Linux ✔️ Гибкие масштабируемые наборы

Из этой статьи вы узнаете, как использовать построитель образов виртуальных машин Azure и Azure CLI для создания версии образа в коллекции вычислений Azure (прежнее название — общая коллекция образов) и глобального распространения образа. Вы также можете создать версию образа с помощью Azure PowerShell.

В этой статье используется пример шаблона JSON для настройки образа. JSON-файл находится в helloImageTemplateforSIG.json.

Для распространения образа в Галерею вычислений Azure шаблон использует sharedImage в качестве значения для distribute раздела шаблона.

Регистрация поставщиков

Чтобы использовать построитель образов виртуальных машин (VM Image Builder), необходимо зарегистрировать поставщиков. Проверьте регистрацию, выполнив следующие команды:

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

Если выходные данные не говорят зарегистрированы, выполните следующие команды:

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

Настройка переменных и прав доступа

Так как вы будете использовать некоторые фрагменты информации неоднократно, создайте некоторые переменные для хранения этих сведений.

VM Image Builder (Построитель образов ВМ) поддерживает создание пользовательских образов только в той же группе ресурсов, в которой находится исходный управляемый образ. В следующем примере обновите имя группы ресурсов, чтобы она была той же группой ресурсов, что и образ, управляемый источником.

# 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

Создайте переменную для идентификатора подписки:

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

Создайте группу ресурсов:

az group create -n $sigResourceGroup -l $location

Создайте идентичность, назначаемую пользователем, и установите разрешения для группы ресурсов

Построитель образов виртуальных машин использует предоставленное удостоверение пользователя для внедрения образа в коллекцию вычислений Azure. В этом примере вы создадите определение роли Azure с определенными действиями для распространения образа. Затем определение роли назначается идентификации пользователя.

Успех следующей команды зависит от распространения RBAC, что может занять до 30 минут в некоторых случаях. Подождите около 5 минут до выполнения команды и повторите попытку после задержки, если возникает ошибка.

# 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. The success of the following command relies on RBAC propagation, which can take up to ~30 minutes.  Wait about 5 minutes before running the command and wait a few more minutes before retrying if you get an error.  

az role assignment create \
    --assignee $imgBuilderCliId \
    --role "$imageRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup

Чтобы использовать конструктор образов виртуальных машин с коллекцией вычислений Azure, необходимо иметь существующую коллекцию и определение образа. Сборщик образов виртуальных машин не создаёт галерею и определение образа для вас.

Если у вас еще нет коллекции и определения изображений, сначала создайте их.

Сначала создайте коллекцию:

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

Затем создайте определение изображения:

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

Скачивание и настройка JSON-файла

Скачайте шаблон JSON и настройте его с помощью переменных:

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
sed -i -e "s/sudo mkdir/sleep 300;sudo mkdir/g" helloImageTemplateforSIG.json

Создайте версию образа

В этом разделе вы создадите образ в галерее.

Отправьте конфигурацию образа в службу построителя образов виртуальных машин Azure:

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

Запустите сборку образа:

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

Для создания образа и его репликации в обоих регионах может потребоваться несколько минут. Дождитесь завершения работы этой части, прежде чем перейти к созданию виртуальной машины.

Создание виртуальной машины

Создайте виртуальную машину из версии образа, созданной построителем образов виртуальных машин.

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

Подключитесь к виртуальной машине через Secure Shell (SSH):

ssh aibuser@<publicIpAddress>

После установки подключения SSH вы увидите, что изображение было настроено с предварительно заданным сообщением дня:

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

Очистка ресурсов

Замечание

Если вы хотите перенастроить версию образа, чтобы создать новую версию того же образа, пропустите шаг, описанный здесь , и перейдите к использованию построителя образов виртуальной машины для создания другой версии образа.

Если вам больше не нужны ресурсы, созданные по мере выполнения процесса в этой статье, их можно удалить, выполнив указанные ниже действия.

Этот процесс удаляет как созданный образ, так и все другие файлы ресурсов. Перед удалением ресурсов убедитесь, что вы завершили это развертывание.

При удалении ресурсов коллекции необходимо удалить все версии образа, прежде чем удалить определение образа, которое использовалось для их создания. Чтобы удалить коллекцию, сначала необходимо удалить все определения изображений в коллекции.

  1. Удалите шаблон построителя образов виртуальных машин.

    az resource delete \
        --resource-group $sigResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateforSIG01
    
  2. Удалить назначения разрешений, роли и идентификацию.

    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. Получите версию образа, созданную построителем образов виртуальной машины (она всегда начинается с 0.), а затем удалите ее.

    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. Удалите определение изображения.

    az sig image-definition delete \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  5. Удалите коллекцию.

    az sig delete -r $sigName -g $sigResourceGroup
    
  6. Удалите группу ресурсов.

    az group delete -n $sigResourceGroup -y
    

Дальнейшие действия

Дополнительные сведения о коллекции вычислений Azure.