Создание образа Linux и его распространение в Коллекции вычислений Azure

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

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

Мы будем использовать пример шаблона JSON для настройки образа. Здесь используется JSON-файл: helloImageTemplateforSIG.json.

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

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

Чтобы использовать Конструктор образов Azure, необходимо зарегистрировать этот компонент.

Проверьте свою регистрацию.

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

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

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

Настройка переменных и разрешений

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

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

# 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

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

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

Создание группы ресурсов.

az group create -n $sigResourceGroup -l $location

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

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

# 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

Чтобы использовать Конструктор образов с Коллекцией вычислений 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 18.04-LTS \
   --os-type Linux

Скачивание и настройка 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

Создание версии образа

В следующей части будет создана версия образа в коллекции.

Отправьте конфигурацию образа в службу "Конструктор образов 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

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

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

Создайте виртуальную машину на основе версии образа, созданной Конструктором образов 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

Подключитесь к виртуальной машине по протоколу SSH.

ssh aibuser@<publicIpAddress>

Вы увидите, что для образа настроено сообщение дня, как только SSH-подключение будет установлено.

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

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

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

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

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

Удалите шаблон конструктора образов.

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

Удалите назначения разрешений, роли и удостоверение.

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

az role definition delete --name "$imageRoleDefName"

az identity delete --ids $imgBuilderId

Получите версию образа (всегда начинается с префикса 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

Удалите определение образа.

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

Удалите коллекцию.

az sig delete -r $sigName -g $sigResourceGroup

Удалите ее.

az group delete -n $sigResourceGroup -y

Следующие шаги

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