Создание виртуальной машины Windows с помощью Конструктора образов виртуальных машин Azure

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

Из этой статьи вы узнаете, как создать настраиваемый образ Windows с помощью Конструктора образов виртуальных машин Azure. В примере, приведенном в этой статье, используются настройщики для настройки образа:

  • PowerShell (ScriptUri): скачивание и запуск сценария PowerShell.
  • Перезагрузка Windows: перезапуск виртуальной машины.
  • PowerShell (встроенная): выполнение определенной команды. В данном примере создается каталог на виртуальной машине с помощью mkdir c:\\buildActions.
  • Файл: копирование файла из GitHub на виртуальную машину. В этом примере файл index.md копируется в c:\buildArtifacts\index.html на виртуальной машине.
  • buildTimeoutInMinutes: указывает время сборки в минутах. Значение по умолчанию — 240 минут. Вы можете увеличить его, чтобы обеспечить более длительное выполнение. Минимальное допустимое значение составляет 6 минут. Значения менее 6 минут приведут к ошибкам.
  • vmProfile: указывает vmSize и свойства сети.
  • osDiskSizeGB: можно использовать для увеличения размера образа.
  • identity. Предоставляет удостоверение для Конструктора образов Azure для использования во время сборки.

Используйте следующий пример шаблона JSON для настройки образа: helloImageTemplateWin.json.

Примечание.

Пользователи Windows могут запускать следующие примеры Azure CLI в Azure Cloud Shell с помощью Bash.

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

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

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 -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

Задание переменных

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

# Resource group name - we're using myImageBuilderRG in this example
imageResourceGroup='myWinImgBuilderRG'
# Region location
location='WestUS2'
# Run output name
runOutputName='aibWindows'
# The name of the image to be created
imageName='aibWinImage'

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

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

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

Для хранения артефакта шаблона конфигурации образа и самого образа используйте следующую группу ресурсов.

az group create -n $imageResourceGroup -l $location

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

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

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

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

identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName

# Get the identity ID
imgBuilderCliId=$(az identity show -g $imageResourceGroup -n $identityName --query clientId -o tsv)

# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# Download the preconfigured role definition example
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>%$imageResourceGroup%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/$imageResourceGroup

Скачивание шаблона конфигурации образа

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

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/0_Creating_a_Custom_Windows_Managed_Image/helloImageTemplateWin.json -o helloImageTemplateWin.json

sed -i -e "s%<subscriptionID>%$subscriptionID%g" helloImageTemplateWin.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" helloImageTemplateWin.json
sed -i -e "s%<region>%$location%g" helloImageTemplateWin.json
sed -i -e "s%<imageName>%$imageName%g" helloImageTemplateWin.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateWin.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateWin.json

Этот пример можно изменить в терминале, используя текстовый редактор, например vi.

vi helloImageTemplateWin.json

Примечание.

Для исходного образа всегда указывайте версию. Невозможно указать latest в качестве версии.

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

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

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

az resource create \
    --resource-group $imageResourceGroup \
    --properties @helloImageTemplateWin.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

По завершении в консоли появится сообщение об успешном выполнении, а в Конструкторе образов виртуальной машины будет создан шаблон конфигурации Конструктора образов виртуальной машины в $imageResourceGroup. Чтобы просмотреть этот ресурс в группе ресурсов, перейдите к порталу Azure и включите опцию Отображать скрытые типы.

В фоновом режиме Конструктор образов виртуальных машин также создаст в вашей подписке промежуточную группу ресурсов. Эта группа ресурсов используется для создания образа в следующем формате: IT_<DestinationResourceGroup>_<TemplateName>.

Примечание.

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

Если служба сообщает об ошибке при отправке шаблона конфигурации образа, выполните следующие действия:

az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

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

Запустите процесс создания образа с помощью команды az resource invoke-action.

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

Дождитесь завершения сборки.

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

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

Создайте виртуальную машину с помощью полученного образа. В следующем коде замените <пароль> собственным паролем для aibuser на виртуальной машине.

az vm create \
  --resource-group $imageResourceGroup \
  --name aibImgWinVm00 \
  --admin-username aibuser \
  --admin-password <password> \
  --image $imageName \
  --location $location

Проверка настройки

Подключитесь к виртуальной машине через удаленный рабочий стол, используя имя пользователя и пароль, заданные при создании виртуальной машины. На виртуальной машине откройте окно командной строки и введите:

dir c:\

Во время настройки образа создаются следующие два каталога:

  • buildActions
  • buildArtifacts

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

По завершении удалите созданные ресурсы.

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

    az resource delete \
        --resource-group $imageResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateWin01
    
  2. Удалите назначение ролей, определение ролей и удостоверение пользователя.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. Удалите группу ресурсов образа.

    az group delete -n $imageResourceGroup
    

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

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