Sequentie-extensie inrichten in Virtual Machine Scale Sets

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 besturingssysteemresources vereisen, niet tegelijkertijd proberen deze resources 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ëring kunnen implementaties van afhankelijke extensies mislukken.

In dit artikel wordt beschreven hoe u extensies kunt sequentien die moeten worden geconfigureerd voor de VM-exemplaren in Virtual Machine Scale Sets.

Vereisten

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

Wanneer gebruikt u extensievolgorde?

Het sequentiëren van extensies in is niet verplicht voor schaalsets, en tenzij opgegeven, kunnen extensies in elke volgorde worden ingericht op een schaalsetexemplaar.

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

  • ExtensionA -> ExtensionB
  • ExtensionB -> ExtensionA

Als uw toepassing vereist dat extensie A altijd vóór extensie B wordt ingericht, moet u extensievolgorde gebruiken zoals beschreven in dit artikel. Met extensievolgorde vindt er nu slechts één reeks plaats:

  • 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 de inrichting van een andere extensie die in het model is gedefinieerd.

Als uw schaalsetmodel bijvoorbeeld drie extensies ( Extensie A, Extensie B en Extensie C ) heeft die zijn opgegeven in het model en Extensie C is ingesteld om te worden ingericht na Extensie A, kan 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 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 de inrichting van extensies wilt sequentieren, moet u de extensiedefinitie in het schaalsetmodel bijwerken met de eigenschap 'provisionAfterExtensions', die een matrix met extensienamen accepteert. De extensies die worden vermeld in de matrixwaarde van de eigenschap 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 is geen volgorde 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 uitvoeren om de eigenschappen van de al 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 de 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 het sequentiëren van extensies 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 met afhankelijkheden toevoegen?

  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 waarop u afhankelijkheden maakt, de eigenschap 'settings' hebben onder extensie 'properties'. Als bijvoorbeeld ExtentionB moet worden ingericht na ExtensieA, moet ExtensieA het veld 'instellingen' hebben onder ExtensieA 'eigenschappen'. U kunt een lege eigenschap 'settings' 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 Virtual Machine Scale Sets.