Aprowizowanie rozszerzenia sekwencji w zestawach skalowania maszyn wirtualnych

Rozszerzenia maszyn wirtualnych platformy Azure zapewniają funkcje, takie jak konfiguracja i zarządzanie po wdrożeniu, monitorowanie, zabezpieczenia i nie tylko. Wdrożenia produkcyjne zwykle używają kombinacji wielu rozszerzeń skonfigurowanych dla wystąpień maszyn wirtualnych w celu uzyskania pożądanych wyników.

W przypadku korzystania z wielu rozszerzeń na maszynie wirtualnej należy upewnić się, że rozszerzenia wymagające tych samych zasobów systemu operacyjnego nie próbują jednocześnie uzyskać tych zasobów. Niektóre rozszerzenia zależą również od innych rozszerzeń, aby zapewnić wymagane konfiguracje, takie jak ustawienia środowiska i wpisy tajne. Bez prawidłowego porządkowania i sekwencjonowania wdrożenia rozszerzenia zależnego mogą zakończyć się niepowodzeniem.

W tym artykule opisano sposób konfigurowania rozszerzeń sekwencji dla wystąpień maszyn wirtualnych w zestawach skalowania maszyn wirtualnych.

Wymagania wstępne

W tym artykule założono, że znasz następujące elementy:

Kiedy należy używać sekwencjonowania rozszerzeń

Rozszerzenia sekwencjonowania nie są obowiązkowe dla zestawów skalowania i o ile nie określono, rozszerzenia można aprowizować w wystąpieniu zestawu skalowania w dowolnej kolejności.

Jeśli na przykład model zestawu skalowania ma dwa rozszerzenia — ExtensionA i ExtensionB — określone w modelu, może wystąpić jedną z następujących sekwencji aprowizacji:

  • ExtensionA —> ExtensionB
  • ExtensionB —> ExtensionA

Jeśli aplikacja wymaga, aby rozszerzenie A było zawsze aprowizowane przed rozszerzeniem B, należy użyć sekwencjonowania rozszerzeń zgodnie z opisem w tym artykule. W przypadku sekwencjonowania rozszerzeń zostanie wykonana tylko jedna sekwencja:

  • ExtensionA — > ExtensionB

Wszelkie rozszerzenia, które nie zostały określone w zdefiniowanej sekwencji aprowizacji, można aprowizować w dowolnym momencie, w tym przed, po lub podczas zdefiniowanej sekwencji. Sekwencjonowanie rozszerzeń określa tylko, że określone rozszerzenie zostanie aprowidowane po innym konkretnym rozszerzeniu. Nie ma to wpływu na aprowizację żadnego innego rozszerzenia zdefiniowanego w modelu.

Jeśli na przykład model zestawu skalowania ma trzy rozszerzenia — rozszerzenie A, rozszerzenie B i rozszerzenie C — określone w modelu, a rozszerzenie C zostanie ustawione na aprowizację po rozszerzeniu A, może wystąpić jeden z następujących sekwencji aprowizacji:

  • ExtensionA —> ExtensionC —> ExtensionB
  • ExtensionB —> ExtensionA —> ExtensionC
  • ExtensionA —> ExtensionB —> ExtensionC

Jeśli musisz upewnić się, że żadne inne rozszerzenie nie jest aprowidowane podczas wykonywania zdefiniowanej sekwencji rozszerzeń, zalecamy sekwencjonowanie wszystkich rozszerzeń w modelu zestawu skalowania. W powyższym przykładzie można ustawić obsługę administracyjną rozszerzenia B po rozszerzeniu C, tak aby mogła wystąpić tylko jedna sekwencja:

  • ExtensionA —> ExtensionC —> ExtensionB

Jak używać sekwencjonowania rozszerzeń

Aby aprowizować rozszerzenia sekwencji, należy zaktualizować definicję rozszerzenia w modelu zestawu skalowania, aby uwzględnić właściwość "provisionAfterExtensions", która akceptuje tablicę nazw rozszerzeń. Rozszerzenia wymienione w wartości tablicy właściwości muszą być w pełni zdefiniowane w modelu zestawu skalowania.

Wdrażanie szablonu

W poniższym przykładzie zdefiniowano szablon, w którym zestaw skalowania ma trzy rozszerzenia — ExtensionA, ExtensionB i ExtensionC — tak aby rozszerzenia zostały aprowidowane w kolejności:

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

Ponieważ właściwość "provisionAfterExtensions" akceptuje tablicę nazw rozszerzeń, powyższy przykład można zmodyfikować, tak aby rozszerzenie ExtensionC było aprowidowane po rozszerzeniach ExtensionA i ExtensionB, ale nie jest wymagane żadne porządkowanie między rozszerzeniami ExtensionA i ExtensionB. Do osiągnięcia tego scenariusza można użyć następującego szablonu:

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

Interfejs API REST

W poniższym przykładzie dodano nowe rozszerzenie o nazwie ExtensionC do modelu zestawu skalowania. RozszerzenieC ma zależności od rozszerzenia ExtensionA i ExtensionB, które zostały już zdefiniowane w modelu zestawu skalowania.

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

Jeśli rozszerzenie ExtensionC zostało zdefiniowane wcześniej w modelu zestawu skalowania i chcesz teraz dodać jego zależności, możesz wykonać polecenie , PATCH aby edytować już wdrożone właściwości rozszerzenia.

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

Zmiany istniejących wystąpień zestawu skalowania są stosowane podczas następnego uaktualnienia.

Azure PowerShell

Użyj polecenia cmdlet Add-AzVmssExtension, aby dodać rozszerzenie Application Health do definicji modelu zestawu skalowania. Sekwencjonowanie rozszerzeń wymaga użycia modułu Az PowerShell 1.2.0 lub nowszego.

W poniższym przykładzie dodano rozszerzenie Application Health do extensionProfile modelu w zestawie skalowania zestawu skalowania opartego na systemie Windows. Rozszerzenie Application Health zostanie aprowidowane po aprowizacji rozszerzenia niestandardowego skryptu zdefiniowanego już w zestawie skalowania.

# 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

Interfejs wiersza polecenia platformy Azure 2.0

Użyj polecenia az vmss extension set , aby dodać rozszerzenie Application Health do definicji modelu zestawu skalowania. Sekwencjonowanie rozszerzeń wymaga użycia interfejsu wiersza polecenia platformy Azure w wersji 2.0.55 lub nowszej.

W poniższym przykładzie dodano rozszerzenie Application Health do modelu zestawu skalowania zestawu skalowania opartego na systemie Windows. Rozszerzenie Application Health zostanie aprowidowane po aprowizacji rozszerzenia niestandardowego skryptu zdefiniowanego już w zestawie skalowania.

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

Rozwiązywanie problemów

Nie można dodać rozszerzenia z zależnościami?

  1. Upewnij się, że rozszerzenia określone w parametrze provisionAfterExtensions są zdefiniowane w modelu zestawu skalowania.
  2. Upewnij się, że nie są wprowadzane żadne zależności cykliczne. Na przykład następująca sekwencja nie jest dozwolona: ExtensionA —> ExtensionB —> ExtensionC —> ExtensionA
  3. Upewnij się, że wszystkie rozszerzenia, których zależności są zależne, mają właściwość "settings" w obszarze rozszerzenia "properties". Jeśli na przykład rozszerzenie ExtentionB musi zostać aprowidowane po rozszerzeniu A, rozszerzenie musi mieć pole "settings" w obszarze ExtensionA "properties". Można określić pustą właściwość "settings", jeśli rozszerzenie nie wymaga żadnych wymaganych ustawień.

Nie można usunąć rozszerzeń?

Upewnij się, że usuwane rozszerzenia nie są wymienione w obszarze provisionAfterExtensions dla innych rozszerzeń.

Następne kroki

Dowiedz się, jak wdrożyć aplikację w zestawach skalowania maszyn wirtualnych.