Membuat templat Azure Image Builder

Berlaku untuk: ✔️ VM Linux ✔️ Set skala fleksibel

Azure Image Builder menggunakan file .json untuk meneruskan informasi ke layanan Image Builder. Dalam artikel ini kita akan pergi ke bagian file json, sehingga Anda dapat membangun sendiri. Untuk melihat contoh file .json lengkap, lihat Azure Image Builder GitHub.

Ini adalah format templat dasar:

{
  "type": "Microsoft.VirtualMachineImages/imageTemplates",
  "apiVersion": "2021-10-01",
  "location": "<region>",
  "tags": {
    "<name>": "<value>",
    "<name>": "<value>"
  },
  "identity": {},
  "properties": {
    "buildTimeoutInMinutes": <minutes>,
    "stagingResourceGroup": "/subscriptions/<subscriptionID>/resourceGroups/<stagingResourceGroupName>",
    "vmProfile": {
      "vmSize": "<vmSize>",
      "proxyVmSize": "<vmSize>",
      "osDiskSizeGB": <sizeInGB>,
      "vnetConfig": {
        "subnetId": "/subscriptions/<subscriptionID>/resourceGroups/<vnetRgName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/<subnetName>"
      },
"userAssignedIdentities": [
        "/subscriptions/<subscriptionID>/resourceGroups/<identityRgName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName1>",
  "/subscriptions/<subscriptionID>/resourceGroups/<identityRgName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName2>",
  "/subscriptions/<subscriptionID>/resourceGroups/<identityRgName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName3>",
  ...
    ]
    },
    "source": {},
    "customize": [],
    "validate": {},
    "distribute": []
  }
}

Jenis dan versi API

type adalah jenis sumber daya, yang harus "Microsoft.VirtualMachineImages/imageTemplates". apiVersionApi akan berubah seiring perubahan API, tetapi hanya untuk "2021-10-01" saat ini.

"type": "Microsoft.VirtualMachineImages/imageTemplates",
"apiVersion": "2021-10-01",

Lokasi

Lokasi adalah wilayah di mana gambar kustom akan dibuat. Berikut wilayah yang didukung:

  • AS Timur
  • US Timur 2
  • Barat Sentral AS
  • US Barat
  • US Barat 2
  • AS Barat 3
  • US Tengah Selatan
  • Eropa Utara
  • Eropa Barat
  • Asia Tenggara
  • Australia Tenggara
  • Australia Timur
  • UK Selatan
  • UK Barat
  • Brasil Selatan
  • Kanada Tengah
  • India Tengah
  • US Tengah
  • Prancis Tengah
  • Jerman Barat Tengah
  • Jepang Timur
  • AS Tengah Bagian Utara
  • Norwegia Timur
  • Swiss Utara
  • Jio India Barat
  • UAE Utara
  • Asia Timur
  • Korea Tengah
  • Afrika Selatan Utara
  • Gov (US) Arizona (Pratinjau Umum)
  • Gov (US) Virginia (Pratinjau Umum)

Penting

Daftarkan fitur "Microsoft.VirtualMachineImages/FairfaxPublicPreview" untuk mengakses pratinjau publik Pembuat Gambar Azure di wilayah Pemerintah Azure (USGov Arizona dan USGov Virginia).

Gunakan perintah berikut untuk mendaftarkan fitur untuk Azure Image Builder di wilayah Pemerintah Azure (USGov Arizona dan USGov Virginia).

az feature register --namespace Microsoft.VirtualMachineImages --name FairfaxPublicPreview
"location": "<region>",

Residensi Data

Layanan Azure VM Image Builder tidak menyimpan/memproses data pelanggan di luar wilayah yang memiliki persyaratan residensi data wilayah tunggal yang ketat saat pelanggan meminta build di wilayah tersebut. Jika terjadi pemadaman layanan untuk wilayah yang memiliki persyaratan residensi data, Anda harus membuat templat di wilayah dan geografi yang berbeda.

Redundansi zona

Distribusi mendukung redundansi zona, VHD didistribusikan ke akun Zone Redundant Storage (ZRS) secara default dan versi Azure Compute Gallery (sebelumnya dikenal sebagai Shared Image Gallery) akan mendukung jenis penyimpanan ZRS jika ditentukan.

vmProfile

buildVM

Image Builder akan menggunakan ukuran SKU default "Standard_D1_v2" untuk gambar Gen1 dan "Standard_D2ds_v4" untuk gambar Gen2. Generasi ditentukan oleh gambar yang Anda tentukan di source. Anda dapat mengambil alih ini dan mungkin anda ingin melakukan hal ini karena alasan berikut:

  1. Melakukan kustomisasi yang memerlukan peningkatan memori, CPU, dan penanganan file besar (GB).
  2. Menjalankan build Windows, Anda harus menggunakan "Standard_D2_v2" atau ukuran VM yang setara.
  3. Perlu isolasi VM.
  4. Menyesuaikan gambar yang memerlukan perangkat keras tertentu. Misalnya, untuk mesin virtual GPU, Anda memerlukan ukuran mesin virtual GPU.
  5. Perlu enkripsi end to end di sisa build VM, Anda perlu menentukan VM ukuran build dukungan yang tidak menggunakan disk sementara lokal.

Ini opsional.

osDiskSizeGB

Secara default, Image Builder tidak akan mengubah ukuran gambar, itu akan menggunakan ukuran dari gambar sumber. Anda hanya dapat meningkatkan ukuran Disk OS (Win dan Linux), ini opsional, dan nilai 0 berarti meninggalkan ukuran yang sama dengan gambar sumber. Anda tidak dapat mengurangi ukuran Disk OS menjadi lebih kecil dari ukuran dari gambar sumber.

{
  "osDiskSizeGB": 100
},

vnetConfig

Jika Anda tidak menentukan properti VNET apa pun, maka Image Builder akan membuat VNET, IP Publik, dan kelompok keamanan jaringan (NSG) sendiri. IP Publik digunakan layanan untuk berkomunikasi dengan mesin virtual build, namun jika Anda tidak ingin IP Publik atau ingin Image Builder memiliki akses ke sumber daya VNET yang ada, seperti server konfigurasi (DSC, Chef, Puppet, Ansible), berbagi file, maka Anda dapat menentukan VNET. Untuk informasi lebih lanjut, tinjau dokumentasi jaringan,ini opsional.

"vnetConfig": {
    "subnetId": "/subscriptions/<subscriptionID>/resourceGroups/<vnetRgName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/<subnetName>"
    }
}

Tag

Ini adalah pasangan kunci/nilai yang dapat Anda tentukan untuk gambar yang dihasilkan.

Identitas

Ada dua cara untuk menambahkan identitas yang ditetapkan pengguna yang dijelaskan di bawah ini.

Identitas Yang Ditetapkan Pengguna untuk sumber daya templat gambar Azure Image Builder

Diperlukan - Untuk Image Builder memiliki izin untuk membaca/menulis gambar, baca dalam skrip dari Azure Storage Anda harus membuat Azure User-Assigned Identity, yang memiliki izin ke sumber daya individual. Untuk detail tentang cara kerja izin Image Builder, dan langkah-langkah yang relevan, tinjau dokumentasi.

"identity": {
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "<imgBuilderId>": {}
    }
},

Identitas yang Ditetapkan Pengguna layanan Image Builder:

  • Hanya mendukung satu identitas
  • Tidak mendukung nama domain kustom

Untuk mempelajari selengkapnya, lihat Apa identitas terkelola untuk sumber daya Azure?. Untuk informasi selengkapnya tentang menerapkan fitur ini, lihat Mengonfigurasi identitas terkelola untuk sumber daya Azure pada Azure VM menggunakan Azure CLI.

Identitas yang Ditetapkan Pengguna untuk VM Build Image Builder

Bidang ini hanya tersedia di API versi 01-10-2021 dan yang lebih baru.

Opsional - VM Build Image Builder, yang dibuat oleh layanan Image Builder di langganan Anda, digunakan untuk membangun dan menyesuaikan gambar. Agar VM Build Image Builder memiliki izin untuk mengautentikasi dengan layanan lain seperti Azure Key Vault di langganan, Anda harus membuat satu atau beberapa Identitas yang Ditetapkan Pengguna Azure yang memiliki izin ke sumber daya individual. Azure Image Builder kemudian dapat mengaitkan Identitas yang Ditetapkan Pengguna ini dengan mesin virtual Build. Skrip penyesuai yang berjalan di dalam mesin virtual Build kemudian dapat mengambil token untuk identitas ini dan berinteraksi dengan sumber daya Azure lainnya sesuai kebutuhan. Ketahuilah, identitas yang ditetapkan pengguna untuk Azure Image Builder harus memiliki penetapan peran "Operator Identitas Terkelola" pada semua identitas yang ditetapkan pengguna untuk Azure Image Builder agar dapat mengaitkannya ke VM build.

Catatan

Ketahuilah bahwa banyak identitas dapat ditentukan untuk VM Build Image Builder, termasuk identitas yang Anda buat untuk sumber daya kerangka gambar. Secara default, identitas yang Anda buat untuk sumber daya templat gambar tidak akan secara otomatis ditambahkan ke mesin virtual build.

"properties": {
  "vmProfile": {
  "userAssignedIdentities": [
    "/subscriptions/<subscriptionID>/resourceGroups/<identityRgName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName>"
  ]
  },
},

Identitas yang Ditetapkan Pengguna untuk VM Build Image Builder:

  • Mendukung daftar satu atau beberapa identitas terkelola yang ditetapkan pengguna untuk dikonfigurasi pada mesin virtual
  • Mendukung skenario lintas langganan (identitas dibuat dalam satu langganan sementara templat gambar dibuat di langganan lain di bawah penyewa yang sama)
  • Tidak mendukung skenario lintas penyewa (identitas dibuat dalam satu penyewa sementara templat gambar dibuat di penyewa lain)

Untuk informasi selengkapnya, lihat Cara menggunakan identitas terkelola untuk sumber daya Azure pada mesin virtual Azure untuk memperoleh token akses dan Cara menggunakan identitas terkelola untuk sumber daya Azure pada mesin virtual Azure untuk proses masuk.

Properti: stagingResourceGroup

Bidang stagingResourceGroup berisi informasi tentang grup sumber daya penahapan yang akan dibuat oleh layanan Image Builder untuk digunakan selama proses pembuatan gambar. stagingResourceGroup adalah bidang opsional bagi siapa saja yang menginginkan kontrol lebih besar atas grup sumber daya yang dibuat oleh Image Builder selama proses pembuatan gambar. Anda dapat membuat grup sumber daya Anda sendiri dan menentukannya di bagian stagingResourceGroup atau meminta Image Builder membuatnya atas nama Anda.

"properties": {
  "stagingResourceGroup": "/subscriptions/<subscriptionID>/resourceGroups/<stagingResourceGroupName>"
}

Skenario Pembuatan Templat

Bidang stagingResourceGroup dibiarkan kosong

Jika bidang stagingResourceGroup tidak ditentukan atau ditentukan dengan string kosong, layanan Image Builder akan membuat grup sumber daya staging dengan konvensi nama default "IT_***". Grup sumber daya penahapan akan menerapkan tag default: createdBy, imageTemplateName, imageTemplateResourceGroupName. Selain itu, RBAC default akan diterapkan ke identitas yang ditetapkan ke sumber daya templat Azure Image Builder, yaitu "Kontributor".

Bidang stagingResourceGroup ditentukan dengan grup sumber daya yang ada

Jika bidang stagingResourceGroup ditentukan dengan grup sumber daya yang ada, maka layanan Image Builder akan memeriksa untuk memastikan grup sumber daya kosong (tidak ada sumber daya di dalamnya), di wilayah yang sama dengan templat gambar, dan memiliki " Kontributor" atau "Pemilik" RBAC diterapkan pada identitas yang ditetapkan ke sumber daya templat gambar Azure Image Builder. Jika salah satu persyaratan yang disebutkan di atas tidak terpenuhi, kesalahan akan terjadi. Grup sumber daya penahapan akan memiliki tag berikut yang ditambahkan ke dalamnya: usedBy, imageTemplateName, imageTemplateResourceGroupName. Tag yang sudah ada sebelumnya tidak dihapus.

Bidang stagingResourceGroup ditentukan dengan grup sumber daya yang TIDAK ada

Jika bidang stagingResourceGroup ditentukan dengan grup sumber daya yang tidak ada, maka layanan Image Builder akan membuat grup sumber daya penahapan dengan nama yang disediakan di bidang stagingResourceGroup. Akan ada kesalahan jika nama yang diberikan tidak memenuhi persyaratan penamaan Azure untuk grup sumber daya. Grup sumber daya penahapan akan menerapkan tag default: createdBy, imageTemplateName, imageTemplateResourceGroupName. Secara default, identitas yang ditetapkan ke sumber daya templat gambar Azure Image Builder akan memiliki RBAC "Kontributor" yang diterapkan padanya di grup sumber daya.

Penghapusan Templat

Setiap grup sumber daya penahapan yang dibuat oleh layanan Image Builder akan dihapus setelah templat gambar dihapus. Ini termasuk grup sumber daya penahapan yang ditentukan di bidang stagingResourceGroup, tetapi tidak ada sebelum pembuatan gambar.

Jika Image Builder tidak membuat grup sumber daya penahapan, tetapi membuat sumber daya di dalamnya, sumber daya tersebut akan dihapus setelah templat gambar dihapus selama layanan Image Builder memiliki izin atau peran yang sesuai yang diperlukan untuk menghapus sumber daya.

Properti: sumber

Bagian source ini berisi informasi tentang gambar sumber yang akan digunakan oleh Image Builder. Image Builder saat ini hanya secara native mendukung pembuatan gambar generasi Hyper-V (Gen1) 1 ke Azure Compute Gallery (SIG) atau gambar terkelola. Jika Anda ingin membuat gambar Gen2, maka Anda perlu menggunakan sumber gambar Gen2, dan mendistribusikan ke VHD. Setelah itu, Anda kemudian perlu membuat gambar terkelola dari VHD, dan menyuntikkannya ke SIG sebagai gambar Gen2.

API memerlukan SourceType yang menentukan sumber untuk build gambar, saat ini ada tiga jenis:

  • PlatformImage - menunjukkan gambar sumber adalah gambar Marketplace.
  • ManagedImage - gunakan ini saat memulai dari gambar yang dikelola secara teratur.
  • SharedImageVersion - ini digunakan saat Anda menggunakan versi gambar di Azure Compute Gallery sebagai sumber.

Catatan

Saat menggunakan gambar kustom Windows yang ada, Anda dapat menjalankan perintah Sysprep hingga 3 kali pada satu gambar Windows 7 atau Windows Server 2008 R2, atau 1001 kali pada satu gambar Windows untuk versi yang lebih baru; untuk informasi selengkapnya, lihat dokumentasi sysprep.

Sumber PlatformImage

Azure Image Builder mendukung Windows Server dan klien, dan gambar Marketplace Azure Linux, lihat Mempelajari tentang Azure Image Builder untuk daftar lengkapnya.

"source": {
  "type": "PlatformImage",
  "publisher": "Canonical",
  "offer": "UbuntuServer",
  "sku": "18.04-LTS",
  "version": "latest"
},

Properti di sini sama yang digunakan untuk membuat VM, menggunakan AZ CLI, jalankan di bawah ini untuk mendapatkan properti:

az vm image list -l westus -f UbuntuServer -p Canonical --output table --all

Anda dapat menggunakan latest dalam versi, versi dievaluasi saat proses build gambar berlangsung, bukan saat templat dikirimkan. Jika menggunakan fungsionalitas ini dengan tujuan Azure Compute Gallery, Anda dapat menghindari pengiriman ulang templat, dan menjalankan ulang build gambar secara berkala, sehingga gambar Anda dibuat ulang dari gambar terbaru.

Dukungan untuk Informasi Rencana Market Place

Anda juga dapat menentukan informasi paket, misalnya:

"source": {
  "type": "PlatformImage",
  "publisher": "RedHat",
  "offer": "rhel-byos",
  "sku": "rhel-lvm75",
  "version": "latest",
  "planInfo": {
    "planName": "rhel-lvm75",
    "planProduct": "rhel-byos",
    "planPublisher": "redhat"
  }

Sumber ManagedImage

Mengatur gambar sumber sebagai gambar terkelola yang sudah ada dari VHD atau VM umum.

Catatan

Gambar terkelola sumber harus dari OS yang didukung dan gambar harus berada di langganan dan wilayah yang sama dengan templat Azure Image Builder Anda.

"source": {
  "type": "ManagedImage",
  "imageId": "/subscriptions/<subscriptionId>/resourceGroups/{destinationResourceGroupName}/providers/Microsoft.Compute/images/<imageName>"
}

imageIdSeharusnya menjadi ResourceId dari gambar yang dikelola. Gunakan az image list untuk mencantumkan gambar yang tersedia.

Sumber SharedImageVersion

Mengatur gambar sumber sebagai versi gambar yang sudah ada di Azure Compute Gallery.

Catatan

Versi gambar bersama sumber harus dari OS yang didukung dan versi gambar harus berada di wilayah yang sama dengan templat Azure Image Builder Anda, jika tidak, replikasi versi gambar ke wilayah Templat Image Builder.

"source": {
  "type": "SharedImageVersion",
  "imageVersionID": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/p  roviders/Microsoft.Compute/galleries/<sharedImageGalleryName>/images/<imageDefinitionName/versions/<imageVersion>"
}

imageVersionIdSeharusnya menjadi ResourceId dari versi gambar. Gunakan daftar versi gambar az sig untuk mencantumkan versi gambar.

Properti: buildTimeoutInMinutes

Secara default, Image Builder akan berjalan selama 240 menit. Setelah itu, waktu akan habis dan berhenti, apakah pembuatan gambar selesai atau tidak. Jika waktunya habis, Anda akan melihat kesalahan yang mirip dengan ini:

[ERROR] Failed while waiting for packerizer: Timeout waiting for microservice to
[ERROR] complete: 'context deadline exceeded'

Jika Anda tidak menentukan nilai buildTimeoutInMinutes, atau mengaturnya ke 0, ia akan menggunakan nilai default. Anda dapat menambah atau mengurangi nilai, hingga maksimum 960 menit (16 jam). Untuk Windows, kami tidak menyarankan untuk mengatur ini di bawah 60 menit. Jika Anda menemukan diri Anda mencapai waktu habis, tinjau log, untuk melihat apakah langkah kustomisasi sedang menunggu sesuatu seperti input pengguna.

Jika Anda menemukan Anda membutuhkan lebih banyak waktu untuk kustomisasi selesai, atur ini ke apa yang Anda pikir Anda butuhkan, dengan sedikit overhead. Namun, jangan mengaturnya terlalu tinggi karena Anda mungkin harus menunggu waktu habis sebelum melihat kesalahan.

Catatan

Jika Anda tidak menetapkan nilai ke 0, nilai minimum yang didukung adalah 6 menit. Menggunakan nilai 1 hingga 5 akan gagal.

Properti: sesuaikan

Image Builder mendukung beberapa customizers. Kustomisasi adalah fungsi yang digunakan untuk menyesuaikan gambar Anda, seperti menjalankan skrip, atau me-reboot server.

Ketika menggunakan customize :

  • Anda dapat menggunakan beberapa penyesuai
  • Kustomisasi mengeksekusi dalam urutan yang ditentukan dalam templat.
  • Jika satu penyesuai gagal, maka seluruh komponen penyesuaian akan gagal dan melaporkan kembali kesalahan.
  • Disarankan Anda menguji skrip secara menyeluruh sebelum menggunakannya dalam templat. Men-debug skrip pada VM Anda sendiri akan lebih mudah.
  • jangan menaruh data sensitif di dalam skrip.
  • Lokasi skrip harus dapat diakses secara publik, kecuali Anda menggunakan MSI.
"customize": [
  {
    "type": "Shell",
    "name": "<name>",
    "scriptUri": "<path to script>",
    "sha256Checksum": "<sha256 checksum>"
  },
  {
    "type": "Shell",
    "name": "<name>",
    "inline": [
        "<command to run inline>",
    ]
  }
],

Bagian kustomisasi adalah array. Azure Image Builder akan berjalan melalui penyesuai dalam urutan berurutan. Kegagalan apa pun dalam penyesuai apa pun akan gagal dalam proses build.

Catatan

Perintah sebaris dapat dilihat dalam definisi templat gambar. Jika Anda memiliki informasi sensitif (termasuk kata sandi, token SAS, token autentikasi, dll), informasi tersebut harus dipindahkan ke skrip di Azure Storage, di mana akses memerlukan autentikasi.

Penyesuai shell

Penyesuai shell mendukung menjalankan skrip shell. Skrip shell harus dapat diakses secara publik atau Anda harus mengonfigurasi MSI untuk Image Builder untuk mengaksesnya.

"customize": [
  {
    "type": "Shell",
    "name": "<name>",
    "scriptUri": "<link to script>",
    "sha256Checksum": "<sha256 checksum>"
  },
],
"customize": [
  {
    "type": "Shell",
    "name": "<name>",
    "inline": "<commands to run>"
  },
],

Dukungan OS: Linux

Mengkustomisasi properti:

  • jenis – Shell

  • nama - nama untuk melacak kustomisasi

  • scriptUri - URI ke lokasi file

  • sebaris - array perintah shell, dipisahkan oleh koma.

  • sha256Checksum - Nilai checksum file sha256, Anda menghasilkan ini secara lokal, dan kemudian Image Builder akan checksum dan memvalidasi.

    Untuk menghasilkan sha256Checksum, menggunakan terminal yang dijalankan Mac/Linux : sha256sum <fileName>

Catatan

Perintah sebaris disimpan sebagai bagian dari definisi templat gambar, Anda dapat melihatnya ketika membuang definisi gambar. Jika Anda memiliki perintah atau nilai sensitif (termasuk kata sandi, token SAS, token autentikasi, dll.), direkomendasikan untuk memindahkannya ke skrip, dan menggunakan identitas pengguna untuk mengautentikasi ke Azure Storage.

Hak istimewa pengguna super

Agar perintah dijalankan dengan hak istimewa pengguna super, mereka harus dia awali sudo, Anda dapat menambahkannya ke dalam skrip atau menggunakannya perintah sebaris, misalnya:

"type": "Shell",
"name": "setupBuildPath",
"inline": [
    "sudo mkdir /buildArtifacts",
    "sudo cp /tmp/index.html /buildArtifacts/index.html"
]

Contoh skrip menggunakan sudo yang dapat Anda referensikan menggunakan scriptUri:

#!/bin/bash -e

echo "Telemetry: creating files"
mkdir /myfiles

echo "Telemetry: running sudo 'as-is' in a script"
sudo touch /myfiles/somethingElevated.txt

Mulai ulang penyesuai Windows

Penyesuai hidupkan ulang memungkinkan Anda untuk memulai ulang Windows VM dan menunggunya kembali online, ini memungkinkan Anda untuk memasang perangkat lunak yang memerlukan reboot.

"customize": [
  {
    "type": "WindowsRestart",
    "restartCommand": "shutdown /r /f /t 0",
    "restartCheckCommand": "echo Azure-Image-Builder-Restarted-the-VM  > c:\\buildArtifacts\\azureImageBuilderRestart.txt",
    "restartTimeout": "5m"
  }
],

Dukungan OS: Windows

Mengkustomisasi properti:

  • jenis: WindowsRestart
  • restartCommand - Perintah untuk menjalankan restart (opsional). Defaultnya adalah 'shutdown /r /f /t 0 /c \"packer restart\"'.
  • restartCheckCommand - Perintah untuk memeriksa apakah restart berhasil (opsional).
  • restartTimeout - Memulai ulang waktu yang habis yang ditentukan sebagai string besar dan unit. Misalnya, 5m (5 menit) atau 2h (2 jam). Nilai defaultnya adalah: '5m'

Mulai ulang Linux

Tidak ada penyesuai penghidupan ulang Linux. Jika Anda menginstal driver, atau komponen yang memerlukan mulai ulang, Anda dapat menginstalnya dan melakukan mulai ulang menggunakan penyesuai Shell. Ada batas waktu SSH 20 menit ke mesin virtual build.

Penyesuai PowerShell

Kostumisasi shell mendukung menjalankan skrip PowerShell dan perintah sebaris, skrip harus dapat diakses secara publik bagi IB untuk mengaksesnya.

"customize": [
  {
    "type": "PowerShell",
    "name":   "<name>",
    "scriptUri": "<path to script>",
    "runElevated": <true false>,
    "sha256Checksum": "<sha256 checksum>"
  },
  {
    "type": "PowerShell",
    "name": "<name>",
    "inline": "<PowerShell syntax to run>",
    "validExitCodes": "<exit code>",
    "runElevated": <true or false>
  }
],

Dukungan OS: Windows

Mengkustomisasi properti:

  • jenis – PowerShell.

  • scriptUri - URI ke lokasi file skrip PowerShell.

  • inline – Perintah sebaris yang akan dijalankan, dipisahkan dengan koma.

  • validExitCodes - Kode opsional dan valid yang dapat dikembalikan dari perintah skrip / sebaris, ini akan menghindari kegagalan yang dilaporkan dari perintah skrip / sebaris.

  • runElevated – Opsional, boolean, dukungan untuk menjalankan perintah dan skrip dengan izin yang ditinggikan.

  • sha256Checksum - Nilai checksum file sha256, Anda menghasilkan ini secara lokal, dan kemudian Image Builder akan checksum dan memvalidasi.

    Untuk menghasilkan sha256Checksum, menggunakan PowerShell pada Windows Get-Hash

Penyesuai berkas

Penyesuai file memungkinkan Image Builder mengunduh file dari repo GitHub atau penyimpanan Azure. Jika Anda memiliki pipeline build gambar yang mengandalkan artefak build, Anda dapat mengatur penyesuai file untuk diunduh dari berbagi build, dan memindahkan artefak ke dalam gambar.

"customize": [
  {
    "type": "File",
    "name": "<name>",
    "sourceUri": "<source location>",
    "destination": "<destination>",
    "sha256Checksum": "<sha256 checksum>"
  }
]

Dukungan OS: Linux dan Windows

Properti penyesuai berkas:

  • sourceUri - titik akhir penyimpanan yang dapat diakses, ini bisa menjadi penyimpanan GitHub atau Azure. Anda hanya dapat mengunduh satu file, bukan seluruh direktori. Jika Anda perlu mengunduh direktori, gunakan file terkompresi, lalu uncompress menggunakan penyesuai Shell atau PowerShell.

Catatan

Jika sourceUri adalah Akun Azure Storage, terlepas dari apakah gumpalan ditandai publik, Anda akan memberikan izin Identitas Pengguna Terkelola untuk membaca akses pada gumpalan. Lihat contoh ini untuk mengatur izin penyimpanan.

  • tujuan - ini adalah jalur tujuan lengkap dan nama file. Setiap jalur dan subdirectories yang direferensikan harus ada, gunakan penyesuai Shell atau PowerShell untuk mengaturnya sebelumnya. Anda dapat menggunakan kustomisasi skrip untuk membuat jalur.

Ini didukung oleh direktori Windows dan jalur Linux, tetapi ada beberapa perbedaan:

  • Linux OS - satu-satunya jalur yang dapat ditulis oleh pembangun gambar adalah /tmp.
  • Windows – Tidak ada batasan jalur, tetapi jalurnya harus ada.

Jika ada kesalahan saat mencoba mengunduh file, atau memasukkannya ke direktori tertentu, maka langkah kustom akan gagal, dan ini akan berada dalam costumization.log.

Catatan

Penyesuai file hanya cocok untuk pengunduhan file kecil, < 20MB. Untuk unduhan file yang lebih besar, gunakan skrip atau perintah sebaris, lalu gunakan kode untuk mengunduh file, seperti, Linux wget atau curl, Windows, Invoke-WebRequest.

Penyesuai Windows Update

Penyesuai ini dibangun di komunitas Windows Update Provisioner for Packer, yang merupakan proyek open source yang dikelola oleh komunitas Packer. Microsoft menguji dan memvalidasi provisioner dengan layanan Image Builder, dan akan mendukung penyelidikan masalah dengannya, dan bekerja untuk mengatasi masalah, namun proyek open source tidak didukung secara resmi oleh Microsoft. Untuk dokumentasi terperinci tentang dan bantuan dengan Penyedia Pembaruan Windows, lihat repositori proyek.

"customize": [
  {
    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
      "exclude:$_.Title -like '*Preview*'",
      "include:$true"
    ],
    "updateLimit": 20
  }
],

Dukungan OS: Windows

Properti penyesuai:

  • jenis – WindowsUpdate.
  • searchCriteria - Opsional, menentukan jenis pembaruan yang diinstal (seperti Direkomendasikan atau Penting), BrowseOnly=0 dan IsInstalled=0 (Disarankan) adalah default.
  • filter – Opsional, memungkinkan Anda menentukan filter untuk menyertakan atau mengecualikan pembaruan.
  • updateLimit - Opsional, menentukan berapa banyak pembaruan yang dapat dipasang, default 1000.

Catatan

Penyesuai Windows Update bisa gagal jika ada hidupkan ulang Windows yang beredar, atau penginstalan aplikasi masih berjalan, biasanya Anda mungkin melihat galat ini dalam customization.log, System.Runtime.InteropServices.COMException (0x80240016): Exception from HRESULT: 0x80240016. Kami sangat menyarankan Anda mempertimbangkan untuk menambahkan Windows Restart, dan/atau memungkinkan aplikasi cukup waktu untuk menyelesaikan penginstalan mereka menggunakan perintah tidur atau tunggu dalam perintah sebaris atau skrip sebelum menjalankan Windows Update.

Generalisasi

Secara default, Azure Image Builder juga akan menjalankan kode deprovision di akhir setiap fase kustomisasi gambar, untuk menyamaratakan gambar. Generalisasi adalah proses di mana gambar diatur sehingga dapat digunakan kembali untuk membuat beberapa VM. Untuk Windows VMs, Azure Image Builder menggunakan Sysprep. Untuk Linux, Azure Image Builder menjalankan waagent -deprovision.

Perintah yang akan dirembankan pengguna Image Builder mungkin tidak cocok untuk setiap situasi, sehingga Azure Image Builder akan memungkinkan Anda untuk menyesuaikan perintah ini, jika diperlukan.

Jika Anda memigrasikan kustomisasi yang ada dan menggunakan perintah Sysprep/waagen yang berbeda, Anda dapat menggunakan perintah umum Image Builder, lalu jika pembuatan mesin virtual gagal, gunakan perintah Sysprep atau waagen Anda sendiri.

Jika Azure Image Builder berhasil membuat gambar kustom Windows dan Anda membuat mesin virtual darinya, tetapi menemukan bahwa pembuatan mesin virtual gagal atau tidak berhasil, Anda harus meninjau dokumentasi Windows Server Sysprep atau mengajukan permintaan dukungan kepada tim Dukungan Layanan Pelanggan Windows Server Sysprep, yang dapat memecahkan masalah dan memberi saran terkait penggunaan Sysprep yang benar.

Perintah Sysprep default

Write-Output '>>> Waiting for GA Service (RdAgent) to start ...'
while ((Get-Service RdAgent).Status -ne 'Running') { Start-Sleep -s 5 }
Write-Output '>>> Waiting for GA Service (WindowsAzureTelemetryService) to start ...'
while ((Get-Service WindowsAzureTelemetryService) -and ((Get-Service WindowsAzureTelemetryService).Status -ne 'Running')) { Start-Sleep -s 5 }
Write-Output '>>> Waiting for GA Service (WindowsAzureGuestAgent) to start ...'
while ((Get-Service WindowsAzureGuestAgent).Status -ne 'Running') { Start-Sleep -s 5 }
Write-Output '>>> Sysprepping VM ...'
if( Test-Path $Env:SystemRoot\system32\Sysprep\unattend.xml ) {
  Remove-Item $Env:SystemRoot\system32\Sysprep\unattend.xml -Force
}
& $Env:SystemRoot\System32\Sysprep\Sysprep.exe /oobe /generalize /quiet /quit
while($true) {
  $imageState = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\State).ImageState
  Write-Output $imageState
  if ($imageState -eq 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { break }
  Start-Sleep -s 5
}
Write-Output '>>> Sysprep complete ...'

Perintah deprovision Linux default

WAAGENT=/usr/sbin/waagent
waagent -version 1> /dev/null 2>&1
if [ $? -eq 0 ]; then
  WAAGENT=waagent
fi
$WAAGENT -force -deprovision+user && export HISTSIZE=0 && sync

Mengesampingkan Perintah

Untuk mengganti perintah, gunakan provisioner skrip PowerShell atau Shell untuk membuat file perintah dengan nama file yang tepat, dan memasukkannya ke dalam direktori yang benar:

  • Windows: c:\DeprovisioningScript.ps1
  • Linux: /tmp/DeprovisioningScript.sh

Image Builder akan membaca perintah ini, ini ditulis ke log AIB, customization.log. Lihat pemecahan masalah tentang cara mengumpulkan log.

Properti: validasi

Anda dapat menggunakan properti validate untuk memvalidasi gambar platform dan gambar yang disesuaikan apa pun yang Anda buat, terlepas dari apakah Anda menggunakan Azure Image Builder untuk membuatnya.

Azure Image Builder mendukung mode 'Source-Validation-Only' yang dapat diatur menggunakan bidang sourceValidationOnly. Jika bidang sourceValidationOnly diatur menjadi true, gambar yang ditentukan di bagian source akan langsung divalidasi. Tidak ada build terpisah yang akan dijalankan untuk menghasilkan dan kemudian memvalidasi gambar yang disesuaikan.

Bidang inVMValidations mengambil daftar validator yang akan dilakukan pada gambar. Azure Image Builder mendukung validator PowerShell dan Shell.

Bidang continueDistributeOnFailure bertanggung jawab atas apakah gambar output akan didistribusikan jika validasi gagal. Jika validasi gagal dan bidang ini diatur menjadi false, gambar output tidak akan didistribusikan (opsi ini adalah perilaku default). Jika validasi gagal dan bidang ini diatur menjadi true, gambar output masih akan didistribusikan. Gunakan opsi ini dengan hati-hati karena dapat mengakibatkan gambar gagal didistribusikan untuk digunakan. Dalam kedua kasus (tur atau false), gambar ujung ke ujung akan dilaporkan sebagai gagal dalam kasus kegagalan validasi. Bidang ini tidak berpengaruh pada apakah validasi berhasil atau tidak.

Ketika menggunakan validate :

  • Anda dapat menggunakan beberapa validator
  • Validator mengeksekusi dalam urutan yang ditentukan dalam templat.
  • Jika salah satu validator gagal, maka seluruh komponen validasi akan gagal dan melaporkan kembali kesalahan.
  • Disarankan Anda menguji skrip secara menyeluruh sebelum menggunakannya dalam templat. Men-debug skrip pada VM Anda sendiri akan lebih mudah.
  • Jangan memasukkan data sensitif ke dalam skrip.
  • Lokasi skrip harus dapat diakses secara publik, kecuali Anda menggunakan MSI.

Cara menggunakan properti validate untuk memvalidasi gambar Windows

{
  "properties": {
    "validate": {
      "continueDistributeOnFailure": false,
      "sourceValidationOnly": false,
      "inVMValidations": [
        {
          "type": "PowerShell",
          "name": "test PowerShell validator inline",
          "inline": [
            "<command to run inline>"
          ],
          "validExitCodes": "<exit code>",
          "runElevated": <true or false>,
          "runAsSystem": <true or false>
        },
        {
          "type": "PowerShell",
          "name": "<name>",
          "scriptUri": "<path to script>",
          "runElevated": <true false>,
          "sha256Checksum": "<sha256 checksum>"
        }
      ]
    },
  }
}

properti inVMValidations:

  • jenis – PowerShell.

  • name - nama validator

  • scriptUri - URI file skrip PowerShell.

  • inline – larik perintah yang akan dijalankan, dipisahkan dengan koma.

  • validExitCodes - Kode opsional dan valid yang dapat dikembalikan dari perintah skrip / sebaris, ini akan menghindari kegagalan yang dilaporkan dari perintah skrip / sebaris.

  • runElevated – Opsional, boolean, dukungan untuk menjalankan perintah dan skrip dengan izin yang ditinggikan.

  • sha256Checksum - Nilai checksum file sha256, Anda menghasilkan ini secara lokal, dan kemudian Image Builder akan checksum dan memvalidasi.

    Untuk menghasilkan sha256Checksum, menggunakan PowerShell pada Windows Get-Hash

Cara menggunakan properti validate untuk memvalidasi gambar Linux

{
  "properties": {
    "validate": {
      "continueDistributeOnFailure": false,
      "sourceValidationOnly": false,
      "inVMValidations": [
        {
          "type": "Shell",
          "name": "<name>",
          "inline": [
            "<command to run inline>"
          ]
        },
        {
          "type": "Shell",
          "name": "<name>",
          "scriptUri": "<path to script>",
          "sha256Checksum": "<sha256 checksum>"
        }
      ]
    },
  }
 }

properti inVMValidations:

  • jenis – Shell

  • name - nama validator

  • scriptUri - URI file skrip

  • inline - larik perintah yang akan dijalankan, dipisahkan dengan koma.

  • sha256Checksum - Nilai checksum file sha256, Anda menghasilkan ini secara lokal, dan kemudian Image Builder akan checksum dan memvalidasi.

    Untuk menghasilkan sha256Checksum, menggunakan terminal yang dijalankan Mac/Linux : sha256sum <fileName>

Properti: distribusikan

Azure Image Builder mendukung tiga target distribusi:

  • managedImage - gambar terkelola.
  • sharedImage - Azure Compute Gallery.
  • VHD - VHD dalam akun penyimpanan.

Anda dapat mendistribusikan gambar ke kedua jenis target dalam konfigurasi yang sama.

Catatan

Perintah sysprep AIB default tidak menyertakan "/mode:vm", tetapi ini mungkin diperlukan saat membuat gambar yang akan menginstal peran HyperV. Jika Anda perlu menambahkan argumen perintah ini, Anda harus mengganti perintah sysprep.

Karena Anda dapat memiliki lebih dari satu target untuk didistribusikan, Image Builder mempertahankan status untuk setiap target distribusi yang dapat diakses dengan meminta runOutputName. Objek runOutputName yang bisa Anda kuerikan distribusi postingan untuk informasi tentang distribusi tersebut. Misalnya, Anda dapat meminta lokasi VHD, atau wilayah tempat versi gambar direplikasi, atau versi Gambar SIG dibuat. Ini adalah properti dari setiap target distribusi. Yang runOutputName harus unik untuk setiap target distribusi. Berikut ini contohnya, contoh ini mengkueri distribusi Azure Compute Gallery:

subscriptionID=<subcriptionID>
imageResourceGroup=<resourceGroup of image template>
runOutputName=<runOutputName>

az resource show \
        --ids "/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.VirtualMachineImages/imageTemplates/ImageTemplateLinuxRHEL77/runOutputs/$runOutputName"  \
        --api-version=2021-10-01

Output:

{
  "id": "/subscriptions/xxxxxx/resourcegroups/rheltest/providers/Microsoft.VirtualMachineImages/imageTemplates/ImageTemplateLinuxRHEL77/runOutputs/rhel77",
  "identity": null,
  "kind": null,
  "location": null,
  "managedBy": null,
  "name": "rhel77",
  "plan": null,
  "properties": {
    "artifactId": "/subscriptions/xxxxxx/resourceGroups/aibDevOpsImg/providers/Microsoft.Compute/galleries/devOpsSIG/images/rhel/versions/0.24105.52755",
    "provisioningState": "Succeeded"
  },
  "resourceGroup": "rheltest",
  "sku": null,
  "tags": null,
  "type": "Microsoft.VirtualMachineImages/imageTemplates/runOutputs"
}

Distribusi: managedImage

Output gambar akan menjadi sumber daya gambar terkelola.

{
  "type":"managedImage",
  "imageId": "<resource ID>",
  "location": "<region>",
  "runOutputName": "<name>",
  "artifactTags": {
      "<name>": "<value>",
      "<name>": "<value>"
  }
}

Mendistribusikan properti:

  • jenis – managedImage
  • imageId – ID Sumber daya dari gambar tujuan, format yang diharapkan: /subscriptions/<subscriptionId>/resourceGroups/<destinationResourceGroupName>/providers/Microsoft.Compute/images/<imageName>
  • lokasi - lokasi gambar yang dikelola.
  • runOutputName – nama unik untuk mengidentifikasi distribusi.
  • artifactTags - Tag nilai\kunci yang ditentukan pengguna opsional.

Catatan

Grup sumber daya tujuan harus ada. Jika Anda ingin gambar didistribusikan ke wilayah yang berbeda, maka akan meningkatkan waktu penyebaran.

Distribusi: sharedImage

Azure Compute Gallery adalah layanan Manajemen Gambar baru yang memungkinkan pengelolaan replikasi wilayah gambar, penerapan versi, dan berbagi gambar kustom. Image Builder Azure mendukung pendistribusian dengan layanan ini, sehingga Anda dapat mendistribusikan gambar ke wilayah yang didukung oleh Azure Compute Gallery.

Azure Compute Gallery terdiri dari:

  • Galeri - Kontainer untuk beberapa gambar. Galeri disebarkan dalam satu wilayah.
  • Definisi gambar - pengelompokan konseptual untuk gambar.
  • Versi gambar - ini adalah jenis gambar yang digunakan untuk menyebarkan VM atau set skala. Versi gambar dapat direplikasi ke wilayah lain di mana VM perlu digunakan.

Sebelum dapat mendistribusikan ke galeri, Anda harus membuat galeri dan definisi gambar, lihat Membuat galeri.

{
  "type": "SharedImage",
  "galleryImageId": "<resource ID>",
  "runOutputName": "<name>",
  "artifactTags": {
      "<name>": "<value>",
      "<name>": "<value>"
  },
  "replicationRegions": [
      "<region where the gallery is deployed>",
      "<region>"
  ]
}

Distribusikan properti untuk galeri:

  • jenis - sharedImage

  • galleryImageId – ID dari Azure Compute Gallery, ini dapat ditentukan dalam dua format:

    • Penerapan versi otomatis - Image Builder akan menghasilkan nomor versi monoton untuk Anda, ini berguna pada saatk Anda ingin terus membangun kembali gambar dari templat yang sama: Formatnya adalah: /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/galleries/<sharedImageGalleryName>/images/<imageGalleryName>.
    • Penerapan versi eksplisit - Anda dapat meneruskan nomor versi yang Anda inginkan untuk digunakan oleh pembangun gambar. Formatnya adalah: /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<sharedImageGalName>/images/<imageDefName>/versions/<version - for example: 1.1.1>
  • runOutputName – nama unik untuk mengidentifikasi distribusi.

  • artifactTags - Tag nilai\kunci yang ditentukan pengguna opsional.

  • replicationRegions - Array wilayah untuk replikasi. Salah satu wilayah harus menjadi wilayah tempat Galeri disebarkan. Menambahkan wilayah akan mengandung arti peningkatan waktu build, karena build tidak selesai hingga replikasi selesai.

  • excludeFromLatest (opsional) Hal ini memungkinkan Anda untuk menandai versi gambar yang Anda buat agar tidak digunakan sebagai versi terbaru dalam definisi galeri, defaultnya adalah 'palsu'.

  • storageAccountType (opsional) AIB mendukung menentukan jenis penyimpanan ini untuk versi gambar yang akan dibuat:

    • "Standard_LRS"
    • "Standard_ZRS"

Catatan

Jika templat gambar dan referensi tidak image definition berada di lokasi yang sama, Anda akan melihat waktu tambahan untuk membuat gambar. Image Builder saat ini tidak memiliki parameter location untuk sumber daya versi gambar, kami mengambilnya dari induknya image definition. Misalnya, jika penetapan gambar berada di westus dan Anda ingin versi gambar direplikasi ke eastus, blob disalin ke westus, dari ini, sumber daya versi gambar di westus dibuat, lalu direplikasi ke eastus. Untuk menghindari waktu replikasi tambahan, pastikan templat image definition dan gambar berada di lokasi yang sama.

Distribusikan: VHD

Anda dapat keluaran ke VHD. Anda kemudian dapat menyalin VHD, dan menggunakannya untuk menerbitkan ke Azure MarketPlace, atau menggunakan dengan Azure Stack.

{
  "type": "VHD",
  "runOutputName": "<VHD name>",
  "artifactTags": {
      "<name>": "<value>",
      "<name>": "<value>"
  }
}

Dukungan OS: Windows dan Linux

Mendistribusikan parameter VHD:

  • jenis - VHD.
  • runOutputName – nama unik untuk mengidentifikasi distribusi.
  • tag - Tag pasangan nilai kunci opsional yang ditentukan pengguna.

Azure Image Builder tidak mengizinkan pengguna untuk menentukan lokasi akun penyimpanan, tetapi Anda dapat mengkueri status runOutputs untuk mendapatkan lokasi.

az resource show \
   --ids "/subscriptions/$subscriptionId/resourcegroups/<imageResourceGroup>/providers/Microsoft.VirtualMachineImages/imageTemplates/<imageTemplateName>/runOutputs/<runOutputName>"  | grep artifactUri

Catatan

Setelah VHD dibuat, salin ke lokasi yang berbeda, sesegera mungkin. VHD disimpan dalam akun penyimpanan di grup sumber daya sementara yang dibuat saat templat gambar dikirimkan ke layanan Azure Image Builder. Jika Anda menghapus templat gambar, maka Anda akan kehilangan VHD.

Operasi Templat Gambar

Memulai Build Gambar

Untuk memulai build, Anda perlu memanggil 'Jalankan' pada sumber daya Templat Gambar, run contoh perintah:

Invoke-AzResourceAction -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2021-10-01" -Action Run -Force
az resource invoke-action \
  --resource-group $imageResourceGroup \
  --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
  -n helloImageTemplateLinux01 \
  --action Run

Membatalkan Image Build

Jika Anda menjalankan build gambar yang Menurut Anda salah, menunggu input pengguna, atau Anda merasa tidak akan pernah berhasil menyelesaikannya, maka Anda dapat membatalkan build.

Build dapat dibatalkan kapan saja. Jika fase distribusi telah dimulai, Anda masih dapat membatalkan, tetapi Anda harus membersihkan gambar apa pun yang mungkin belum selesai. Perintah batal tidak menunggu pembatalan selesai, pantau lastrunstatus.runstate untuk kemajuan pembatalan, menggunakan perintah status ini.

Contoh cancel perintah:

Invoke-AzResourceAction -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2021-10-01" -Action Cancel -Force
az resource invoke-action \
     --resource-group $imageResourceGroup \
     --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
     -n helloImageTemplateLinux01 \
     --action Cancel

Langkah berikutnya

Ada contoh file .json untuk skenario yang berbeda di Azure Image Builder GitHub.