VM Görüntü Oluşturucusu ve PowerShell kullanarak Azure Sanal Masaüstü görüntüsü oluşturma

Şunlar için geçerlidir: ✔️ Windows VM'leri

Bu makalede, şu özelleştirmelerle Azure Sanal Masaüstü görüntüsü oluşturmayı öğreneceksiniz:

Makalede, Azure VM Görüntü Oluşturucusu'nu kullanarak özelleştirmelerin nasıl otomatikleştirılacağı açıklanır. Daha sonra görüntüyü bir Azure İşlem Galerisi'ne (eski adıyla Paylaşılan Görüntü Galerisi) dağıtabilir ve burada görüntüyü başka bölgelere çoğaltabilir, ölçeği denetleyebilir ve resmi kuruluşunuzun içinde ve dışında paylaşabilirsiniz.

Bir VM Görüntü Oluşturucusu yapılandırmasını dağıtmayı kolaylaştırmak için örneğimizde, VM Görüntü Oluşturucusu şablonunun iç içe yerleştirilmiş olduğu bir Azure Resource Manager şablonu kullanılır. Bu yaklaşım, değişkenler ve parametre girişleri gibi birkaç avantaj daha sunar. Parametreleri komut satırından da geçirebilirsiniz.

Bu makale, kopyalama ve yapıştırma alıştırması olarak tasarlanmıştır.

Not

GitHub'da uygulamaları yüklemek için betikleri bulacaksınız. Bunlar yalnızca çizim ve test amaçlıdır. Bunları üretim iş yükleri için kullanmayın.

Windows görüntüleri oluşturmaya yönelik ipuçları

  • VM boyutu: Windows için kullanın Standard_D2_v2 veya daha büyük. Varsayılan boyut , Standard_D1_v2Windows için uygun değildir.

  • Bu makalede PowerShell özelleştirici betikleri kullanılır. Aşağıdaki ayarları kullanın; aksi takdirde derleme yanıt vermeyi durdurur:

      "runElevated": true,
      "runAsSystem": true,
    

    Örneğin:

      {
          "type": "PowerShell",
          "name": "installFSLogix",
          "runElevated": true,
          "runAsSystem": true,
          "scriptUri": "https://raw.githubusercontent.com/azure/azvmimagebuilder/main/solutions/14_Building_Images_WVD/0_installConfFsLogix.ps1"
    
  • Kodunuzu açıklama satırı yapın: VM Görüntü Oluşturucusu derleme günlüğü customization.log ayrıntılıdır. Betiklerinize 'write-host' kullanarak açıklama eklerseniz, bunlar günlüklere gönderilir ve bu da sorun gidermeyi kolaylaştırır.

     write-host 'AIB Customization: Starting OS Optimizations script'
    
  • Çıkış kodları: VM Görüntü Oluşturucusu tüm betiklerin bir 0 çıkış kodu döndürmesini bekler. Sıfır olmayan bir çıkış kodu kullanırsanız, VM Görüntü Oluşturucusu özelleştirmeyi başarısız yapar ve derlemeyi durdurur. Karmaşık betikleriniz varsa izleme ekleyin ve customization.log dosyasında gösterilecek çıkış kodlarını yayımlayın.

     Write-Host "Exit code: " $LASTEXITCODE
    
  • Test: Tek başına bir VM'de kodunuzu test edin ve yeniden test edin. Kullanıcı istemleri olmadığından, doğru ayrıcalıkları kullandığınızdan vb. emin olun.

  • Ağ: Set-NetAdapterAdvancedProperty iyileştirme betiğinde ayarlanır ancak VM Görüntü Oluşturucusu derlemesi başarısız olur. Ağ bağlantısı kesildiğinden açıklama satırı çıkarılır. Bu sorunu araştırıyoruz.

Önkoşullar

En son Azure PowerShell cmdlet'lerini yüklemiş olmanız gerekir. Daha fazla bilgi için bkz . Azure PowerShell'e genel bakış.

# 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

Ortamı ve değişkenleri ayarlama

# 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

İzinler, kullanıcı kimliği ve rol

  1. Kullanıcı kimliği oluşturma.

    # 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
    
    
  2. Görüntüleri dağıtmak için kimliğe izinler atayın. Aşağıdaki komutlar şablonu önceden belirtilen parametrelerle indirir ve güncelleştirir.

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

Not

"New-AzRoleDefinition: Rol tanımı sınırı aşıldı. Başka rol tanımı oluşturulamıyor", bkz . Azure RBAC (rol tabanlı erişim denetimi) sorunlarını giderme.

Henüz bir Azure İşlem Galeriniz yoksa bir tane oluşturmanız gerekir.

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

VM Görüntü Oluşturucusu şablonunu yapılandırma

Bu örnekte, VM Görüntü Oluşturucusu şablonunu daha önce belirtilen parametrelerle indiren ve güncelleştiren bir şablon hazırladık. Şablon FSLogix, işletim sistemi iyileştirmeleri ve Microsoft Teams'i yükler ve sonunda Windows Update'i çalıştırır.

Şablonu açarsanız, kaynak özelliğinde kullanılmakta olan görüntüyü görebilirsiniz. Bu örnekte Bir Windows 10 çoklu oturum görüntüsü kullanır.

Windows 10 görüntüleri

İki ana görüntü türüne dikkat etmeniz gerekir: çoklu oturum ve tek oturum.

Çok oturumlu görüntüler havuza alınan kullanıma yöneliktir. Aşağıda Azure'daki görüntü ayrıntılarına bir örnek verilmiştir:

"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "20h2-avd",
"version": "latest"

Tek oturumlu görüntüler bireysel kullanıma yöneliktir. Aşağıda Azure'daki görüntü ayrıntılarına bir örnek verilmiştir:

"publisher": "MicrosoftWindowsDesktop",
"offer": "Windows-10",
"sku": "19h2-ent",
"version": "latest"

Hangi Windows 10 görüntülerinin kullanılabilir olduğunu da değiştirebilirsiniz:

Get-AzVMImageSku -Location westus2 -PublisherName MicrosoftWindowsDesktop -Offer windows-10

Şablonu indirme ve yapılandırma

Şimdi şablonu indirin ve kendi kullanımınız için yapılandırın.

$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

Şablonu görüntüleyebilirsiniz. Tüm kod görüntülenebilir.

Şablonu gönderme

Şablonunuzun hizmete gönderilmesi gerekir. Bunu yaptığınızda betikler gibi tüm bağımlı yapıtlar indirilir, izinler doğrulanır, denetlenir ve IT_ ön ekli hazırlama kaynak grubunda depolanır.

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

Görüntü oluşturma

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName -NoWait

Not

Komut, VM Görüntü Oluşturucusu hizmetinin görüntü derlemesini tamamlanmasını beklemez, böylece burada gösterildiği gibi durumu sorgulayabilirsiniz.

$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

VM oluşturma

Artık görüntü derlendiğinden, bundan bir VM oluşturabilirsiniz. New-AzVM (Az PowerShell modülü) örneklerini kullanın. İşlem).

Kaynaklarınızı temizleme

Bu işlem sırasında oluşturulan kaynaklara artık ihtiyacınız yoksa, aşağıdakileri yaparak bunları silebilirsiniz:

Önemli

Önce kaynak grubu şablonunu silin. Yalnızca kaynak grubunu silerseniz, VM Görüntü Oluşturucusu tarafından kullanılan hazırlama kaynak grubu (IT_) temizlenmez.

  1. VM Görüntü Oluşturucusu şablonunu kaldırın.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name vd10ImageTemplate
    
  2. Rol atamasını silin.

    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
    
  3. Kaynak grubunu silin.

    Remove-AzResourceGroup $imageResourceGroup -Force
    

Sonraki adımlar

Daha fazla VM Görüntü Oluşturucusu örneği denemek için GitHub'a gidin.