Resolver problemas de falhas de extensões de VM do Windows do Azure

Descrição Geral dos Modelos do Azure Resource Manager

Os modelos Azure Resource Manager permitem-lhe especificar de forma declarativa a infraestrutura IaaS do Azure em linguagem JSON, definindo as dependências entre os recursos.

Veja Criação de modelos de extensão para saber mais sobre a criação de modelos para utilizar extensões.

Neste artigo, aprenderemos sobre resolução de problemas de algumas das falhas de extensão de VM comuns.

Visualizando o status da extensão

Os modelos do Azure Resource Manager podem ser executados a partir do Azure PowerShell. Depois que o modelo for executado, o status da extensão poderá ser exibido no Gerenciador de Recursos do Azure ou nas ferramentas de linha de comando.

Eis um exemplo:

Azure PowerShell:

Get-AzVM -ResourceGroupName $RGName -Name $vmName -Status

Aqui está a saída de exemplo:

Extensions:  {
  "ExtensionType": "Microsoft.Compute.CustomScriptExtension",
  "Name": "myCustomScriptExtension",
  "SubStatuses": [
    {
      "Code": "ComponentStatus/StdOut/succeeded",
      "DisplayStatus": "Provisioning succeeded",
      "Level": "Info",
      "Message": "    Directory: C:\\temp\\n\\n\\nMode                LastWriteTime     Length Name
          \\n----                -------------     ------ ----                              \\n-a---          9/1/2015   2:03 AM         11
          test.txt                          \\n\\n",
                  "Time": null
      },
    {
      "Code": "ComponentStatus/StdErr/succeeded",
      "DisplayStatus": "Provisioning succeeded",
      "Level": "Info",
      "Message": "",
      "Time": null
    }
  ]
}

Solução de problemas de falhas de extensão

Verifique se o Agente de VM está em execução e Pronto

O Agente de VM é necessário para gerenciar, instalar e executar extensões. Se o Agente de VM não estiver em execução ou não estiver relatando um status Pronto para a plataforma Azure, as extensões não funcionarão corretamente.

Consulte as seguintes páginas para solucionar problemas do Agente de VM:

Verifique o seu guia de solução de problemas de extensão específico

Algumas extensões têm uma página específica descrevendo como solucioná-las. Você pode encontrar a lista dessas extensões e páginas em Solucionar problemas de extensões .

Ver o estado da extensão

Como explicado acima, o status da extensão pode ser encontrado executando o cmdlet do PowerShell:

Get-AzVM -ResourceGroupName $RGName -Name $vmName -Status

ou o comando CLI:

az vm extension show -g <RG Name> --vm-name <VM Name>  --name <Extension Name>

ou no portal do Azure, navegando até a Lâmina da VM / Configurações / Extensões. Você pode então clicar na extensão e verificar seu status e mensagem.

Execute novamente a extensão na VM

Se você estiver executando scripts na VM usando a Extensão de Script Personalizada, às vezes poderá encontrar um erro em que a VM foi criada com êxito, mas o script falhou. Nessas condições, a maneira recomendada de se recuperar desse erro é remover a extensão e executar novamente o modelo. Nota: No futuro, esta funcionalidade seria melhorada para remover a necessidade de desinstalar a extensão.

Remover a extensão do Azure PowerShell

Remove-AzVMExtension -ResourceGroupName $RGName -VMName $vmName -Name "myCustomScriptExtension"

Depois que a extensão for removida, o modelo poderá ser executado novamente para executar os scripts na VM.

Acionar um novo GoalState para a VM

Você pode notar que uma extensão não foi executada ou está falhando na execução devido a um "Gerador de Certificados CRP do Windows Azure" ausente (esse certificado é usado para proteger o transporte das configurações protegidas da extensão). Esse certificado será regenerado automaticamente reiniciando o Agente Convidado do Windows de dentro da Máquina Virtual:

  • Abra o Gestor de Tarefas
  • Vá para a guia Detalhes
  • Localize o processo WindowsAzureGuestAgent.exe
  • Clique com o botão direito do mouse e selecione "Finalizar tarefa". O processo será reiniciado automaticamente

Você também pode acionar um novo GoalState para a VM, executando um "VM Reapply". VM Reapply é uma API introduzida em 2020 para reaplicar o estado de uma VM. Recomendamos fazer isso em um momento em que você possa tolerar um curto tempo de inatividade da VM. Embora Reaplicar em si não cause uma reinicialização de VM e a grande maioria das vezes que chamar Reaplicar não reinicialize a VM, há um risco muito pequeno de que alguma outra atualização pendente para o modelo de VM seja aplicada quando Reaplicar dispara um novo estado de meta e que outra alteração possa exigir uma reinicialização.

Portal do Azure:

No portal, selecione a VM e, no painel esquerdo, em Suporte + solução de problemas, selecione Reimplantar + reaplicar e, em seguida, selecione Reaplicar.

Azure PowerShell (substitua o Nome RG e o Nome da VM pelos seus valores):

Set-AzVM -ResourceGroupName <RG Name> -Name <VM Name> -Reapply

CLI do Azure (substitua o Nome do RG e o Nome da VM pelos seus valores):

az vm reapply -g <RG Name> -n <VM Name>

Se uma "Reaplicação de VM" não funcionar, você poderá adicionar um novo Disco de Dados vazio à VM a partir do Portal de Gerenciamento do Azure e removê-lo mais tarde, assim que o certificado for adicionado novamente.

Observe os logs de extensão dentro da VM

Se as etapas anteriores não funcionaram e se sua extensão ainda estiver em um estado de falha, a próxima etapa é examinar seus logs dentro da Máquina Virtual.

Em uma VM do Windows , os logs de extensão normalmente residirão em

C:\WindowsAzure\Logs\Plugins

E as configurações de extensão e arquivos de status estarão em

C:\Packages\Plugins

Em uma VM Linux , os logs de extensão normalmente residirão em

/var/log/azure/

E as configurações de extensão e arquivos de status estarão em

/var/lib/waagent/

Cada extensão é diferente, mas geralmente seguem princípios semelhantes:

Pacotes de extensão e binários são baixados na VM (por exemplo, " /var/lib/waagent/custom-script/download/1" para Linux ou "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Downloads\0" para Windows).

Suas configurações e definições são passadas da Plataforma Azure para o manipulador de extensão por meio do Agente de VM (por exemplo, " /var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/config" para Linux ou "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\RuntimeSettings" para Windows)

Manipuladores de extensão dentro da VM estão gravando em um arquivo de status (por exemplo, " /var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/status/1.status" para Linux ou "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Status" para Windows) que serão então reportados à Plataforma Azure. Esse status é aquele relatado por meio do PowerShell, CLI ou na folha de extensão da VM no portal do Azure.

Eles também escrevem logs detalhados de sua execução (por exemplo. " /var/log/azure/custom-script/handler.log" para Linux ou "C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\CustomScriptHandler.log" para Windows).

Se a VM for recriada a partir de uma VM existente

Pode acontecer que você esteja criando uma VM do Azure com base em um disco especializado proveniente de outra VM do Azure. Nesse caso, é possível que a VM antiga contivesse extensões e, portanto, tenha binários, logs e arquivos de status sobrando. O novo modelo de VM não estará ciente dos estados de extensões da VM anterior e poderá relatar um status incorreto para essas extensões. É altamente recomendável remover as extensões da VM antiga antes de criar a nova e, em seguida, reinstalar essas extensões assim que a nova VM for criada. O mesmo pode acontecer quando você cria uma imagem generalizada de uma VM do Azure existente. Convidamos você a remover extensões para evitar estados inconsistentes das extensões.

Problemas conhecidos

O PowerShell não é reconhecido como um comando interno ou externo

Observe as seguintes entradas de erro na saída da extensão RunCommand:

RunCommandExtension failed with "'powershell' isn't recognized as an internal or external command,"

Análise

As extensões são executadas na conta Sistema Local, portanto, é muito possível que powershell.exe funcione bem quando você RDP na VM, mas falha quando executado com RunCommand.

Solução

  • Verifique se o PowerShell está listado corretamente na variável de ambiente PATH:
    • Abra o Painel de Controlo
    • Sistema e Segurança
    • Sistema
    • Guia Avançado -> Variáveis Ambientais
  • Em 'Variáveis do sistema', clique em editar e verifique se o PowerShell está na variável de ambiente PATH (geralmente: "C:\Windows\System32\WindowsPowerShell\v1.0")
  • Reinicialize a VM ou reinicie o serviço WindowsAzureGuestAgent e tente executar o comando novamente.

O comando não é reconhecido como um comando interno ou externo

Você vê o seguinte no arquivo C:\WindowsAzure\Logs\Plugins<ExtensionName><Version>\CommandExecution.log:

Execution Error: '<command>' isn't recognized as an internal or external command, operable program or batch file.

Análise

As extensões são executadas na conta Sistema Local, portanto, é muito possível que powershell.exe funcione bem quando você RDP na VM, mas falha quando executado com RunCommand.

Solução

  • Abra um prompt de comando na VM e execute um comando para reproduzir o erro. O Agente de VM usa o cmd.exe do administrador e você pode ter algum comando pré-configurado para executar sempre que o cmd for iniciado.
  • Também é provável que sua variável PATH esteja configurada incorretamente, mas isso dependerá do comando que está tendo o problema.

VMAccessAgent está falhando com Não é possível atualizar as configurações de conexão de área de trabalho remota para a conta de administrador. Erro: System.Runtime.InteropServices.COMException (0x800706D9): Não há mais pontos de extremidade disponíveis no mapeador de pontos de extremidade.

Você vê o seguinte no status da extensão:

Type Microsoft.Compute.VMAccessAgent
Version 2.4.8
Status Provisioning failed
Status level Error
Status message Cannot update Remote Desktop Connection settings for Administrator account. Error: System.Runtime.InteropServices.COMException (0x800706D9): There are no more endpoints available from the endpoint mapper. (Exception from HRESULT: 0x800706D9) at NetFwTypeLib.INetFwRules.GetEnumerator() at 
Microsoft.WindowsAzure.GuestAgent.Plugins.JsonExtensions.VMAccess.RemoteDesktopManager.EnableRemoteDesktopFirewallRules() 
at Microsoft.WindowsAzure.GuestAgent.Plugins.JsonExtensions.VMAccess.RemoteDesktopManager.EnableRemoteDesktop() at

Análise

Este erro pode acontecer quando o serviço Firewall do Windows não está em execução.

Solução

Verifique se o serviço Firewall do Windows está habilitado e em execução. Se não estiver, habilite e inicie-o - em seguida, tente novamente executar o VMAccessAgent.

o certificado remoto é inválido de acordo com o processo de validação.

Você vê o seguinte na WaAppAgent.log

System.Net.WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.
Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

Análise

Sua VM provavelmente está faltando o certificado Baltimore CyberTrust Root em "Trusted Root Certification Authorities".

Solução

Abra o console de certificados com certmgr.msc e verifique se o certificado está lá.

Outro problema possível é que a cadeia de certificados é quebrada por uma ferramenta de inspeção SSL de terceiros, como o ZScaler. Esse tipo de ferramenta deve ser configurado para ignorar a inspeção SSL.