Membuat VM Windows dengan VM Image Builder menggunakan PowerShell

Berlaku untuk: ✔️ VM Windows

Artikel ini menunjukkan cara membuat gambar Windows VM yang dikustomisasi menggunakan modul Azure VM Image Builder PowerShell.

Prasyarat

Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.

Jika Anda memilih untuk menggunakan PowerShell secara lokal, artikel ini mengharuskan Anda menginstal modul Azure PowerShell dan menyambungkan ke akun Azure Anda dengan menggunakan cmdlet Connect-AzAccount . Untuk informasi selengkapnya, lihat Menginstal Azure PowerShell.

Beberapa langkah memerlukan cmdlet dari modul Az.ImageBuilder . Instal secara terpisah dengan menggunakan perintah berikut.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Azure menghosting Azure Cloud Shell, lingkungan shell interaktif yang dapat Anda gunakan melalui browser Anda. Anda dapat menggunakan Bash atau PowerShell dengan Cloud Shell untuk bekerja dengan layanan Azure. Anda dapat menggunakan perintah Cloud Shell yang telah diinstal sebelumnya untuk menjalankan kode dalam artikel ini, tanpa harus menginstal apa pun di lingkungan lokal Anda.

Untuk memulai Azure Cloud Shell:

Opsi Contoh/Tautan
Pilih Coba di sudut kanan atas kode atau blok perintah. Memilih Coba tidak secara otomatis menyalin kode atau perintah ke Cloud Shell. Tangkapan layar yang memperlihatkan contoh fitur 'Coba' untuk Azure Cloud Shell.
Buka https://shell.azure.com, atau pilih tombol Luncurkan Cloud Shell untuk membuka Cloud Shell di browser Anda. Tombol untuk meluncurkan Azure Cloud Shell.
Pilih tombol Cloud Shell pada bilah menu di kanan atas di portal Microsoft Azure. Cuplikan layar yang memperlihatkan tombol Cloud Shell di portal Microsoft Azure

Untuk menggunakan Azure Cloud Shell:

  1. Mulai Cloud Shell.

  2. Pilih tombol Salin pada blok kode (atau blok perintah) untuk menyalin kode atau perintah.

  3. Tempelkan kode atau perintah ke sesi Cloud Shell dengan memilih Ctrl+Shift+V di Windows dan Linux, atau dengan memilih Cmd+Shift+V di macOS.

  4. Pilih Enter untuk menjalankan kode atau perintah.

Jika Anda memiliki beberapa langganan Azure, pilihlah langganan yang sesuai di mana sumber daya harus ditagih. Pilih langganan tertentu dengan menggunakan cmdlet Set-AzContext .

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

Mendaftarkan penyedia

Jika Anda belum melakukannya, daftarkan penyedia sumber berikut untuk digunakan dengan langganan Azure Anda:

  • Microsoft.Compute
  • Microsoft.KeyVault
  • Microsoft.Storage
  • Microsoft.Network
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

Tentukan variabel

Karena Anda akan menggunakan beberapa informasi berulang kali, buat beberapa variabel untuk menyimpan informasi tersebut:

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

Tentukan variabel untuk ID langganan Azure Anda. Untuk mengonfirmasi bahwa subscriptionID variabel berisi ID langganan, Anda dapat menjalankan baris kedua dalam contoh berikut:

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

Membuat grup sumber daya

Buat grup sumber daya Azure dengan menggunakan cmdlet New-AzResourceGroup . Grup sumber daya adalah kontainer logis di mana sumber daya Azure disebarkan dan dikelola sebagai grup.

Contoh berikut membuat grup sumber daya yang didasarkan pada nama di variabel $imageResourceGroup di wilayah yang telah Anda tentukan di variabel $location. Grup sumber daya ini digunakan untuk menyimpan artefak templat konfigurasi gambar dan gambar.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

Membuat identitas pengguna dan atur izin peran

Memberikan izin pembuat gambar Azure untuk membuat gambar dalam grup sumber daya tertentu dengan menggunakan contoh berikut. Tanpa izin ini, proses pembuatan gambar tidak akan berhasil diselesaikan.

  1. Buat variabel untuk definisi peran dan nama identitas. Nilai-nilai ini harus unik.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. Membuat identitas pengguna.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. Simpan sumber daya identitas dan IDENTITAS utama dalam variabel.

    $identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    

Menetapkan izin untuk identitas untuk mendistribusikan gambar

  1. Unduh file konfigurasi JSON, lalu ubah berdasarkan pengaturan yang ditentukan dalam artikel ini.

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "myRoleImageCreation.json"
    
    Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing
    
    $Content = Get-Content -Path $myRoleImageCreationPath -Raw
    $Content = $Content -replace '<subscriptionID>', $subscriptionID
    $Content = $Content -replace '<rgName>', $imageResourceGroup
    $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
    $Content | Out-File -FilePath $myRoleImageCreationPath -Force
    
  2. Buat definisi peran.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. Berikan definisi peran ke prinsip layanan VM Image Builder.

    $RoleAssignParams = @{
      ObjectId = $identityNamePrincipalId
      RoleDefinitionName = $imageRoleDefName
      Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    }
    New-AzRoleAssignment @RoleAssignParams
    

Nota

Jika Anda menerima kesalahan "New-AzRoleDefinition: Batas definisi peran terlampaui. Tidak ada lagi definisi peran yang dapat dibuat," lihat Memecahkan masalah Azure RBAC (kontrol akses berbasis peran).

  1. Buat galeri.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. Membuat definisi galeri.

    $GalleryParams = @{
      GalleryName = $myGalleryName
      ResourceGroupName = $imageResourceGroup
      Location = $location
      Name = $imageDefName
      OsState = 'generalized'
      OsType = 'Windows'
      Publisher = 'myCo'
      Offer = 'Windows'
      Sku = 'Win2019'
      HyperVGeneration = 'v1'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

Buat sebuah citra

  1. Buat objek sumber VM Image Builder. Untuk nilai parameter yang valid, lihat Menemukan gambar VM Windows di Azure Marketplace dengan Azure PowerShell.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. Buat objek distributor VM Image Builder.

    $disObjParams = @{
      SharedImageDistributor = $true
      ArtifactTag = @{tag='dis-share'}
      GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
      ReplicationRegion = $location
      RunOutputName = $runOutputName
      ExcludeFromLatest = $false
    }
    $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. Buat objek kustomisasi VM Image Builder.

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. Buat objek kustomisasi VM Image Builder.

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. Buat templat VM Image Builder.

    $ImgTemplateParams = @{
      ImageTemplateName = $imageTemplateName
      ResourceGroupName = $imageResourceGroup
      Source = $srcPlatform
      Distribute = $disSharedImg
      Customize = $Customizer01, $Customizer02
      Location = $location
      UserAssignedIdentityId = $identityNameResourceId
    }
    New-AzImageBuilderTemplate @ImgTemplateParams
    

Ketika templat telah dibuat, pesan dikembalikan, dan templat konfigurasi VM Image Builder dibuat di $imageResourceGroup.

Untuk menentukan apakah proses pembuatan template berhasil, gunakan contoh berikut:

Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup |
  Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState

Di latar belakang, VM Image Builder juga membuat grup sumber daya penahapan di langganan Anda. Grup sumber daya ini digunakan untuk kompilasi gambar. Ini dalam format IT_<DestinationResourceGroup>_<TemplateName>.

Peringatan

Jangan hapus grup sumber daya penahapan secara langsung. Untuk menyebabkan grup sumber daya penahapan dihapus, hapus artefak templat gambar.

Jika layanan melaporkan kegagalan saat templat konfigurasi gambar dikirimkan, lakukan hal berikut:

Memulai build gambar

Kirimkan konfigurasi gambar ke layanan VM Image Builder dengan menjalankan perintah berikut:

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

Tunggu hingga proses pembuatan gambar selesai, yang bisa memakan waktu hingga satu jam.

Jika Anda mengalami kesalahan, tinjau Memecahkan masalah kegagalan Azure VM Image Builder.

Membuat VM

  1. Simpan mandat masuk VM dalam variabel. Kata sandi harus rumit.

    $Cred = Get-Credential
    
  2. Buat VM dengan menggunakan gambar yang Anda buat.

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

Verifikasikan kustomisasi

  1. Buat koneksi Desktop Jauh ke VM dengan menggunakan nama pengguna dan sandi yang Anda tetapkan saat membuat VM.

  2. Di dalam VM, buka PowerShell dan jalankan Get-Content, seperti yang diperlihatkan contoh berikut:

    Get-Content -Path C:\buildActions\buildActionsOutput.txt
    

    Outputnya didasarkan pada konten file yang Anda buat selama proses kustomisasi gambar.

    Azure-Image-Builder-Was-Here
    
  3. Dari sesi PowerShell yang sama, verifikasi bahwa penyesuaian kedua berhasil diselesaikan dengan memeriksa keberadaan c:\buildArtifacts\index.html, seperti yang ditunjukkan pada contoh berikut:

    Get-ChildItem c:\buildArtifacts\
    

    Hasilnya harus berupa daftar direktori yang menunjukkan bahwa file telah diunduh selama proses penyesuaian gambar.

        Directory: C:\buildArtifacts
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          29/01/2021    10:04            276 index.html
    

Membersihkan sumber daya Anda

Jika Anda tidak lagi memerlukan sumber daya yang dibuat selama proses ini, Anda dapat menghapusnya dengan melakukan hal berikut:

  1. Hapus templat VM Image Builder tersebut.

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. Menghapus grup sumber daya gambar.

    Perhatian

    Contoh berikut menghapus grup sumber daya yang ditentukan dan semua sumber daya yang ada di dalamnya. Jika ada sumber daya di luar cakupan artikel ini di grup sumber daya, sumber daya tersebut juga akan dihapus.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

Langkah selanjutnya

Untuk mempelajari selengkapnya tentang komponen file JSON yang digunakan artikel ini, lihat referensi templat VM Image Builder.