Risoluzione degli errori delle estensioni di macchina virtuale Windows di Azure

Panoramica dei modelli di Gestione risorse di Azure

I modelli di Azure Resource Manager consentono di specificare in modo dichiarativo l'infrastruttura IaaS di Azure in linguaggio JSON, definendo le dipendenze tra le risorse.

Per altre informazioni sulla creazione di modelli per l'uso delle estensioni, vedere Authoring extension templates (Creazione dei modelli di estensione).

Questo articolo illustra la risoluzione dei problemi relativi ad alcuni degli errori più comuni delle estensioni della macchina virtuale.

Visualizzazione dello stato dell'estensione

I modelli di Azure Resource Manager possono essere eseguiti da Azure PowerShell. Una volta che il modello viene eseguito, sarà possibile visualizzare lo stato dell'estensione da Azure Resource Explorer o dagli strumenti da riga di comando.

Ecco un esempio:

Azure PowerShell:

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

Di seguito è riportato l'output di esempio:

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

Risoluzione degli errori delle estensioni

Verificare che l'agente di macchine virtuali sia in esecuzione e pronto

L'agente di macchine virtuali è necessario per gestire, installare ed eseguire le estensioni. Se l'agente di macchine virtuali non è in esecuzione o non riesce a segnalare lo stato Pronto alla piattaforma Azure, le estensioni non funzioneranno correttamente.

Per risolvere i problemi dell'agente di macchine virtuali, vedere le pagine seguenti:

Verificare la guida alla risoluzione dei problemi dell'estensione specifica

Alcune estensioni hanno una pagina specifica che descrive come risolverli. È possibile trovare l'elenco di queste estensioni e pagine in Risolvere i problemi relativi alle estensioni .

Visualizzare lo stato dell'estensione

Come illustrato in precedenza, lo stato dell'estensione è reperibile eseguendo il cmdlet di PowerShell:

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

o il comando dell'interfaccia della riga di comando:

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

o nel portale di Azure, passando al pannello della macchina virtuale/Impostazioni/Estensioni. È quindi possibile fare clic sull'estensione e controllarne lo stato e il messaggio.

Eseguire nuovamente l'estensione nella macchina virtuale

Se si eseguono script nella macchina virtuale usando l'estensione script personalizzata, è possibile che a volte si verifichi un errore in cui la macchina virtuale è stata creata correttamente, ma lo script non è riuscito. In queste condizioni, il metodo consigliato per risolvere il problema consiste nel rimuovere l'estensione ed eseguire nuovamente il modello. Nota: In futuro, questa funzionalità potrebbe essere migliorata in modo da eliminare la necessità di disinstallazione dell'estensione.

Rimuovere l'estensione da Azure PowerShell

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

Una volta rimossa l'estensione, il modello può essere eseguito nuovamente per eseguire gli script nella macchina virtuale.

Attivare un nuovo GoalState nella macchina virtuale

Si potrebbe notare che un'estensione non è stata eseguita o non è in esecuzione a causa di un "Generatore di certificati CRP di Windows Azure" mancante (tale certificato viene usato per proteggere il trasporto delle impostazioni protette dell'estensione). Il certificato verrà rigenerato automaticamente riavviando l'agente guest Windows dall'interno della macchina virtuale:

  • Aprire Gestione attività
  • Passare alla scheda Dettagli
  • Individuare il processo di WindowsAzureGuestAgent.exe
  • Fare clic con il pulsante destro del mouse e scegliere "Termina attività". Il processo verrà riavviato automaticamente

È anche possibile attivare un nuovo GoalState nella macchina virtuale eseguendo una "Riapplicazione macchina virtuale". La riapplicazione della macchina virtuale è un'API introdotta nel 2020 per riapplicare lo stato di una macchina virtuale. È consigliabile eseguire questa operazione in un momento in cui è possibile tollerare un breve tempo di inattività della macchina virtuale. Anche se Reapply non causa un riavvio della macchina virtuale e la maggior parte delle volte che chiama Reapply non riavvierà la macchina virtuale, c'è un rischio molto piccolo che altri aggiornamenti in sospeso al modello di macchina virtuale vengano applicati quando Reapply attiva un nuovo stato obiettivo e che altre modifiche potrebbero richiedere un riavvio.

Portale di Azure:

Nel portale selezionare la macchina virtuale e nel riquadro sinistro in Supporto e risoluzione dei problemi selezionare Ridistribuire e riapplicare e quindi selezionare Riapplica.

Azure PowerShell (sostituire il nome RG e il nome della macchina virtuale con i valori) :

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

Interfaccia della riga di comando di Azure (sostituire il nome RG e il nome della macchina virtuale con i valori) :

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

Se una "macchina virtuale riapplicata" non funziona, è possibile aggiungere un nuovo disco dati vuoto alla macchina virtuale dal portale di gestione di Azure e quindi rimuoverlo in un secondo momento dopo aver aggiunto di nuovo il certificato.

Esaminare i log delle estensioni all'interno della macchina virtuale

Se i passaggi precedenti non funzionano e se l'estensione è ancora in uno stato di errore, il passaggio successivo consiste nell'esaminare i log all'interno della macchina virtuale.

In una macchina virtuale Windows i log delle estensioni si trovano in genere in

C:\WindowsAzure\Logs\Plugins

E le impostazioni dell'estensione e i file di stato saranno in

C:\Packages\Plugins

In una macchina virtuale Linux i log delle estensioni si trovano in genere in

/var/log/azure/

E le impostazioni dell'estensione e i file di stato saranno in

/var/lib/waagent/

Ogni estensione è diversa, ma le estensioni seguono in genere principi simili:

I pacchetti di estensione e i file binari vengono scaricati nella macchina virtuale ,ad esempio " /var/lib/waagent/custom-script/download/1" per Linux o "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Downloads\0" per Windows).

La configurazione e le impostazioni vengono passate dalla piattaforma Azure al gestore dell'estensione tramite l'agente di macchine virtuali ,ad esempio " /var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/config" per Linux o "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\RuntimeSettings" per Windows)

I gestori di estensione all'interno della macchina virtuale scrivono in un file di stato ,ad esempio " /var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/status/1.status" per Linux o "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Status" per Windows), che verrà quindi segnalato alla piattaforma Azure. Questo stato è quello segnalato tramite PowerShell, l'interfaccia della riga di comando o il pannello dell'estensione della macchina virtuale nel portale di Azure.

Scrivono anche log dettagliati dell'esecuzione (ad esempio , " /var/log/azure/custom-script/handler.log" per Linux o "C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\CustomScriptHandler.log" per Windows).

Se la macchina virtuale viene ricreata da una macchina virtuale esistente

Potrebbe verificarsi che si stia creando una macchina virtuale di Azure basata su un disco specializzato proveniente da un'altra macchina virtuale di Azure. In tal caso, è possibile che la macchina virtuale precedente contenga estensioni e quindi avrà file binari, log e file di stato rimasti. Il nuovo modello di macchina virtuale non riconoscerà gli stati delle estensioni della macchina virtuale precedente e potrebbe segnalare uno stato non corretto per queste estensioni. È consigliabile rimuovere le estensioni dalla macchina virtuale precedente prima di crearne una nuova e quindi reinstallare queste estensioni dopo aver creato la nuova macchina virtuale. Lo stesso può verificarsi quando si crea un'immagine generalizzata da una macchina virtuale di Azure esistente. Ti invitiamo a rimuovere le estensioni per evitare uno stato incoerente dalle estensioni.

Problemi noti

PowerShell non viene riconosciuto come comando interno o esterno

Si notano le voci di errore seguenti nell'output dell'estensione RunCommand:

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

Analisi

Le estensioni vengono eseguite con l'account di sistema locale, quindi è molto possibile che powershell.exe funzioni correttamente quando si esegue RDP nella macchina virtuale, ma non riesce quando viene eseguito con RunCommand.

Soluzione

  • Verificare che PowerShell sia elencato correttamente nella variabile di ambiente PATH:
    • Aprire il Pannello di controllo
    • Sistema e sicurezza
    • Sistema
    • Scheda Avanzate -> Variabili di ambiente
  • In 'Variabili di sistema' fare clic su Modifica e verificare che PowerShell sia nella variabile di ambiente PATH (in genere: "C:\Windows\System32\WindowsPowerShell\v1.0")
  • Riavviare la macchina virtuale o riavviare il servizio WindowsAzureGuestAgent e quindi riprovare a eseguire il comando.

Il comando non viene riconosciuto come comando interno o esterno

Di seguito è riportato il file 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.

Analisi

Le estensioni vengono eseguite con l'account di sistema locale, quindi è molto possibile che powershell.exe funzioni correttamente quando si esegue RDP nella macchina virtuale, ma non riesce quando viene eseguito con RunCommand.

Soluzione

  • Aprire un prompt dei comandi nella macchina virtuale ed eseguire un comando per riprodurre l'errore. L'agente di macchine virtuali usa il cmd.exe administrator e potrebbe essere presente un comando preconfigurato per l'esecuzione ogni volta che viene avviato cmd.
  • È anche probabile che la variabile PATH non sia configurata correttamente, ma dipenderà dal comando che presenta il problema.

VMAccessAgent ha esito negativo e non è possibile aggiornare le impostazioni di Connessione Desktop remoto per l'account amministratore. Errore: System.Runtime.InteropServices.COMException (0x800706D9): non sono disponibili altri endpoint dal mapper dell'endpoint.

Lo stato dell'estensione è il seguente:

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

Analisi

Questo errore può verificarsi quando il servizio Windows Firewall non è in esecuzione.

Soluzione

Controllare se il servizio Windows Firewall è abilitato e in esecuzione. In caso contrario, abilitarlo e avviarlo, quindi riprovare a eseguire VMAccessAgent.

Il certificato remoto non è stato ritenuto valido dalla procedura di convalida.

Nella WaAppAgent.log viene visualizzato quanto segue

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.

Analisi

La macchina virtuale probabilmente manca il certificato root Baltimore CyberTrust in "Autorità di certificazione radice attendibili".

Soluzione

Aprire la console dei certificati con certmgr.msc e verificare se il certificato è presente.

Un altro possibile problema è che la catena di certificati è interrotta da uno strumento di ispezione SSL di terze parti, ad esempio ZScaler. Questo tipo di strumento deve essere configurato per ignorare l'ispezione SSL.