Condividi tramite


Provisioning delle estensioni della sequenza in set di scalabilità di macchine virtuali

Le estensioni di macchine virtuali di Azure offrono funzionalità come la configurazione e la gestione post-distribuzione, il monitoraggio, la sicurezza e altro ancora. In genere, le distribuzioni di produzione usano una combinazione di più estensioni configurate per le istanze di macchine virtuali per ottenere risultati desiderati.

Quando si usano più estensioni in una macchina virtuale, è importante assicurarsi che le estensioni che richiedono le stesse risorse del sistema operativo non tentino di acquisire queste risorse nello stesso momento. Alcune estensioni, inoltre, dipendono da altre estensioni per fornire le configurazioni richieste, come le impostazioni di ambiente e i segreti. Senza l'ordinamento e la sequenza corretti, le distribuzioni di estensioni dipendenti possono avere esito negativo.

Questo articolo illustra in dettaglio come configurare le estensioni della sequenza per le istanze della macchina virtuale in set di scalabilità di macchine virtuali.

Prerequisiti

Questo articolo presuppone che l'utente abbia familiarità con gli argomento seguenti:

Quando usare la sequenziazione delle estensioni

La sequenziazione delle estensioni non è obbligatoria per i set di scalabilità e, se non diversamente specificato, è possono eseguire il provisioning delle estensioni in un'istanza del set di scalabilità in qualsiasi ordine.

Ad esempio, se nel modello del set di scalabilità sono specificate le due estensioni EstensioneA ed EstensioneB, può essere usata una delle sequenze di provisioning seguenti:

  • ExtensionA -> ExtensionB
  • ExtensionB -> ExtensionA

Se l'applicazione richiede che il provisioning dell'estensione A venga sempre eseguito prima dell'estensione B, è consigliabile usare la sequenziazione delle estensioni come descritto in questo articolo. Con la sequenziazione delle estensioni verrà usata una sola sequenza:

  • ExtensionA - > ExtensionB

Qualsiasi estensione non specificata in una sequenza di provisioning definita può essere sottoposta a provisioning in qualsiasi momento, sia prima, che dopo o durante una sequenza definita. La sequenziazione delle estensioni specifica solo che il provisioning di un'estensione specifica verrà eseguito dopo un'altra estensione specifica e non ha effetti sul provisioning di qualsiasi altra estensione definita nel modello.

Ad esempio, se nel modello del set di scalabilità sono specificate tre estensioni (EstensioneA, EstensioneB ed EstensioneC) e il provisioning dell'estensione C è impostato per essere eseguito dopo quello dell'estensione A, può essere usata una delle sequenze di provisioning seguenti:

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

Se è necessario assicurarsi che non venga eseguito il provisioning di altre estensioni durante l'esecuzione della sequenza definita, è consigliabile impostare la sequenziazione di tutte le estensioni nel modello del set di scalabilità. Nell'esempio precedente è possibile impostare il provisioning dell'estensione B dopo quello dell'estensione C in modo che possa essere usata solo una sequenza:

  • ExtensionA - ExtensionC ->> ExtensionB

Come usare la sequenziazione delle estensioni

Per la sequenziazione del provisioning, è necessario aggiornare la definizione delle estensioni nel modello del set di scalabilità per includere la proprietà "provisionAfterExtensions", che accetta una matrice di nomi di estensione. Le estensioni indicate nel valore della matrice della proprietà devono essere definite in modo completo nel modello del set di scalabilità.

Distribuzione di modelli

L'esempio seguente definisce un modello in cui il set di scalabilità ha tre estensioni (EstensioneA, EstensioneB ed EstensioneC) e il provisioning delle estensioni viene eseguito nell'ordine:

  • 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"                   
        }
      }
    ]
  }
}

Dato che la proprietà "provisionAfterExtensions" accetta una matrice di nomi di estensione, l'esempio precedente può essere modificato in modo che il provisioning di EstensioneC venga eseguito dopo EstensioneA ed EstensioneB, ma senza richiedere l'ordinamento per EstensioneA ed EstensioneB. Il modello seguente può essere usato per realizzare questo scenario:

"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"                   
        }
      }
    ]
  }
}

API REST

L'esempio seguente aggiunge una nuova estensione denominata EstensioneC a un modello del set di scalabilità. L'estensione C ha dipendenze dalle estensioni A e B, già definite nel modello del set di scalabilità.

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

Se l'estensione C è stata definita in precedenza nel modello del set di scalabilità e ora si vogliono aggiungere le relative dipendenze, è possibile eseguire un'operazione PATCH per modificare le proprietà dell'estensione già distribuita.

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

Le modifiche alle istanze del set di scalabilità esistenti vengono applicate in occasione dell'aggiornamento successivo.

Azure PowerShell

Usare il cmdlet Add-AzVmssExtension per aggiungere l'estensione Integrità applicazione alla definizione del modello del set di scalabilità. Per la sequenziazione delle estensioni è richiesto l'uso di Az PowerShell 1.2.0 o versione successiva.

L'esempio seguente aggiunge l'estensione Integrità applicazione a extensionProfile in un modello di un set di scalabilità basato su Windows. Il provisioning dell'estensione Integrità applicazione verrà eseguito dopo il provisioning dell'estensione Script personalizzato, già definita nel set di scalabilità.

# 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

Interfaccia della riga di comando di Azure 2.0

Usare az vmss extension set per aggiungere l'estensione Integrità applicazione alla definizione del modello del set di scalabilità. Per la sequenziazione delle estensioni è richiesto l'uso dell'interfaccia della riga di comando di Azure versione 2.0.55 o successiva.

L'esempio seguente aggiunge l'estensione Integrità applicazioneal modello di un set di scalabilità basato su Windows. Il provisioning dell'estensione Integrità applicazione verrà eseguito dopo il provisioning dell'estensione Script personalizzato, già definita nel set di scalabilità.

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

Risolvere problemi

Non è possibile aggiungere un'estensione con dipendenze?

  1. Verificare che le estensioni specificate in provisionAfterExtensions siano definite nel modello del set di scalabilità.
  2. Assicurarsi che non siano state introdotte dipendenze circolari. Ad esempio, la sequenza seguente non è consentita: ExtensionA - ExtensionB> - ExtensionC> -> ExtensionA - ExtensionA
  3. Assicurarsi che tutte le estensioni con dipendenze abbiano una proprietà "settings" in "properties". Ad esempio, se è necessario eseguire il provisioning di EstensioneB dopo EstensioneA, per EstensioneA deve essere disponibile il campo "settings" in "properties" di EstensioneA. È possibile specificare una proprietà "settings" vuota se l'estensione non richiede impostazioni obbligatorie.

Non è possibile rimuovere le estensioni?

Assicurarsi che le estensioni da rimuovere non siano elencate in provisionAfterExtensions per altre estensioni.

Passaggi successivi

Informazioni su come distribuire l'applicazione in set di scalabilità di macchine virtuali.