Delen via


Sequentie-extensie inrichten in virtuele-machineschaalsets

Extensies van virtuele Azure-machines bieden mogelijkheden zoals configuratie en beheer na implementatie, bewaking, beveiliging en meer. Productie-implementaties maken doorgaans gebruik van een combinatie van meerdere extensies die zijn geconfigureerd voor de VM-exemplaren om de gewenste resultaten te bereiken.

Wanneer u meerdere extensies op een virtuele machine gebruikt, is het belangrijk om ervoor te zorgen dat extensies die dezelfde besturingssysteembronnen vereisen, deze resources niet tegelijkertijd proberen te verkrijgen. Sommige extensies zijn ook afhankelijk van andere extensies om vereiste configuraties te bieden, zoals omgevingsinstellingen en geheimen. Zonder de juiste volgorde en sequentiëren kunnen afhankelijke extensie-implementaties mislukken.

In dit artikel wordt beschreven hoe u extensies kunt sequentieeren die moeten worden geconfigureerd voor de VM-exemplaren in virtuele-machineschaalsets.

Vereisten

In dit artikel wordt ervan uitgegaan dat u bekend bent met:

Wanneer moet u extensievolgorde gebruiken

Sequentiërende extensies zijn niet verplicht voor schaalsets en, tenzij opgegeven, kunnen extensies in elke volgorde worden ingericht op een exemplaar van een schaalset.

Als uw schaalsetmodel bijvoorbeeld twee extensies heeft: ExtensionA en ExtensionB, die zijn opgegeven in het model, kunnen er een van de volgende inrichtingsreeksen optreden:

  • ExtensionA -> ExtensionB
  • ExtensionB -> ExtensionA

Als voor uw toepassing extensie A moet worden ingericht vóór Extensie B, moet u extensievolgorde gebruiken zoals beschreven in dit artikel. Bij het sequentiëren van extensies wordt er nu slechts één reeks uitgevoerd:

  • ExtensionA - > ExtensionB

Extensies die niet zijn opgegeven in een gedefinieerde inrichtingsreeks, kunnen op elk gewenst moment worden ingericht, inclusief vóór, na of tijdens een gedefinieerde reeks. Extensievolgorde geeft alleen aan dat een specifieke extensie wordt ingericht na een andere specifieke extensie. Dit heeft geen invloed op het inrichten van een andere extensie die in het model is gedefinieerd.

Als uw schaalsetmodel bijvoorbeeld drie extensies heeft: Extensie A, Extensie B en Extensie C, die zijn opgegeven in het model en Extensie C is ingesteld op inrichting na Extensie A, kunnen een van de volgende inrichtingsreeksen optreden:

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

Als u ervoor wilt zorgen dat er geen andere extensie wordt ingericht terwijl de gedefinieerde extensiereeks wordt uitgevoerd, raden we u aan om alle extensies in uw schaalsetmodel te sequentiëren. In het bovenstaande voorbeeld kan extensie B worden ingesteld om te worden ingericht na extensie C, zodat er slechts één reeks kan plaatsvinden:

  • ExtensionA -> ExtensionC -> ExtensionB

Extensievolgorde gebruiken

Als u het inrichten van de extensie wilt sequentieren, moet u de extensiedefinitie in het schaalsetmodel bijwerken om de eigenschap 'provisionAfterExtensions' op te nemen, die een matrix met extensienamen accepteert. De extensies die in de eigenschapmatrixwaarde worden genoemd, moeten volledig zijn gedefinieerd in het schaalsetmodel.

Sjabloonimplementatie

In het volgende voorbeeld wordt een sjabloon gedefinieerd waarbij de schaalset drie extensies heeft: ExtensionA, ExtensionB en ExtensionC, zodat extensies in de volgorde worden ingericht:

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

Omdat de eigenschap provisionAfterExtensions een matrix met extensienamen accepteert, kan het bovenstaande voorbeeld zodanig worden gewijzigd dat ExtensionC wordt ingericht na ExtensionA en ExtensionB, maar er geen volgorde is vereist tussen ExtensionA en ExtensionB. De volgende sjabloon kan worden gebruikt om dit scenario te bereiken:

"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

In het volgende voorbeeld wordt een nieuwe extensie met de naam ExtensionC toegevoegd aan een schaalsetmodel. ExtensionC heeft afhankelijkheden van ExtensionA en ExtensionB, die al zijn gedefinieerd in het schaalsetmodel.

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

Als ExtensionC eerder in het schaalsetmodel is gedefinieerd en u nu de afhankelijkheden wilt toevoegen, kunt u een PATCH opdracht uitvoeren om de eigenschappen van de reeds geïmplementeerde extensie te bewerken.

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

Wijzigingen in bestaande schaalsetexemplaren worden toegepast bij de volgende upgrade.

Azure PowerShell

Gebruik de cmdlet Add-AzVmssExtension om de Application Health-extensie toe te voegen aan de definitie van het schaalsetmodel. Voor extensievolgorde is het gebruik van Az PowerShell 1.2.0 of hoger vereist.

In het volgende voorbeeld wordt de Application Health-extensie toegevoegd aan het extensionProfile in een schaalsetmodel van een Windows-schaalset. De Application Health-extensie wordt ingericht na het inrichten van de aangepaste scriptextensie, die al is gedefinieerd in de schaalset.

# 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

Gebruik az vmss extension set om de Application Health-extensie toe te voegen aan de definitie van het schaalsetmodel. Voor extensievolgorde is het gebruik van Azure CLI 2.0.55 of hoger vereist.

In het volgende voorbeeld wordt de Extensie Application Health toegevoegd aan het schaalsetmodel van een Windows-schaalset. De Application Health-extensie wordt ingericht na het inrichten van de aangepaste scriptextensie, die al is gedefinieerd in de schaalset.

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

Problemen oplossen

Kunt u geen extensie toevoegen met afhankelijkheden?

  1. Zorg ervoor dat de extensies die zijn opgegeven in provisionAfterExtensions, zijn gedefinieerd in het schaalsetmodel.
  2. Zorg ervoor dat er geen kringafhankelijkheden worden geïntroduceerd. De volgende reeks is bijvoorbeeld niet toegestaan: ExtensionA -> ExtensionB -> ExtensionC -> ExtensionA
  3. Zorg ervoor dat alle extensies waarvoor u afhankelijkheden neemt, een eigenschap 'instellingen' hebben onder de extensie 'eigenschappen'. Als ExtentionB bijvoorbeeld moet worden ingericht na ExtensionA, moet ExtensionA het veld 'instellingen' hebben onder ExtensionA 'properties'. U kunt een lege eigenschap 'instellingen' opgeven als de extensie geen vereiste instellingen vereist.

Kunt u extensies niet verwijderen?

Zorg ervoor dat de extensies die worden verwijderd, niet worden vermeld onder provisionAfterExtensions voor andere extensies.

Volgende stappen

Meer informatie over het implementeren van uw toepassing op virtuele-machineschaalsets.