Partilhar via


Provisionamento de extensão de sequência em conjuntos de escala de máquina virtual

As extensões de máquina virtual do Azure fornecem recursos como configuração e gerenciamento pós-implantação, monitoramento, segurança e muito mais. As implantações de produção normalmente usam uma combinação de várias extensões configuradas para as instâncias de VM para obter os resultados desejados.

Ao usar várias extensões em uma máquina virtual, é importante garantir que as extensões que exigem os mesmos recursos do sistema operacional não estejam tentando adquirir esses recursos ao mesmo tempo. Algumas extensões também dependem de outras extensões para fornecer as configurações necessárias, como configurações de ambiente e segredos. Sem a ordenação e o sequenciamento corretos, as implantações de extensão dependentes podem falhar.

Este artigo detalha como você pode sequenciar extensões a serem configuradas para as instâncias de VM em Conjuntos de Dimensionamento de Máquina Virtual.

Pré-requisitos

Este artigo pressupõe que você esteja familiarizado com:

Quando usar o sequenciamento de extensão

As extensões de sequenciamento não são obrigatórias para conjuntos de escala e, a menos que especificado, as extensões podem ser provisionadas em uma instância de conjunto de escala em qualquer ordem.

Por exemplo, se o modelo do conjunto de escala tiver duas extensões – ExtensionA e ExtensionB – especificadas no modelo, uma das seguintes sequências de provisionamento poderá ocorrer:

  • ExtensãoA -> ExtensãoB
  • ExtensãoB -> ExtensãoA

Se o seu aplicativo exigir que a Extensão A seja sempre provisionada antes da Extensão B, você deverá usar o sequenciamento de extensão conforme descrito neste artigo. Com o sequenciamento de extensão, apenas uma sequência ocorrerá agora:

  • ExtensãoA - > ExtensãoB

Quaisquer extensões não especificadas em uma sequência de provisionamento definida podem ser provisionadas a qualquer momento, inclusive antes, depois ou durante uma sequência definida. O sequenciamento de extensão especifica apenas que uma extensão específica será provisionada após outra extensão específica. Isso não afeta o provisionamento de qualquer outra extensão definida no modelo.

Por exemplo, se o modelo do conjunto de escala tiver três extensões – Extensão A, Extensão B e Extensão C – especificadas no modelo e a Extensão C estiver definida para ser provisionada após a Extensão A, poderá ocorrer uma das seguintes sequências de provisionamento:

  • ExtensãoA -> ExtensãoC -> ExtensãoB
  • ExtensãoB -> ExtensãoA -> ExtensãoC
  • ExtensãoA -> ExtensãoB -> ExtensãoC

Se você precisar garantir que nenhuma outra extensão seja provisionada enquanto a sequência de extensão definida estiver em execução, recomendamos o sequenciamento de todas as extensões em seu modelo de conjunto de escala. No exemplo acima, a Extensão B pode ser definida para ser provisionada após a Extensão C, de modo que apenas uma sequência possa ocorrer:

  • ExtensãoA -> ExtensãoC -> ExtensãoB

Como usar o sequenciamento de extensão

Para sequenciar o provisionamento de extensão, você deve atualizar a definição de extensão no modelo de conjunto de escala para incluir a propriedade "provisionAfterExtensions", que aceita uma matriz de nomes de extensão. As extensões mencionadas no valor da matriz de propriedades devem ser totalmente definidas no modelo de conjunto de escala.

Implantação de modelo

O exemplo a seguir define um modelo em que o conjunto de escala tem três extensões – ExtensionA, ExtensionB e ExtensionC – de modo que as extensões sejam provisionadas na ordem:

  • ExtensãoA -> ExtensãoB -> ExtensãoC
"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"                   
        }
      }
    ]
  }
}

Como a propriedade "provisionAfterExtensions" aceita uma matriz de nomes de extensão, o exemplo acima pode ser modificado de modo que ExtensionC seja provisionado após ExtensionA e ExtensionB, mas nenhuma ordenação é necessária entre ExtensionA e ExtensionB. O modelo a seguir pode ser usado para alcançar esse cenário:

"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

O exemplo a seguir adiciona uma nova extensão chamada ExtensionC a um modelo de conjunto de escala. ExtensionC tem dependências em ExtensionA e ExtensionB, que já foram definidas no modelo de conjunto de escala.

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 ExtensionC foi definido anteriormente no modelo de conjunto de escala e agora você deseja adicionar suas dependências, você pode executar um PATCH para editar as propriedades da extensão já implantada.

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

As alterações nas instâncias do conjunto de dimensionamento existentes são aplicadas na próxima atualização.

Azure PowerShell

Use o cmdlet Add-AzVmssExtension para adicionar a extensão Application Health à definição do modelo do conjunto de escalas. O sequenciamento de extensão requer o uso do Az PowerShell 1.2.0 ou superior.

O exemplo a seguir adiciona a extensão Application Health ao extensionProfile modelo em um conjunto de escala de um conjunto de escala baseado no Windows. A extensão de Integridade do Aplicativo será provisionada após o provisionamento da Extensão de Script Personalizado, já definida no conjunto de escalas.

# 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

CLI 2.0 do Azure

Use az vmss extension set para adicionar a extensão Application Health à definição do modelo do conjunto de escalas. O sequenciamento de extensão requer o uso da CLI do Azure 2.0.55 ou superior.

O exemplo a seguir adiciona a extensão Application Health ao modelo de conjunto de escala de um conjunto de escala baseado no Windows. A extensão de Integridade do Aplicativo será provisionada após o provisionamento da Extensão de Script Personalizado, já definida no conjunto de escalas.

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

Resolver problemas

Não consegue adicionar extensão com dependências?

  1. Certifique-se de que as extensões especificadas em provisionAfterExtensions estejam definidas no modelo de conjunto de escala.
  2. Certifique-se de que não há dependências circulares sendo introduzidas. Por exemplo, a seguinte sequência não é permitida: ExtensionA -> ExtensionB -> ExtensionC -> ExtensionA
  3. Certifique-se de que todas as extensões nas quais você tenha dependências tenham uma propriedade "settings" em extension "properties". Por exemplo, se ExtentionB precisa ser provisionado após ExtensionA, então ExtensionA deve ter o campo "configurações" em ExtensionA "properties". Você pode especificar uma propriedade "configurações" vazia se a extensão não exigir nenhuma configuração necessária.

Não consegue remover extensões?

Certifique-se de que as extensões que estão sendo removidas não estejam listadas em provisionAfterExtensions para quaisquer outras extensões.

Próximos passos

Saiba como implantar seu aplicativo em conjuntos de dimensionamento de máquina virtual.