Rozwiązywanie problemów powodowanych przez błędy rozszerzenia maszyny wirtualnej z systemem Windows na platformie Azure

Omówienie szablonów usługi Azure Resource Manager

Szablony usługi Azure Resource Manager umożliwiają deklaratywne określenie infrastruktury IaaS platformy Azure w języku JSON przez zdefiniowanie zależności między źródłami.

Zobacz Tworzenie szablonów rozszerzeń , aby dowiedzieć się więcej na temat tworzenia szablonów na potrzeby korzystania z rozszerzeń.

W tym artykule omówiono rozwiązywanie problemów związanych z typowymi błędami rozszerzeń maszyn wirtualnych.

Wyświetlanie stanu rozszerzenia

Szablony usługi Azure Resource Manager można wykonywać z Azure PowerShell. Po wykonaniu szablonu stan rozszerzenia można wyświetlić w Eksploratorze zasobów platformy Azure lub narzędziach wiersza polecenia.

Oto przykład:

Azure PowerShell:

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

Oto przykładowe dane wyjściowe:

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

Rozwiązywanie problemów z błędami rozszerzeń

Sprawdź, czy agent maszyny wirtualnej jest uruchomiony i gotowy

Agent maszyny wirtualnej jest wymagany do zarządzania, instalowania i wykonywania rozszerzeń. Jeśli agent maszyny wirtualnej nie jest uruchomiony lub nie zgłosi stanu Gotowe na platformę Azure, rozszerzenia nie będą działać poprawnie.

Zapoznaj się z następującymi stronami, aby rozwiązać problemy z agentem maszyny wirtualnej:

Sprawdzanie konkretnego przewodnika rozwiązywania problemów z rozszerzeniem

Niektóre rozszerzenia mają określoną stronę opisującą sposób ich rozwiązywania. Listę tych rozszerzeń i stron można znaleźć na stronie Rozwiązywanie problemów z rozszerzeniami .

Wyświetlanie stanu rozszerzenia

Jak wyjaśniono powyżej, stan rozszerzenia można znaleźć, uruchamiając polecenie cmdlet programu PowerShell:

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

lub polecenie interfejsu wiersza polecenia:

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

lub w Azure Portal, przechodząc do bloku maszyny wirtualnej / ustawień / rozszerzeń. Następnie możesz kliknąć rozszerzenie i sprawdzić jego stan i komunikat.

Uruchom ponownie rozszerzenie na maszynie wirtualnej

Jeśli uruchamiasz skrypty na maszynie wirtualnej przy użyciu rozszerzenia niestandardowego skryptu, czasami może wystąpić błąd polegający na tym, że maszyna wirtualna została utworzona pomyślnie, ale skrypt zakończył się niepowodzeniem. W tych warunkach zalecanym sposobem odzyskiwania po tym błędzie jest usunięcie rozszerzenia i ponowne uruchomienie szablonu. Uwaga: W przyszłości ta funkcja zostanie rozszerzona, aby usunąć konieczność odinstalowania rozszerzenia.

Usuwanie rozszerzenia z Azure PowerShell

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

Po usunięciu rozszerzenia można ponownie wykonać szablon, aby uruchomić skrypty na maszynie wirtualnej.

Wyzwalanie nowego elementu GoalState na maszynie wirtualnej

Możesz zauważyć, że rozszerzenie nie zostało wykonane lub nie jest wykonywane z powodu braku "Generator certyfikatów CRP platformy Windows Azure" (ten certyfikat jest używany do zabezpieczania transportu ustawień chronionych rozszerzenia). Ten certyfikat zostanie automatycznie wygenerowany ponownie przez ponowne uruchomienie agenta gościa systemu Windows z poziomu maszyny wirtualnej:

  • Otwórz Menedżera zadań
  • Przejdź do karty Szczegóły
  • Lokalizowanie procesu WindowsAzureGuestAgent.exe
  • Kliknij prawym przyciskiem myszy i wybierz pozycję "Zakończ zadanie". Proces zostanie automatycznie uruchomiony ponownie

Możesz również wyzwolić nową wartość GoalState na maszynie wirtualnej, wykonując polecenie "Maszyna wirtualna ponownie zastosuj". Ponowne zastosowania maszyny wirtualnej to interfejs API wprowadzony w 2020 r. w celu ponownego zastosowania stanu maszyny wirtualnej. Zalecamy wykonanie tej czynności w czasie, gdy można tolerować krótki przestój maszyny wirtualnej. Chociaż sama aplikacja ponownie nie powoduje ponownego uruchomienia maszyny wirtualnej, a zdecydowana większość przypadków wywoływania aplikacji Reapply nie spowoduje ponownego uruchomienia maszyny wirtualnej, istnieje bardzo małe ryzyko, że niektóre inne oczekujące aktualizacje do modelu maszyny wirtualnej zostaną zastosowane po wyzwoleniu nowego stanu celu przez aplikację Reapply i że inna zmiana może wymagać ponownego uruchomienia.

Azure Portal:

W portalu wybierz maszynę wirtualną i w okienku po lewej stronie w obszarze Pomoc techniczna i rozwiązywanie problemów wybierz pozycję Ponownie wdróż i ponownie zastosuj, a następnie wybierz pozycję Ponownie zastosuj.

Azure PowerShell (zastąp nazwę RG i nazwę maszyny wirtualnej wartościami):

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

Interfejs wiersza polecenia platformy Azure (zastąp nazwę RG i nazwę maszyny wirtualnej wartościami)::

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

Jeśli aplikacja ponownie maszyny wirtualnej nie działa, możesz dodać nowy pusty dysk danych do maszyny wirtualnej z portalu zarządzania Azure, a następnie usunąć go później po dodaniu certyfikatu.

Przyjrzyj się dziennikom rozszerzeń na maszynie wirtualnej

Jeśli poprzednie kroki nie zadziałały i jeśli rozszerzenie jest nadal w stanie niepowodzenia, następnym krokiem jest przyjrzenie się dziennikom wewnątrz maszyny wirtualnej.

Na maszynie wirtualnej z systemem Windows dzienniki rozszerzeń zwykle znajdują się w

C:\WindowsAzure\Logs\Plugins

Ustawienia rozszerzenia i pliki stanu będą znajdować się w folderze

C:\Packages\Plugins

Na maszynie wirtualnej z systemem Linux dzienniki rozszerzeń zwykle znajdują się w

/var/log/azure/

Ustawienia rozszerzenia i pliki stanu będą znajdować się w folderze

/var/lib/waagent/

Każde rozszerzenie jest inne, ale zwykle są zgodne z podobnymi regułami:

Pakiety rozszerzeń i pliki binarne są pobierane na maszynie wirtualnej (np. "/var/lib/waagent/custom-script/download/1" dla systemu Linux lub "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Downloads\0" dla systemu Windows).

Ich konfiguracja i ustawienia są przekazywane z platformy Azure do procedury obsługi rozszerzeń za pośrednictwem agenta maszyny wirtualnej (np. "/var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/config" dla systemu Linux lub "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\RuntimeSettings" dla systemu Windows)

Programy obsługi rozszerzeń wewnątrz maszyny wirtualnej zapisują się w pliku stanu (np. "/var/lib/waagent/Microsoft.Azure.Extensions.CustomScript-2.1.3/status/1.status" dla systemu Linux lub "C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Status" dla systemu Windows), które zostaną następnie zgłoszone do platformy Azure. Ten stan jest zgłaszany za pośrednictwem programu PowerShell, interfejsu wiersza polecenia lub w bloku rozszerzenia maszyny wirtualnej w Azure Portal.

Zapisują również szczegółowe dzienniki ich wykonania (np. "/var/log/azure/custom-script/handler.log" dla systemu Linux lub "C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\CustomScriptHandler.log" dla systemu Windows).

Jeśli maszyna wirtualna zostanie ponownie utworzona z istniejącej maszyny wirtualnej

Może się zdarzyć, że tworzysz maszynę wirtualną platformy Azure na podstawie wyspecjalizowanego dysku pochodzącego z innej maszyny wirtualnej platformy Azure. W takim przypadku istnieje możliwość, że stare rozszerzenia zawarte na maszynie wirtualnej będą zawierać pliki binarne, dzienniki i pliki stanu pozostawione. Nowy model maszyny wirtualnej nie będzie wiedział o stanach rozszerzeń poprzedniej maszyny wirtualnej i może zgłosić nieprawidłowy stan tych rozszerzeń. Zdecydowanie zalecamy usunięcie rozszerzeń ze starej maszyny wirtualnej przed utworzeniem nowego, a następnie ponowne zainstalowanie tych rozszerzeń po utworzeniu nowej maszyny wirtualnej. To samo może wystąpić podczas tworzenia uogólnionego obrazu na podstawie istniejącej maszyny wirtualnej platformy Azure. Zachęcamy do usunięcia rozszerzeń, aby uniknąć niespójnego stanu z rozszerzeń.

Znane problemy

Program PowerShell nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne

W danych wyjściowych rozszerzenia RunCommand zauważysz następujące wpisy o błędzie:

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

Analiza

Rozszerzenia są uruchamiane na koncie systemu lokalnego, więc jest bardzo możliwe, że powershell.exe działa prawidłowo podczas korzystania z protokołu RDP na maszynie wirtualnej, ale kończy się niepowodzeniem podczas uruchamiania z poleceniem RunCommand.

Rozwiązanie

  • Sprawdź, czy program PowerShell jest poprawnie wymieniony w zmiennej środowiskowej PATH:
    • Otwórz Panel sterowania
    • System i zabezpieczenia
    • System
    • Karta Zaawansowane —> Zmienne środowiskowe
  • W obszarze "Zmienne systemowe" kliknij pozycję Edytuj i upewnij się, że program PowerShell znajduje się w zmiennej środowiskowej PATH (zwykle: "C:\Windows\System32\WindowsPowerShell\v1.0")
  • Uruchom ponownie maszynę wirtualną lub uruchom ponownie usługę WindowsAzureGuestAgent, a następnie spróbuj ponownie uruchomić polecenie.

Polecenie nie jest rozpoznawane jako polecenie wewnętrzne lub zewnętrzne

W pliku C:\WindowsAzure\Logs\Plugins<ExtensionName><Version>\CommandExecution.log są widoczne następujące elementy:

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

Analiza

Rozszerzenia są uruchamiane na koncie systemu lokalnego, więc jest bardzo możliwe, że powershell.exe działa prawidłowo podczas korzystania z protokołu RDP na maszynie wirtualnej, ale kończy się niepowodzeniem podczas uruchamiania z poleceniem RunCommand.

Rozwiązanie

  • Otwórz wiersz polecenia na maszynie wirtualnej i wykonaj polecenie w celu odtworzenia błędu. Agent maszyny wirtualnej używa cmd.exe administratora i może być konieczne wstępne wykonanie polecenia za każdym razem, gdy polecenie cmd jest uruchamiane.
  • Prawdopodobnie zmienna PATH jest nieprawidłowo skonfigurowana, ale będzie to zależeć od polecenia, które ma problem.

Usługa VMAccessAgent kończy się niepowodzeniem z powodu braku możliwości zaktualizowania ustawień połączenia pulpitu zdalnego dla konta administratora. Błąd: System.Runtime.InteropServices.COMException (0x800706D9): Nie ma więcej punktów końcowych dostępnych z mapatora punktu końcowego.

W stanie rozszerzenia są widoczne następujące elementy:

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

Analiza

Ten błąd może wystąpić, gdy usługa Zapora systemu Windows nie jest uruchomiona.

Rozwiązanie

Sprawdź, czy usługa Zapora systemu Windows jest włączona i uruchomiona. Jeśli tak nie jest, włącz i uruchom go — spróbuj ponownie uruchomić usługę VMAccessAgent.

Certyfikat zdalny jest nieprawidłowy zgodnie z procedurą walidacji.

W pliku WaAppAgent.log są widoczne następujące elementy:

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.

Analiza

Prawdopodobnie brakuje certyfikatu głównego Baltimore CyberTrust w "Zaufanych głównych urzędach certyfikacji".

Rozwiązanie

Otwórz konsolę certyfikatów za pomocą narzędzia certmgr.msc i sprawdź, czy certyfikat istnieje.

Innym możliwym problemem jest to, że łańcuch certyfikatów jest uszkodzony przez narzędzie inspekcji SSL innej firmy, takie jak ZScaler. Tego rodzaju narzędzie należy skonfigurować do pomijania inspekcji protokołu SSL.