Bereitstellen des Sequenzierens von Erweiterungen in VM-Skalierungsgruppen

Azure-VM-Erweiterungen bieten Funktionen wie die Konfiguration nach der Bereitstellung sowie Verwaltung, Überwachung, Sicherheit und vieles mehr. Bei Produktionsbereitstellungen wird in der Regel eine Kombination von mehreren Erweiterungen verwendet, die so konfiguriert sind, dass die VM-Instanzen die gewünschten Ergebnisse erzielen.

Wenn Sie mehrere Erweiterungen auf einem virtuellen Computer verwenden, müssen Sie sicherstellen, dass Erweiterungen, die die gleichen Betriebssystemressourcen erfordern, nicht versuchen, diese Ressourcen gleichzeitig abzurufen. Einige Erweiterungen hängen auch davon ab, dass andere Erweiterungen die erforderlichen Konfigurationen bereitstellen, wie z.B. Umgebungseinstellungen und Geheimnisse. Ohne die richtige Reihenfolge und Sequenzierung können bei abhängigen Erweiterungsbereitstellungen Fehler auftreten.

In diesem Artikel wird erläutert, wie Sie Erweiterungen sequenzieren können, die für die VM-Instanzen in VM-Skalierungsgruppen konfiguriert werden sollen.

Voraussetzungen

In diesem Artikel wird davon ausgegangen, dass Sie mit Folgendem vertraut sind:

Anwendungsfälle für die Erweiterungssequenzierung

Das Sequenzieren von Erweiterungen ist für Skalierungsgruppen nicht obligatorisch, und sofern nicht anders angegeben, können Erweiterungen auf einer Skalierungsgruppeninstanz in beliebiger Reihenfolge bereitgestellt werden.

Wenn Ihr Skalierungsgruppenmodell beispielsweise über zwei im Modell angegebene Erweiterungen verfügt – ExtensionA und ExtensionB – dann kann eine der folgenden Bereitstellungssequenzen auftreten:

  • ExtensionA -> ExtensionB
  • ExtensionB -> ExtensionA

Wenn Ihre Anwendung erfordert, dass ExtensionA immer vor ExtensionB bereitzustellen ist, sollten Sie die Erweiterungssequenzierung wie in diesem Artikel beschrieben verwenden. Mit der Erweiterungssequenzierung erfolgt jetzt nur eine einzige Sequenz:

  • ExtensionA – > ExtensionB

Alle Erweiterungen, die nicht in einer definierten Bereitstellungssequenz angegeben sind, können jederzeit, auch vor, nach oder während einer definierten Sequenz bereitgestellt werden. Erweiterungssequenzierung gibt nur an, dass eine spezifische Erweiterung nach einer anderen spezifischen Erweiterung bereitgestellt wird. Sie hat keine Auswirkungen auf die Bereitstellung einer anderen im Modell definierten Erweiterung.

Wenn Ihr Skalierungsgruppenmodell z.B. über drei im Modell angegebene Erweiterungen verfügt – ExtensionA, ExtensionB und ExtensionC – und für ExtensionC wird festgelegt, dass sie nach ExtensionA bereitgestellt wird, kann eine der folgenden Bereitstellungssequenzen auftreten:

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

Wenn Sie sicherstellen müssen, dass keine andere Erweiterung bereitgestellt wird, während die definierte Erweiterungssequenz ausgeführt wird, sollten Sie alle Erweiterungen in Ihrem Skalierungsgruppenmodell sequenzieren. Im obigen Beispiel kann für ExtensionB festgelegt werden, dass sie nach der ExtensionC bereitgestellt wird, sodass nur eine einzige Sequenz auftreten kann:

  • ExtensionA -> ExtensionC -> ExtensionB

Durchführung der Erweiterungssequenzierung

Zur Bereitstellung der Erweiterungssequenzierung müssen Sie die Erweiterungsdefinition im Skalierungsgruppenmodell derart aktualisieren, dass die Eigenschaft provisionAfterExtensions einbezogen wird, die ein Array von Erweiterungsnamen akzeptiert. Die im Eigenschaftsarraywert erwähnten Erweiterungen müssen im Skalierungsgruppenmodell vollständig definiert werden.

Bereitstellung mit Vorlagen

Das folgende Beispiel definiert eine Vorlage, in der die Skalierungsgruppe über drei Erweiterungen verfügt – ExtensionA, ExtensionB und ExtensionC – sodass Erweiterungen in dieser Reihenfolge bereitgestellt werden:

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

Da die Eigenschaft „provisionAfterExtensions“ ein Array von Erweiterungsnamen akzeptiert, kann das obige Beispiel derart geändert werden, dass ExtensionC nach ExtensionA und ExtensionB bereitgestellt wird, aber die Reihenfolge von ExtensionA und ExtensionB gleichgültig ist. Die folgende Vorlage kann zum Umsetzen dieses Szenarios verwendet werden:

"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

Im folgenden Beispiel wird eine neue Erweiterung mit dem Namen ExtensionC einem Skalierungsgruppenmodell hinzugefügt. ExtensionC ist von ExtensionA und ExtensionB abhängig, die bereits im Skalierungsgruppenmodell definiert wurden.

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

Wenn ExtensionC zuvor im Skalierungsgruppenmodell definiert wurde, und Sie jetzt ihre Abhängigkeiten hinzufügen möchten, können Sie einen PATCH ausführen, um die bereits bereitgestellten Eigenschaften der Erweiterung zu bearbeiten.

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

Änderungen an vorhandenen Skalierungsgruppeninstanzen werden auf das nächste Aktualisieren von virtuellen Computern auf das aktuelle Skalierungsgruppenmodell angewendet.

Azure PowerShell

Verwenden Sie das Add-AzVmssExtension-Cmdlet, um die Application Health-Erweiterung der Skalierungsgruppenmodell-Definition hinzuzufügen. Erweiterungssequenzierung setzt die Verwendung von Azure PowerShell 1.2.0 oder höher voraus.

Im folgenden Beispiel wird die Application Health-Erweiterung dem extensionProfile im Skalierungsgruppenmodell einer Windows-basierten Skalierungsgruppe hinzugefügt. Die Application Health-Erweiterung wird nach der Bereitstellung der CustomScript-Erweiterung für Windows bereitgestellt, die bereits in der Skalierungsgruppe definiert ist.

# 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

Verwenden Sie az vmss extension set, um die Application Health-Erweiterung der Skalierungsgruppen-Modelldefinition hinzuzufügen. Erweiterungssequenzierung setzt die Verwendung von Azure CLI 2.0.55 oder höher voraus.

Im folgenden Beispiel wird die Application Health-Erweiterung dem Skalierungsgruppenmodell einer Windows-basierten Skalierungsgruppe hinzugefügt. Die Application Health-Erweiterung wird nach der Bereitstellung der CustomScript-Erweiterung für Windows bereitgestellt, die bereits in der Skalierungsgruppe definiert ist.

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

Problembehandlung

Sie können keine Erweiterung mit Abhängigkeiten hinzufügen?

  1. Stellen Sie sicher, dass die in provisionAfterExtensions angegebenen Erweiterungen im Skalierungsgruppenmodell definiert sind.
  2. Stellen Sie sicher, dass keine zirkulären Abhängigkeiten eingeführt werden. Die folgende Sequenz ist beispielsweise nicht zulässig: ExtensionA > ExtensionB > ExtensionC > ExtensionA
  3. Stellen Sie sicher, dass alle Erweiterungen, von denen Abhängigkeiten bestehen sollen, über eine Eigenschaft „settings“ unter „properties“ verfügen. Wenn z.B. ExtensionB nach ExtensionA bereitgestellt werden muss, dann muss unter „properties“ für ExtensionA das Feld „settings“ vorhanden sein. Sie können eine leere „settings“-Eigenschaft angeben, wenn die Erweiterung keine erforderlichen Einstellungen voraussetzt.

Sie können keine Erweiterungen entfernen?

Stellen Sie sicher, dass die Erweiterungen, die entfernt werden, nicht unter provisionAfterExtensions für andere Erweiterungen aufgeführt werden.

Nächste Schritte

Informieren Sie sich über das Bereitstellen Ihrer Anwendung in Virtual Machine Scale Sets.