Bagikan melalui


Provisi ekstensi urutan dalam Virtual Machine Scale Sets

Ekstensi komputer virtual Azure menyediakan kemampuan seperti konfigurasi dan pengelolaan pasca-penyebaran, pemantauan, keamanan, dan lainnya. Penyebaran produksi biasanya menggunakan kombinasi beberapa ekstensi yang dikonfigurasi untuk instance VM untuk mencapai hasil yang diinginkan.

Saat menggunakan beberapa ekstensi pada komputer virtual, penting untuk memastikan bahwa ekstensi yang membutuhkan sumber daya OS yang sama tidak mencoba untuk memperoleh sumber daya ini pada saat yang sama. Beberapa ekstensi juga bergantung pada ekstensi lain untuk menyediakan konfigurasi yang diperlukan seperti pengaturan lingkungan dan rahasia. Tanpa pengurutan dan urutan yang benar yang ditetapkan, penyebaran ekstensi dependen dapat gagal.

Artikel ini merinci bagaimana Anda dapat mengurutkan ekstensi yang akan dikonfigurasi untuk instans VM di Virtual Machine Scale Sets.

Prasyarat

Artikel ini mengasumsikan bahwa Anda tidak asing dengan:

Jika harus menggunakan pengurutan ekstensi

Mengurutkan ekstensi tidak wajib untuk set skala, dan kecuali ditentukan, ekstensi dapat diprovisikan di instans set skala dengan urutan apa pun.

Misalnya, jika model set skala Anda memiliki dua ekstensi - ExtensionA dan ExtensionB - yang ditentukan dalam model, salah satu urutan provisi berikut dapat terjadi:

  • ExtensionA -> ExtensionB
  • ExtensionB -> ExtensionA

Jika aplikasi Anda mengharuskan Ekstensi A untuk selalu diprovisikan sebelum Ekstensi B, Anda harus menggunakan urutan ekstensi seperti yang dijelaskan dalam artikel ini. Dengan pengurutan ekstensi, hanya satu urutan yang akan terjadi sekarang:

  • ExtensionA - > ExtensionB

Ekstensi apa pun yang tidak ditentukan dalam urutan provisi yang ditentukan dapat diprovisikan kapan saja, termasuk sebelum, sesudah, atau selama urutan yang ditentukan. Urutan ekstensi hanya menentukan bahwa ekstensi tertentu akan diprovisikan setelah ekstensi tertentu lainnya. Hal in tidak berdampak pada provisi ekstensi lain yang ditentukan dalam model.

Misalnya, jika model set skala Anda memiliki tiga ekstensi - Ekstensi A, Ekstensi B dan Ekstensi C - yang ditentukan dalam model, dan Ekstensi C diatur untuk diprovisikan setelah Ekstensi A, salah satu urutan provisi berikut dapat terjadi:

  • ExtensionA -> ExtensionC -> ExtensionB
  • ExtensionB -> ExtensionA -> ExtensionC
  • ExtensionA -> ExtensionB -> ExtensionC

Jika Anda perlu memastikan bahwa tidak ada ekstensi lain yang diprovisikan saat urutan ekstensi yang ditentukan sedang dieksekusi, sebaiknya Anda mengurutkan semua ekstensi dalam model set skala Anda. Dalam contoh di atas, Ekstensi B dapat diatur untuk diprovisikan setelah Ekstensi C sehingga hanya satu urutan yang dapat terjadi:

  • ExtensionA -> ExtensionC -> ExtensionB

Jika harus menggunakan pengurutan ekstensi

Untuk mengurutkan provisi ekstensi, Anda harus memperbarui definisi ekstensi dalam model set skala untuk menyertakan properti "provisionAfterExtensions", yang menerima berbagai nama ekstensi. Ekstensi yang disebutkan dalam nilai array properti harus sepenuhnya ditentukan dalam model set skala.

Penyebaran Templat

Contoh berikut menentukan templat tempat set skala memiliki tiga ekstensi - ExtensionA, ExtensionB, dan ExtensionC - sehingga ekstensi diprovisikan dalam urutan berikut:

  • ExtensionA -> ExtensionB -> ExtensionC
"virtualMachineProfile": {
  "extensionProfile": {
    "extensions": [
      {
        "name": "ExtensionA",
        "properties": {
          "publisher": "ExtensionA.Publisher",
          "settings": {},
          "typeHandlerVersion": "1.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionA"
        }
      },
      {
        "name": "ExtensionB",
        "properties": {
          "provisionAfterExtensions": [
            "ExtensionA"
          ],
          "publisher": "ExtensionB.Publisher",
          "settings": {},
          "typeHandlerVersion": "2.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionB"
        }
      }, 
      {
        "name": "ExtensionC",
        "properties": {
          "provisionAfterExtensions": [
            "ExtensionB"
          ],
          "publisher": "ExtensionC.Publisher",
          "settings": {},
          "typeHandlerVersion": "3.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionC"                   
        }
      }
    ]
  }
}

Karena properti "provisionAfterExtensions" menerima berbagai nama ekstensi, contoh di atas dapat dimodifikasi sedemikian rupa sehingga ExtensionC diprovisikan setelah ExtensionA dan ExtensionB, tetapi tidak ada pengurutan yang diperlukan antara ExtensionA dan ExtensionB. Templat berikut dapat digunakan untuk mencapai skenario ini:

"virtualMachineProfile": {
  "extensionProfile": {
    "extensions": [
      {
        "name": "ExtensionA",
        "properties": {
          "publisher": "ExtensionA.Publisher",
          "settings": {},
          "typeHandlerVersion": "1.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionA"
        }
      },
      {
        "name": "ExtensionB",
        "properties": {
          "publisher": "ExtensionB.Publisher",
          "settings": {},
          "typeHandlerVersion": "2.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionB"
        }
      }, 
      {
        "name": "ExtensionC",
        "properties": {
          "provisionAfterExtensions": [
            "ExtensionA","ExtensionB"
          ],
          "publisher": "ExtensionC.Publisher",
          "settings": {},
          "typeHandlerVersion": "3.0",
          "autoUpgradeMinorVersion": true,
          "type": "ExtensionC"                   
        }
      }
    ]
  }
}

REST API

Contoh berikut menambahkan ekstensi baru bernama ExtensionC ke model set skala. ExtensionC memiliki ketergantungan terhadap ExtensionA dan ExtensionB, yang telah ditentukan dalam model set skala.

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/extensions/ExtensionC?api-version=2018-10-01`
{ 
  "name": "ExtensionC",
  "properties": {
    "provisionAfterExtensions": [
      "ExtensionA","ExtensionB"
    ],
    "publisher": "ExtensionC.Publisher",
    "settings": {},
    "typeHandlerVersion": "3.0",
    "autoUpgradeMinorVersion": true,
    "type": "ExtensionC" 
  }                  
}

Jika ExtensionC ditentukan sebelumnya dalam model set skala dan Sekarang Anda ingin menambahkan dependensinya, Anda dapat menjalankan PATCH untuk mengedit properti ekstensi yang sudah disebarkan.

PATCH on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/extensions/ExtensionC?api-version=2018-10-01`
{ 
  "properties": {
    "provisionAfterExtensions": [
      "ExtensionA","ExtensionB"
    ]
  }                  
}

Perubahan pada instans set skala yang ada diterapkan pada peningkatan berikutnya.

Azure PowerShell

Gunakan cmdlet Add-AzVmssExtension untuk menambahkan ekstensi Application Health ke definisi model set skala. Urutan ekstensi memerlukan penggunaan Az PowerShell 1.2.0 atau yang lebih baru.

Contoh berikut menambahkan ekstensi Application Health ke extensionProfile dalam model set skala dari set skala berbasis Windows. Ekstensi Application Health akan diprovisikan setelah memprovisikan Ekstensi Skrip Kustom, yang sudah ditentukan dalam set skala.

# Define the scale set variables
$vmScaleSetName = "myVMScaleSet"
$vmScaleSetResourceGroup = "myVMScaleSetResourceGroup"

# Define the Application Health extension properties
$publicConfig = @{"protocol" = "http"; "port" = 80; "requestPath" = "/healthEndpoint"};
$extensionName = "myHealthExtension"
$extensionType = "ApplicationHealthWindows"
$publisher = "Microsoft.ManagedServices"

# Get the scale set object
$vmScaleSet = Get-AzVmss `
  -ResourceGroupName $vmScaleSetResourceGroup `
  -VMScaleSetName $vmScaleSetName

# Add the Application Health extension to the scale set model
Add-AzVmssExtension -VirtualMachineScaleSet $vmScaleSet `
  -Name $extensionName `
  -Publisher $publisher `
  -Setting $publicConfig `
  -Type $extensionType `
  -TypeHandlerVersion "1.0" `
  -ProvisionAfterExtension "CustomScriptExtension" `
  -AutoUpgradeMinorVersion $True

# Update the scale set
Update-AzVmss -ResourceGroupName $vmScaleSetResourceGroup `
  -Name $vmScaleSetName `
  -VirtualMachineScaleSet $vmScaleSet

Azure CLI 2.0

Gunakan az vmss extension set untuk menambahkan ekstensi Application Health ke definisi model set skala. Pengurutan ekstensi memerlukan penggunaan Azure CLI 2.0.55 atau yang lebih baru.

Contoh berikut menambahkan ekstensi Application Health ke dalam model set skala dari set skala berbasis Windows. Ekstensi Application Health akan diprovisikan setelah memprovisikan Ekstensi Skrip Kustom, yang sudah ditentukan dalam set skala.

az vmss extension set \
  --name ApplicationHealthWindows \
  --publisher Microsoft.ManagedServices \
  --version 1.0 \
  --resource-group <myVMScaleSetResourceGroup> \
  --vmss-name <myVMScaleSet> \
  --provision-after-extensions CustomScriptExtension \
  --settings ./extension.json

Pecahkan masalah

Tidak dapat menambahkan ekstensi dengan dependensi?

  1. Pastikan bahwa ekstensi yang ditentukan dalam provisionAfterExtensions ditentukan dalam model set skala.
  2. Pastikan tidak ada ketergantungan melingkar yang digunakan. Misalnya, urutan berikut tidak diizinkan: ExtensionA -> ExtensionB -> ExtensionC -> ExtensionA
  3. Pastikan bahwa ekstensi apa pun yang Anda ambil ketergantungannya memiliki properti "pengaturan" pada bagian ekstensi "properti". Misalnya, jika ExtentionB harus diprovisikan setelah ExtensionA, ExtensionA harus memiliki bidang "pengaturan" di bagian "properti" ExtensionA. Anda dapat menentukan properti "pengaturan" kosong jika ekstensi tidak mewajibkan pengaturan yang diperlukan.

Tak dapat menghapus ekstensi?

Pastikan bahwa ekstensi yang dihapus tidak tercantum dalam provisionAfterExtensions untuk ekstensi lainnya.

Langkah berikutnya

Pelajari cara menyebarkan aplikasi Anda di Virtual Machine Scale Sets.