Solucionando problemas de falhas da extensão da VM do Windows no Azure

Visão geral dos modelos do Gerenciador de Recursos do Azure

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

Veja Criando modelos de extensão para saber mais sobre como criar modelos para usar as extensões.

Neste artigo, aprenderemos a solucionar algumas das falhas comuns da extensão de VM.

Exibindo o status da extensão

Os modelos do Azure Resource Manager podem ser executados no 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.

Veja um exemplo:

Azure PowerShell:

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

Veja o exemplo de saída:

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 da extensão

Verificar se o Agente de VM está sendo executado 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 do Azure, as extensões não funcionarão corretamente.

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

Verificar seu guia de solução de problemas da extensão específica

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

Ver o status da extensão

Conforme 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 da CLI:

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

ou no portal do Azure, navegando até a Folha VM / Configurações / Extensões. Em seguida, você pode clicar na extensão e verificar seu status e mensagem.

Executar novamente a extensão na VM

Se estiver executando scripts na VM usando a Extensão de Script Personalizado, às vezes, você poderá se deparar com 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 o modelo novamente. Observação: no futuro, essa funcionalidade será aprimorada para eliminar 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 tiver sido removida, o modelo poderá ser executado novamente para executar os scripts na VM.

Disparar uma nova metastate para a VM

Você pode observar que uma extensão não foi executada ou está falhando na execução por causa de um "gerador de certificado do Microsoft Azure CRP" (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 Gerenciador de Tarefas
  • Vá até a guia Detalhes
  • Localizar o processo de WindowsAzureGuestAgent.exe
  • Clique com o botão direito do mouse e selecione "Finalizar Tarefa". O processo será reiniciado automaticamente

Você também pode disparar uma nova metastate para a VM, executando um "Reaplicar VM". Reaplicar VM é uma API introduzida em 2020 para reaplicar o estado de uma VM. É recomendável fazer isso a cada vez, quando você puder tolerar um curto tempo de inatividade da VM. Embora a reaplicação em si não cause uma reinicialização da VM, e na grande maioria das vezes a chamada da reaplicação não reinicia a VM, há um risco muito pequeno de que alguma outra atualização pendente para o modelo de VM seja aplicada quando a reaplicação dispara um novo estado de meta, e essa outra alteração pode exigir uma reinicialização.

Portal do Azure:

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

Azure PowerShell (substitua o nome de RG e o nome da VM pelos valores) :

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

CLI do Azure (substitua o nome de RG e o nome da VM pelos valores) :

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

Se uma "Reaplicar VM" não funcionar, você poderá adicionar um novo Disco de Dados vazio à VM da Portal de Gerenciamento do Azure e, em seguida, removê-lo mais tarde, depois que o certificado tiver sido adicionado novamente.

Veja os logs de extensão na VM

Se as etapas anteriores não funcionarem e se a extensão ainda estiver em um estado de falha, a próxima etapa será ver 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 os arquivos de status e configurações de Extensão estarão em

C:\Packages\Plugins

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

/var/log/azure/

E os arquivos de status e configurações de Extensão estarão em

/var/lib/waagent/

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

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

As configurações e as definições são transmitidas 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 o Linux ou "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\RuntimeSettings" para o Windows)

Os manipuladores de extensão na VM fazem gravações em um arquivo de status (por exemplo, "/var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/status/1.status" para o Linux ou "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Status" para o Windows) que será relatado à plataforma Azure. Esse status é aquele relatado através do PowerShell, da CLI ou na folha de extensão da VM no portal do Azure.

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

Se a VM for recriada de uma VM existente

Talvez 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, terá binários, logs e arquivos de status remanescentes. 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 depois 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 o estado inconsistente 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 do Sistema Local, portanto, é muito possível que powershell.exe funcione bem quando você usa RDP na VM, mas falha ao executar com RunCommand.

Solução

  • Verifique se o PowerShell está listado corretamente na variável de ambiente PATH:
    • Abra o Painel de Controle
    • Sistema e segurança
    • Sistema
    • Guia Avançada -> 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ê verá 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 do Sistema Local, portanto, é muito possível que powershell.exe funcione bem quando você usa RDP na VM, mas falha ao executar 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 administrador cmd.exe e você pode ter algum comando pré-configurado para executar sempre que o cmd for iniciado.
  • Também é provável que a variável PATH esteja configurada incorretamente, mas isso dependerá do comando que está tendo o problema.

O 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 do ponto de extremidade.

Você verá 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

Esse erro pode acontecer quando o serviço firewall do Windows não estiver 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, depois tente novamente executar o VMAccessAgent.

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

Você verá o seguinte no 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 não tem o certificado Baltimore CyberTrust Root em "Autoridades de Certificação Raiz Confiáveis".

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 é interrompida por uma ferramenta de inspeção de SSL de terceiros, como o ZScaler. Esse tipo de ferramenta deve ser configurado para ignorar a inspeção SSL.