Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: ✔️ виртуальные машины Windows
Из этой статьи вы узнаете, как создать образ виртуального рабочего стола Azure с помощью следующих настроек:
- Настройка FSLogix
- Оптимизация виртуального рабочего стола Azure
- Установка Microsoft Teams
- Настройка перезапуска Windows
- Настройщик Центра обновления Windows
В статье описывается автоматизация настроек с помощью построителя образов виртуальных машин Azure. Затем вы можете распространить образ в коллекцию вычислений Azure (ранее общую коллекцию образов), где ее можно реплицировать в другие регионы, управлять масштабом и совместно использовать образ внутри организации и за ее пределами.
Чтобы упростить развертывание конфигурации построителя образов виртуальных машин, в нашем примере используется шаблон Azure Resource Manager с шаблоном построителя образов виртуальных машин, вложенным в него. Этот подход дает несколько дополнительных преимуществ, таких как переменные и входные данные параметров. Также можно передать параметры из командной строки.
Эта статья предназначена для упражнения копирования и вставки.
Замечание
Вы найдете скрипты для установки приложений на GitHub. Они доступны только для иллюстрации и тестирования. Не используйте их для рабочих нагрузок.
Советы по созданию образов Windows
Размер виртуальной машины: для Windows используйте
Standard_D2_v2
или больше. Размер по умолчанию — этоStandard_D1_v2
, который не подходит для Windows.В этой статье используются скрипты настройщика PowerShell. Используйте следующие параметры, или сборка перестанет отвечать:
"runElevated": true, "runAsSystem": true,
Рассмотрим пример.
{ "type": "PowerShell", "name": "installFSLogix", "runElevated": true, "runAsSystem": true, "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
Добавьте комментарии к коду: журнал сборки в среде создателя образов виртуальных машин (customization.log) является подробным. Если вы закомментируете скрипты с помощью "write-host", они будут отправлены в журналы, что должно упростить устранение неполадок.
write-host 'AIB Customization: Starting OS Optimizations script'
Коды выхода: программа создания образов виртуальных машин ожидает, что все скрипты возвращают код завершения
0
. Если вы используете ненулевой код выхода, построитель образов виртуальных машин завершает настройку и останавливает сборку. Если у вас есть сложные скрипты, добавьте инструментирование и генерируйте коды выхода, которые будут показаны в файле customization.log.Write-Host "Exit code: " $LASTEXITCODE
Тест. Тестирование и повторное тестирование кода на автономной виртуальной машине. Убедитесь, что пользователи не получают приглашений, что вы используете правильные права доступа и т. д.
Сетевое подключение:
Set-NetAdapterAdvancedProperty
установлен в скрипте оптимизации, но приводит к сбою построения образа виртуальной машины. Так как он отключает сеть, он закомментирован. Мы расследуем эту проблему.
Предпосылки
Необходимо установить самые свежие командлеты Azure PowerShell. Дополнительные сведения см. в статье "Обзор Azure PowerShell".
# Check to ensure that you're registered for the providers and RegistrationState is set to 'Registered'
Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
Get-AzResourceProvider -ProviderNamespace Microsoft.Storage
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute
Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault
Get-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance
# If they don't show as 'Registered', run the following commented-out code
## Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages
## Register-AzResourceProvider -ProviderNamespace Microsoft.Storage
## Register-AzResourceProvider -ProviderNamespace Microsoft.Compute
## Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault
## Register-AzResourceProvider -ProviderNamespace Microsoft.ContainerInstance
Настройка среды и переменных
# Step 1: Import module
Import-Module Az.Accounts
# Step 2: get existing context
$currentAzContext = Get-AzContext
# Destination image resource group
$imageResourceGroup="avdImageDemoRg"
# Location (see possible locations in the main docs)
$location="westus2"
# Your subscription. This command gets your current subscription
$subscriptionID=$currentAzContext.Subscription.Id
# Image template name
$imageTemplateName="avd10ImageTemplate01"
# Distribution properties object name (runOutput). Gives you the properties of the managed image on completion
$runOutputName="sigOutput"
# Create resource group
New-AzResourceGroup -Name $imageResourceGroup -Location $location
Разрешения, удостоверение пользователя и роль
Создайте удостоверение пользователя.
# setup role def names, these need to be unique $timeInt=$(get-date -UFormat "%s") $imageRoleDefName="Azure Image Builder Image Def"+$timeInt $identityName="aibIdentity"+$timeInt ## Add Azure PowerShell modules to support AzUserAssignedIdentity and Azure VM Image Builder 'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease} # Create the identity New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location $identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id $identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
Назначьте удостоверению разрешения для распространения изображений. Следующие команды загружают и обновляют шаблон с ранее заданными параметрами.
$aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json" $aibRoleImageCreationPath = "aibRoleImageCreation.json" # Download the config Invoke-WebRequest -Uri $aibRoleImageCreationUrl -OutFile $aibRoleImageCreationPath -UseBasicParsing ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<subscriptionID>',$subscriptionID) | Set-Content -Path $aibRoleImageCreationPath ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $aibRoleImageCreationPath ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $aibRoleImageCreationPath # Create a role definition New-AzRoleDefinition -InputFile ./aibRoleImageCreation.json # Grant the role definition to the VM Image Builder service principal New-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
Замечание
В случае отображения ошибки: "New-AzRoleDefinition. Предел определения роли превышен. Дополнительные определения ролей не могут быть созданы", см. статью "Устранение неполадок Azure RBAC (управление доступом на основе ролей)".
Создание галереи вычислительных ресурсов Azure
Если у вас еще нет коллекции вычислений Azure, необходимо создать ее.
$sigGalleryName= "myaibsig01"
$imageDefName ="win10avd"
# Create the gallery
New-AzGallery -GalleryName $sigGalleryName -ResourceGroupName $imageResourceGroup -Location $location
# Create the gallery definition
New-AzGalleryImageDefinition -GalleryName $sigGalleryName -ResourceGroupName $imageResourceGroup -Location $location -Name $imageDefName -OsState generalized -OsType Windows -Publisher 'myCo' -Offer 'Windows' -Sku '10avd'
Настройка шаблона построителя образов виртуальных машин
В этом примере мы подготовили шаблон, который скачивает и обновляет шаблон построителя образов виртуальных машин с указанными ранее параметрами. Шаблон устанавливает FSLogix, оптимизацию операционной системы и Microsoft Teams, а в конце запускает службу Windows Update.
При открытии шаблона можно увидеть в исходном свойстве используемый образ. В этом примере используется многосеансовый образ Windows 10.
Образы Windows 10
Следует учитывать два основных типа изображений: многосеансовые и односеансовые.
Многосеансовые образы предназначены для использования в пуле. Ниже приведен пример сведений об изображении в Azure:
"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "20h2-avd",
"version": "latest"
Образы для одного сеанса предназначены для индивидуального использования. Ниже приведен пример сведений об изображении в Azure:
"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "19h2-ent",
"version": "latest"
Вы также можете изменить доступные образы Windows 10:
Get-AzVMImageSku -Location westus2 -PublisherName MicrosoftWindowsDesktop -Offer windows-10
Скачивание и настройка шаблона
Теперь скачайте шаблон и настройте его для собственного использования.
$templateUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/armTemplateWVD.json"
$templateFilePath = "armTemplateWVD.json"
Invoke-WebRequest -Uri $templateUrl -OutFile $templateFilePath -UseBasicParsing
((Get-Content -path $templateFilePath -Raw) -replace '<subscriptionID>',$subscriptionID) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<rgName>',$imageResourceGroup) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<region>',$location) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<runOutputName>',$runOutputName) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<imageDefName>',$imageDefName) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<sharedImageGalName>',$sigGalleryName) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<region1>',$location) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath
((Get-Content -path $templateFilePath -Raw) -replace '20h1-ent','win10-21h2-ent-g2') | Set-Content -Path $templateFilePath
Вы можете просматривать шаблон . Весь код доступен для просмотра.
Отправка шаблона
Шаблон должен быть отправлен в службу. Это позволяет скачивать все зависимые артефакты, такие как скрипты, проверять их, проверять разрешения и хранить в промежуточной группе ресурсов, префикс которой - IT_.
New-AzResourceGroupDeployment -ResourceGroupName $imageResourceGroup -TemplateFile $templateFilePath -TemplateParameterObject @{"api-Version" = "2020-02-14"; "imageTemplateName" = $imageTemplateName; "svclocation" = $location}
# Optional - if you have any errors running the preceding command, run:
$getStatus=$(Get-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName)
$getStatus.ProvisioningErrorCode
$getStatus.ProvisioningErrorMessage
Создание образа
Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName -NoWait
Замечание
Команда не ожидает завершения сборки образа службы построителя образов виртуальных машин, поэтому вы можете запросить состояние, как показано здесь.
$getStatus=$(Get-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName)
# Shows all the properties
$getStatus | Format-List -Property *
# Shows the status of the build
$getStatus.LastRunStatusRunState
$getStatus.LastRunStatusMessage
$getStatus.LastRunStatusRunSubState
Создание виртуальной машины
Теперь, когда образ создан, вы можете создать виртуальную машину из нее. Используйте примеры из New-AzVM (модуль Az PowerShell.Compute).
Очистка ресурсов
Если вам больше не нужны ресурсы, созданные во время этого процесса, их можно удалить следующим образом:
Это важно
Сначала удалите шаблон группы ресурсов. Если удалить только группу ресурсов, промежуточная группа ресурсов (IT_), используемая построителем образов виртуальной машины, не будет удалена.
Удалите шаблон построителя образов виртуальных машин.
Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
Удалите назначение роли.
Remove-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup" ## Remove the definitions Remove-AzRoleDefinition -Name "$identityNamePrincipalId" -Force -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup" ## Delete the identity Remove-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Force
Удалите группу ресурсов.
Remove-AzResourceGroup $imageResourceGroup -Force
Дальнейшие шаги
Чтобы попробовать дополнительные примеры построителя образов виртуальных машин, перейдите на GitHub.