Ćwiczenie — stosowanie dobrych rozwiązań do szablonu przy użyciu zestawu narzędzi do testowania szablonu usługi ARM

Ukończone

Jesteś częścią zespołu deweloperów w firmie Tailwind Traders. W ramach tej pracy musisz utworzyć szablony usługi Azure Resource Manager w celu wdrożenia zasobów w chmurze i zarządzania nimi. Chcesz upewnić się, że szablony są zgodne z pewnymi zdrowymi rozwiązaniami przed wdrożeniem zasobów. Możesz użyć zestawu narzędzi do testowania szablonu usługi ARM, aby ułatwić analizowanie szablonów, aby rozwiązać wszelkie problemy.

Konfigurowanie środowiska testowego

To narzędzie jest modułem programu PowerShell. Aby można było go uruchomić, wykonaj następujące czynności:

  • Zainstaluj moduł programu PowerShell. To zadanie jest wykonywane inaczej w zależności od tego, czy korzystasz z systemu Linux, Mac czy Windows.
  • Pobierz moduł. Moduł jest hostowany w repozytorium GitHub. Możesz pobrać go z tego miejsca lub za pośrednictwem polecenia git clone.
  • Zaimportuj moduł. Ten krok to tylko jednowierszowa instrukcja, która zostanie wprowadzona do sesji programu PowerShell, która umożliwi udostępnienie poleceń usługi ARM-TTK.

Instalowanie programu PowerShell

  1. Aby zainstalować program PowerShell, postępuj zgodnie z instrukcjami w temacie Instalowanie programu PowerShell w systemie Linux.

  2. Aby zweryfikować instalację, uruchom w terminalu polecenie pwsh:

    pwsh
    

    Dane wyjściowe będą wyglądać mniej więcej tak:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

Pobieranie zestawu narzędzi do testowania

Zestaw narzędzi do testowania znajduje się w repozytorium GitHub. Wybierz jedną z następujących akcji:

Inspekcja zestawu narzędzi do testowania

Zestaw narzędzi do testowania został właśnie pobrany do wybranego katalogu. Przyjrzyjmy się strukturze katalogów. (Upewnij się, że plik został rozpakowany, jeśli wybrano opcję pobrania pliku zip zamiast uruchamiania git clone polecenia). Jeśli przejdziesz do katalogu zestawu narzędzi do testowania usługi ARM, musisz mieć strukturę katalogową podobną do poniższej:

-| arm-ttk/
-| unit-tests/
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md

Zestaw narzędzi do testowania znajduje się w podkatalogu \arm-ttk.

Tworzenie pliku szablonu

Wybierz katalog i utwórz plik o nazwie azuredeploy.json.

Ostrzeżenie

Upewnij się, że wybrany katalog jest pusty i nie ma podkatalogów

Dodaj następującą zawartość:

   {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
         "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
               "description": "Location for the resources."
            }
         }
      },
      "resources": [{
         "location": "westus"
      }]
   }

Zanotuj lokalizację pliku szablonu. Aby wyświetlić ścieżkę, można uruchomić w terminalu polecenie pwd. Ta ścieżka będzie używana później jako parametr podczas uruchamiania zestawu narzędzi do testowania.

Wykrywanie i rozwiązywanie problemów dotyczących szablonu za pomocą uruchamiania zestawu narzędzi do testowania

Zalecamy uruchomienie programu Visual Studio Code i zintegrowanego terminalu.

Uruchomisz zestaw narzędzi do testowania w ramach ścieżki zawierającej szablon wdrożenia i naprawisz wszelkie wykryte błędy, zmieniając szablon.

Ostrzeżenie

W tym ćwiczeniu przeskanujesz jeden plik szablonu. Zestaw narzędzi do testowania skanuje wszystkie pliki w określonym katalogu. Dzieje się tak, ponieważ wdrożenie może składać się z kilku plików. Upewnij się, że w katalogu, w którym znajduje się plik azuredeploy.json, nie ma plików JSON.

  1. W terminalu przejdź do ścieżki, w której znajduje się plik azuredeploy.json. Uruchom następujące polecenie, aby uruchomić program Visual Studio Code:

    code .
    

    Uwaga

    Otwórz program Visual Studio Code ręcznie i otwórz katalog szablonów, jeśli program Visual Studio Code nie znajduje się w ścieżce.

  2. Z poziomu programu Visual Studio Code otwórz zintegrowany terminal, wybierając z menu głównego pozycję Terminal>Nowy terminal. Aby uruchomić powłokę programu PowerShell, uruchom w terminalu następujące polecenie:

    pwsh
    

    Wyświetlone dane wyjściowe powinny wyglądać mniej więcej tak:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

Analiza szablonu

  1. Uruchom polecenie Import-Module, aby mieć możliwość uruchamiania testów z dowolnego miejsca.

    Uwaga

    Przed zaimportowaniem modułu zastąp ciąg patch/to/arm-ttk/arm-ttk.psd1 ścieżką do pobranego zestawu narzędzi do testowania.

    Import-Module path/to/arm-ttk/arm-ttk.psd1
    

    Napiwek

    Jeśli narzędzie zostanie pobrane lub sklonowane do katalogu Pobrane , ścieżka będzie wyglądać następująco: /Users/<user>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1.

    Teraz możesz przystąpić do korzystania z narzędzia. Dopóki jesteś w tej samej sesji programu PowerShell, nie ma potrzeby ponownego uruchamiania polecenia importowania.

  2. Uruchom polecenie Test-AzTemplate z parametrem -TemplatePath wskazującym lokalizację ścieżki pliku szablonu (z wyłączeniem nazwy pliku):

    Test-AzTemplate -TemplatePath .
    

    W terminalu zostaną wyświetlone dane wyjściowe podobne do następujących:

     Validating deploy\azuredeploy.json
       deploymentTemplate
         [+] adminUsername Should Not Be A Literal (4 ms)
         [+] apiVersions Should Be Recent (2 ms)
         [+] artifacts parameter (1 ms)
         [+] DependsOn Best Practices (2 ms)
         [+] Deployment Resources Must Not Be Debug (2 ms)
         [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms)
         [+] DeploymentTemplate Schema Is Correct (1 ms)
         [+] Dynamic Variable References Should Not Use Concat (1 ms)
         [+] IDs Should Be Derived From ResourceIDs (3 ms)
         [+] Location Should Not Be Hardcoded (1 ms)
         [+] ManagedIdentityExtension must not be used (2 ms)
         [+] Min And Max Value Are Numbers (1 ms)
         [+] Outputs Must Not Contain Secrets (4 ms)
         [-] Parameters Must Be Referenced (2 ms)
             Unreferenced parameter: location
    
         [+] Parameters Property Must Exist (1 ms)
         [+] providers apiVersions Is Not Permitted (1 ms)
         [+] ResourceIds should not contain (1 ms)
         [-] Resources Should Have Location (8 ms)
             Resource Location must be an expression or 'global'
    
         [+] Secure String Parameters Cannot Have Default (1 ms)
         [+] Template Should Not Contain Blanks (1 ms)
         [+] Variables Must Be Referenced (1 ms)
         [+] Virtual Machines Should Not Be Preview (3 ms)
         [+] VM Images Should Use Latest Version (1 ms)
         [+] VM Size Should Be A Parameter (3 ms)
    

    W danych wyjściowych zwróć uwagę, że dwa testy kończą się niepowodzeniem: Zasoby powinny mieć lokalizację i parametry muszą być przywołyne. Prefiks [-] wskazuje test zakończony niepowodzeniem.

    Aby zrozumieć, co się dzieje, otwórz plik azuredeploy.json. Powinien on wyglądać następująco:

    {
       "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
       "contentVersion": "1.0.0.0",
       "parameters": {
          "location": {
             "type": "string",
             "defaultValue": "[resourceGroup().location]",
             "metadata": {
                "description": "Location for the resources."
             }
          }
       },
       "resources": [{
          "location": "westus"
       }]
    }
    

    Testy kończą się niepowodzeniem z dwóch powodów:

    • Nie użyto parametru location. Ten komunikat o błędzie może na przykład wskazywać, że parametr został użyty w przeszłości i nie został wyczyszczony. Albo że należy go użyć, ale zapomnieliśmy zaktualizować nasz kod.
    • Właściwość location jest ustawiona na ciąg westus zakodowany na stałe. Korzystanie z tej opcji nie jest dobrym rozwiązaniem, ponieważ podczas wdrażania chcesz mieć możliwość kontrolowania lokalizacji zasobu za pomocą parametrów wejściowych.

Wprowadzanie poprawek w szablonie

Jak naprawić testy zakończone niepowodzeniem?

Jak wskazuje test, możemy spróbować zastąpić ciąg westus tekstem global. Jednak to rozwiązałoby tylko jeden z problemów. Najprawdopodobniej chcemy użyć parametru location i ustawić lokalizację zasobów na tę wartość.

Jest tak z dwóch powodów. Nie tylko można ustawić parametr lokalizacji jako parametr wdrożenia, ale także mieć rozsądny rezerwowy zestaw do parametru resourceGroup().location jako defaultValue , jeśli pominięto parametr location podczas uruchamiania wdrożenia.

  1. Znajdź pierwszy element zasobu na tablicy resources (zasoby) i zastąp następującą zawartość:

    "resources": [{
      "location": "westus"
    }]
    

    tą zawartością:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. Uruchom ponownie narzędzie do testowania w zintegrowanym terminalu, aby zweryfikować poprawkę:

    Test-AzTemplate -TemplatePath .
    

    Otrzymasz teraz dane wyjściowe, w przypadku których wszystkie testy zostały zakończone powodzeniem:

    Validating deploy\azuredeploy.json
      deploymentTemplate
        [+] adminUsername Should Not Be A Literal (6 ms)
        [+] apiVersions Should Be Recent (2 ms)
        [+] artifacts parameter (1 ms)
        [+] DependsOn Best Practices (1 ms)
        [+] Deployment Resources Must Not Be Debug (1 ms)
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms)
        [+] DeploymentTemplate Schema Is Correct (1 ms)
        [+] Dynamic Variable References Should Not Use Concat (1 ms)
        [+] IDs Should Be Derived From ResourceIDs (4 ms)
        [+] Location Should Not Be Hardcoded (1 ms)
        [+] ManagedIdentityExtension must not be used (1 ms)
        [+] Min And Max Value Are Numbers (1 ms)
        [+] Outputs Must Not Contain Secrets (1 ms)
        [+] Parameters Must Be Referenced (1 ms)
        [+] Parameters Property Must Exist (1 ms)
        [+] providers apiVersions Is Not Permitted (1 ms)
        [+] ResourceIds should not contain (1 ms)
        [+] Resources Should Have Location (1 ms)
        [+] Secure String Parameters Cannot Have Default (1 ms)
        [+] Template Should Not Contain Blanks (1 ms)
        [+] Variables Must Be Referenced (1 ms)
        [+] Virtual Machines Should Not Be Preview (4 ms)
        [+] VM Images Should Use Latest Version (1 ms)
        [+] VM Size Should Be A Parameter (4 ms)
    

To wszystko! Uruchomiono narzędzie testowe oraz znaleziono błędy i naprawiono je.

  1. Postępuj zgodnie z instrukcjami w temacie Instalowanie programu PowerShell w systemie macOS.

  2. Aby zweryfikować instalację, uruchom w terminalu polecenie pwsh:

    pwsh
    

    Dane wyjściowe będą wyglądać mniej więcej tak:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

Pobieranie zestawu narzędzi do testowania

Zestaw narzędzi do testowania znajduje się w repozytorium GitHub. Wybierz jedną z następujących akcji:

Inspekcja zestawu narzędzi do testowania

Zestaw narzędzi do testowania został właśnie pobrany do wybranego katalogu. Przyjrzyjmy się strukturze katalogów. (Upewnij się, że plik został rozpakowany, jeśli wybrano opcję pobrania pliku zip zamiast uruchamiania git clone polecenia). Jeśli przejdziesz do katalogu zestawu narzędzi do testowania usługi ARM, musisz mieć strukturę katalogową podobną do poniższej:

-| arm-ttk/
-| unit-tests/
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md

Zestaw narzędzi do testowania znajduje się w podkatalogu \arm-ttk.

Tworzenie pliku szablonu

Wybierz katalog i utwórz plik o nazwie azuredeploy.json.

Ostrzeżenie

Upewnij się, że wybrany katalog jest pusty i nie ma podkatalogów

Dodaj następującą zawartość:

{
   "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {
      "location": {
         "type": "string",
         "defaultValue": "[resourceGroup().location]",
         "metadata": {
            "description": "Location for the resources."
         }
      }
   },
   "resources": [{
      "location": "westus"
   }]
}

Zanotuj lokalizację pliku szablonu. Aby wyświetlić ścieżkę, można uruchomić w terminalu polecenie pwd. Ta ścieżka będzie używana później jako parametr podczas uruchamiania zestawu narzędzi do testowania.

Wykrywanie i rozwiązywanie problemów dotyczących szablonu za pomocą uruchamiania zestawu narzędzi do testowania

Zalecamy uruchomienie programu Visual Studio Code i zintegrowanego terminalu.

Uruchomisz zestaw narzędzi do testowania w ramach ścieżki zawierającej szablon wdrożenia i naprawisz wszelkie wykryte błędy, zmieniając szablon.

Ostrzeżenie

W tym ćwiczeniu przeskanujesz jeden plik szablonu. Zestaw narzędzi do testowania skanuje wszystkie pliki w określonym katalogu. Dzieje się tak, ponieważ wdrożenie może składać się z kilku plików. Upewnij się, że w katalogu, w którym znajduje się plik azuredeploy.json, nie ma plików JSON.

  1. W terminalu przejdź do ścieżki, w której znajduje się plik azuredeploy.json. Uruchom następujące polecenie, aby uruchomić program Visual Studio Code:

    code .
    

    Uwaga

    Otwórz program Visual Studio Code ręcznie i otwórz katalog szablonów, jeśli program Visual Studio Code nie znajduje się w ścieżce.

  2. Z poziomu programu Visual Studio Code otwórz zintegrowany terminal, wybierając z menu głównego pozycję Terminal>Nowy terminal. Aby uruchomić powłokę programu PowerShell, uruchom w terminalu następujące polecenie:

    pwsh
    

    Wyświetlone dane wyjściowe powinny wyglądać mniej więcej tak:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    

Analiza szablonu

  1. Uruchom polecenie Import-Module, aby mieć możliwość uruchamiania testów z dowolnego miejsca.

    Uwaga

    Przed zaimportowaniem modułu zastąp ciąg patch/to/arm-ttk/arm-ttk.psd1 ścieżką do pobranego zestawu narzędzi do testowania.

    Import-Module path/to/arm-ttk/arm-ttk.psd1
    

    Napiwek

    Jeśli narzędzie zostanie pobrane lub sklonowane do katalogu Pobrane , ścieżka będzie wyglądać następująco: /Users/<user>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1.

    Teraz możesz przystąpić do korzystania z narzędzia. Dopóki jesteś w tej samej sesji programu PowerShell, nie ma potrzeby ponownego uruchamiania polecenia importowania.

  2. Uruchom polecenie Test-AzTemplate z parametrem -TemplatePath wskazującym lokalizację ścieżki pliku szablonu (z wyłączeniem nazwy pliku):

    Test-AzTemplate -TemplatePath .
    

    W terminalu zostaną wyświetlone dane wyjściowe podobne do następujących:

    Validating deploy\azuredeploy.json
      deploymentTemplate
        [+] adminUsername Should Not Be A Literal (4 ms)
        [+] apiVersions Should Be Recent (2 ms)
        [+] artifacts parameter (1 ms)
        [+] DependsOn Best Practices (2 ms)
        [+] Deployment Resources Must Not Be Debug (2 ms)
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms)
        [+] DeploymentTemplate Schema Is Correct (1 ms)
        [+] Dynamic Variable References Should Not Use Concat (1 ms)
        [+] IDs Should Be Derived From ResourceIDs (3 ms)
        [+] Location Should Not Be Hardcoded (1 ms)
        [+] ManagedIdentityExtension must not be used (2 ms)
        [+] Min And Max Value Are Numbers (1 ms)
        [+] Outputs Must Not Contain Secrets (4 ms)
        [-] Parameters Must Be Referenced (2 ms)
            Unreferenced parameter: location
    
        [+] Parameters Property Must Exist (1 ms)
        [+] providers apiVersions Is Not Permitted (1 ms)
        [+] ResourceIds should not contain (1 ms)
        [-] Resources Should Have Location (8 ms)
            Resource Location must be an expression or 'global'
    
        [+] Secure String Parameters Cannot Have Default (1 ms)
        [+] Template Should Not Contain Blanks (1 ms)
        [+] Variables Must Be Referenced (1 ms)
        [+] Virtual Machines Should Not Be Preview (3 ms)
        [+] VM Images Should Use Latest Version (1 ms)
        [+] VM Size Should Be A Parameter (3 ms)
    

    Powyższe dane wyjściowe pokazują, jak dwa testy kończą się niepowodzeniem: Zasoby powinny mieć lokalizację i parametry muszą być przywołyne. Prefiks [-] wskazuje test zakończony niepowodzeniem.

    Aby zrozumieć, co się dzieje, otwórz plik azuredeploy.json. Powinien on wyglądać następująco:

    {
       "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
       "contentVersion": "1.0.0.0",
       "parameters": {
          "location": {
             "type": "string",
             "defaultValue": "[resourceGroup().location]",
             "metadata": {
                "description": "Location for the resources."
             }
          }
       },
       "resources": [{
          "location": "westus"
       }]
    }
    

    Testy kończą się niepowodzeniem z dwóch powodów:

    • Nie użyto parametru location. Ten komunikat o błędzie może na przykład wskazywać, że parametr został użyty w przeszłości i nie został wyczyszczony. Albo że należy go użyć, ale zapomnieliśmy zaktualizować nasz kod.
    • Właściwość location jest ustawiona na ciąg westus zakodowany na stałe. Korzystanie z tej opcji nie jest dobrym rozwiązaniem, ponieważ podczas wdrażania chcesz mieć możliwość kontrolowania lokalizacji zasobu za pomocą parametrów wejściowych.

Wprowadzanie poprawek w szablonie

Jak naprawić testy zakończone niepowodzeniem?

Jak wskazuje test, możemy spróbować zastąpić ciąg westus tekstem global. Jednak to rozwiązałoby tylko jeden z problemów. Najprawdopodobniej chcemy użyć parametru location i ustawić lokalizację zasobów na tę wartość.

Jest tak z dwóch powodów. Nie tylko można ustawić parametr lokalizacji jako parametr wdrożenia, ale także mieć rozsądny rezerwowy zestaw do parametru resourceGroup().location jako defaultValue , jeśli pominięto parametr location podczas uruchamiania wdrożenia.

  1. Znajdź pierwszy element zasobu na tablicy resources (zasoby) i zastąp następującą zawartość:

    "resources": [{
      "location": "westus"
    }]
    

    tą zawartością:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. Uruchom ponownie narzędzie do testowania w zintegrowanym terminalu, aby zweryfikować poprawkę:

    Test-AzTemplate -TemplatePath .
    

    Otrzymasz teraz dane wyjściowe, w przypadku których wszystkie testy zostały zakończone powodzeniem:

    Validating deploy\azuredeploy.json
      deploymentTemplate
        [+] adminUsername Should Not Be A Literal (6 ms)
        [+] apiVersions Should Be Recent (2 ms)
        [+] artifacts parameter (1 ms)
        [+] DependsOn Best Practices (1 ms)
        [+] Deployment Resources Must Not Be Debug (1 ms)
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms)
        [+] DeploymentTemplate Schema Is Correct (1 ms)
        [+] Dynamic Variable References Should Not Use Concat (1 ms)
        [+] IDs Should Be Derived From ResourceIDs (4 ms)
        [+] Location Should Not Be Hardcoded (1 ms)
        [+] ManagedIdentityExtension must not be used (1 ms)
        [+] Min And Max Value Are Numbers (1 ms)
        [+] Outputs Must Not Contain Secrets (1 ms)
        [+] Parameters Must Be Referenced (1 ms)
        [+] Parameters Property Must Exist (1 ms)
        [+] providers apiVersions Is Not Permitted (1 ms)
        [+] ResourceIds should not contain (1 ms)
        [+] Resources Should Have Location (1 ms)
        [+] Secure String Parameters Cannot Have Default (1 ms)
        [+] Template Should Not Contain Blanks (1 ms)
        [+] Variables Must Be Referenced (1 ms)
        [+] Virtual Machines Should Not Be Preview (4 ms)
        [+] VM Images Should Use Latest Version (1 ms)
        [+] VM Size Should Be A Parameter (4 ms)
    

To wszystko! Uruchomiono narzędzie testowe oraz znaleziono błędy i naprawiono je.

  1. Postępuj zgodnie z instrukcjami w temacie Instalowanie programu PowerShell w systemie Windows.
  2. Zainstaluj rozszerzenie programu PowerShell z poziomu programu Visual Studio Code.

Pobieranie zestawu narzędzi do testowania

Zestaw narzędzi do testowania znajduje się w repozytorium GitHub. Wybierz jedną z następujących akcji:

Inspekcja zestawu narzędzi do testowania

Zestaw narzędzi do testowania został właśnie pobrany do wybranego katalogu. Przyjrzyjmy się strukturze katalogów. (Upewnij się, że plik został rozpakowany, jeśli wybrano opcję pobrania pliku zip zamiast uruchamiania git clone polecenia). Jeśli przejdziesz do katalogu zestawu narzędzi do testowania usługi ARM, musisz mieć strukturę katalogową podobną do poniższej:

-| arm-ttk\
-| unit-tests\
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md

Zestaw narzędzi do testowania znajduje się w podkatalogu \arm-ttk.

Tworzenie pliku szablonu

Wybierz dowolny katalog, na przykład C:\Temp, i utwórz plik o nazwie azuredeploy.json.

Ostrzeżenie

Upewnij się, że wybrany katalog jest pusty i nie ma podkatalogów

Dodaj następującą zawartość:

{
   "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
   "contentVersion": "1.0.0.0",
   "parameters": {
      "location": {
         "type": "string",
         "defaultValue": "[resourceGroup().location]",
         "metadata": {
            "description": "Location for the resources."
         }
      }
   },
   "resources": [{
      "location": "westus"
   }]
}

Zanotuj lokalizację pliku szablonu. Użyjesz tej ścieżki katalogu (na przykład C:\Temp) później jako parametru podczas uruchamiania zestawu narzędzi do testowania.

Wykrywanie i rozwiązywanie problemów dotyczących szablonu za pomocą uruchamiania zestawu narzędzi do testowania

Zalecamy uruchomienie programu Visual Studio Code i zintegrowanego terminalu.

Uruchomisz zestaw narzędzi do testowania w ramach ścieżki zawierającej szablon wdrożenia i naprawisz wszelkie wykryte błędy, zmieniając szablon.

Ostrzeżenie

W tym ćwiczeniu przeskanujesz jeden plik szablonu. Zestaw narzędzi do testowania skanuje wszystkie pliki w określonym katalogu. Dzieje się tak, ponieważ wdrożenie może składać się z kilku plików. Upewnij się, że w katalogu, w którym znajduje się plik azuredeploy.json, nie ma plików JSON.

  1. W terminalu przejdź do ścieżki, w której znajduje się plik azuredeploy.json. Uruchom następujące polecenie, aby uruchomić program Visual Studio Code:

    code .
    

    Uwaga

    Otwórz program Visual Studio Code ręcznie i otwórz katalog szablonów, jeśli program Visual Studio Code nie znajduje się w ścieżce.

  2. W programie Visual Studio Code uruchom paletę poleceń i wybierz polecenie PowerShell: Pokaż zintegrowaną konsolę.

Analiza szablonu

  1. Uruchom polecenie Import-Module w terminalu programu PowerShell:

    Uwaga

    Przed zaimportowaniem modułu zastąp ciąg path/to/arm-ttk/arm-ttk.psd1 ścieżką do pobranego zestawu narzędzi do testowania.

    Import-Module path\to\arm-ttk\arm-ttk.psd1
    

    Powyższe polecenie spowoduje wskazanie pozycji modułu zestawu narzędzi do testowania.

    Napiwek

    Jeśli narzędzie zostanie pobrane lub sklonowane do katalogu Pobrane , ścieżka będzie wyglądać następująco: C:\Users\<user>\Downloads\arm-ttk\arm-ttk\arm-ttk\arm-ttk.psd1.

    Teraz możesz przystąpić do korzystania z narzędzia. Dopóki jesteś w tej samej sesji programu PowerShell, nie ma potrzeby ponownego uruchamiania polecenia importowania.

    Uwaga

    Jeśli uruchomisz nową sesję programu PowerShell, musisz ponownie uruchomić Import-Module polecenie.

  2. Uruchom polecenie Test-AzTemplate w terminalu programu PowerShell, aby rozpocząć przebieg testu:

    Test-AzTemplate -TemplatePath .
    

    W terminalu zostaną wyświetlone dane wyjściowe podobne do następujących:

    Validating deploy\azuredeploy.json
      JSONFiles Should Be Valid
        [+] JSONFiles Should Be Valid (16 ms)
    Fail  : 0
    Total : 1
    Pass  : 1
    
    
    
      adminUsername Should Not Be A Literal
        [+] adminUsername Should Not Be A Literal (6 ms)
      apiVersions Should Be Recent In Reference Functions
        [+] apiVersions Should Be Recent In Reference Functions (10 ms)
      apiVersions Should Be Recent
        [+] apiVersions Should Be Recent (7 ms)
      artifacts parameter
        [+] artifacts parameter (5 ms)
      CommandToExecute Must Use ProtectedSettings For Secrets
        [+] CommandToExecute Must Use ProtectedSettings For Secrets (7 ms)
      DependsOn Best Practices
        [+] DependsOn Best Practices (6 ms)
      Deployment Resources Must Not Be Debug
        [+] Deployment Resources Must Not Be Debug (5 ms)
      DeploymentTemplate Must Not Contain Hardcoded Uri
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (5 ms)
      DeploymentTemplate Schema Is Correct
        [+] DeploymentTemplate Schema Is Correct (4 ms)
      Dynamic Variable References Should Not Use Concat
        [+] Dynamic Variable References Should Not Use Concat (4 ms)
      IDs Should Be Derived From ResourceIDs
        [+] IDs Should Be Derived From ResourceIDs (6 ms)
      deploymentTemplate
        [-] Location Should Not Be Hardcoded (13 ms)
            Location value of 'westus' on resource '' must be an expression or 'global'. Line: 14, Column: 9    
    
      ManagedIdentityExtension must not be used
        [+] ManagedIdentityExtension must not be used (5 ms)
      Min And Max Value Are Numbers
        [+] Min And Max Value Are Numbers (5 ms)
      Outputs Must Not Contain Secrets
        [+] Outputs Must Not Contain Secrets (5 ms)
      Parameter Types Should Be Consistent
        [+] Parameter Types Should Be Consistent (9 ms)
      deploymentTemplate
        [-] Parameters Must Be Referenced (6 ms)
            Unreferenced parameter: location Line: 5, Column: 9
    
      Password params must be secure
        [+] Password params must be secure (11 ms)
      providers apiVersions Is Not Permitted
        [+] providers apiVersions Is Not Permitted (5 ms)
      ResourceIds should not contain
        [+] ResourceIds should not contain (5 ms)
      deploymentTemplate
        [-] Resources Should Have Location (5 ms)
            Resource  Location must be an expression or 'global'
    
      Resources Should Not Be Ambiguous
        [+] Resources Should Not Be Ambiguous (7 ms)
      Secure Params In Nested Deployments
        [+] Secure Params In Nested Deployments (10 ms)
      Secure String Parameters Cannot Have Default
        [+] Secure String Parameters Cannot Have Default (7 ms)
      Template Should Not Contain Blanks
        [+] Template Should Not Contain Blanks (5 ms)
      URIs Should Be Properly Constructed
        [+] URIs Should Be Properly Constructed (8 ms)
      Variables Must Be Referenced
        [+] Variables Must Be Referenced (5 ms)
      Virtual Machines Should Not Be Preview
        [+] Virtual Machines Should Not Be Preview (8 ms)
      VM Images Should Use Latest Version
        [+] VM Images Should Use Latest Version (5 ms)
      VM Size Should Be A Parameter
        [+] VM Size Should Be A Parameter (5 ms)
    Fail  : 3
    Total : 31
    Pass  : 28
    

    Powyższe dane wyjściowe pokazują, jak trzy testy kończą się niepowodzeniem: Lokalizacja nie powinna być zakodowana na stałe, parametry muszą być przywołyne i Zasoby powinny mieć lokalizację. Prefiks [-] wskazuje test zakończony niepowodzeniem.

    Aby zrozumieć, co się dzieje, otwórz plik azuredeploy.json. Powinien on wyglądać następująco:

    {
       "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
       "contentVersion": "1.0.0.0",
       "parameters": {
          "location": {
             "type": "string",
             "defaultValue": "[resourceGroup().location]",
             "metadata": {
                "description": "Location for the resources."
             }
          }
       },
       "resources": [{
          "location": "westus"
       }]
    }
    

    Testy kończą się niepowodzeniem z dwóch powodów:

    • Nie użyto parametru location. Ten komunikat o błędzie może na przykład wskazywać, że parametr został użyty w przeszłości i nie został wyczyszczony. Albo że należy go użyć, ale zapomnieliśmy zaktualizować nasz kod.
    • Właściwość location jest ustawiona na ciąg westus zakodowany na stałe. Korzystanie z tej opcji nie jest dobrym rozwiązaniem, ponieważ podczas wdrażania chcesz mieć możliwość kontrolowania lokalizacji zasobu za pomocą parametrów wejściowych.

Wprowadzanie poprawek w szablonie

Jak naprawić testy zakończone niepowodzeniem?

Jak wskazuje test, możemy spróbować zastąpić ciąg westus tekstem global. Jednak to rozwiązałoby tylko jeden z problemów. Najprawdopodobniej chcemy użyć parametru location i ustawić lokalizację zasobów na tę wartość.

Jest tak z dwóch powodów. Nie tylko można ustawić parametr lokalizacji jako parametr wdrożenia, ale także mieć rozsądny rezerwowy zestaw do parametru resourceGroup().location jako defaultValue , jeśli pominięto parametr location podczas uruchamiania wdrożenia.

  1. Znajdź pierwszy element zasobu na tablicy resources (zasoby) i zastąp następującą zawartość:

    "resources": [{
       "location": "westus"
    }]
    

    tą zawartością:

    "resources": [{
       "location": "[parameters('location')]"
    }]
    
  2. Uruchom polecenie Test-AzTemplate, aby uruchomić ponownie narzędzie do testowania:

    Test-AzTemplate -TemplatePath .
    

    Otrzymasz teraz dane wyjściowe, w przypadku których wszystkie testy zostały zakończone powodzeniem:

    Validating deploy\azuredeploy.json
      JSONFiles Should Be Valid
        [+] JSONFiles Should Be Valid (83 ms)
    Fail  : 0
    Total : 1
    Pass  : 1
    
    
    
      adminUsername Should Not Be A Literal
        [+] adminUsername Should Not Be A Literal (36 ms)
      apiVersions Should Be Recent In Reference Functions
        [+] apiVersions Should Be Recent In Reference Functions (57 ms)
      piVersions Should Be Recent
        [+] apiVersions Should Be Recent (67 ms)
      artifacts parameter
        [+] artifacts parameter (19 ms)
      CommandToExecute Must Use ProtectedSettings For Secrets
        [+] CommandToExecute Must Use ProtectedSettings For Secrets (93 ms)
      DependsOn Best Practices
        [+] DependsOn Best Practices (52 ms)
      Deployment Resources Must Not Be Debug
        [+] Deployment Resources Must Not Be Debug (77 ms)
      DeploymentTemplate Must Not Contain Hardcoded Uri
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (18 ms)
      DeploymentTemplate Schema Is Correct
        [+] DeploymentTemplate Schema Is Correct (73 ms)
      Dynamic Variable References Should Not Use Concat
        [+] Dynamic Variable References Should Not Use Concat (72 ms)
      IDs Should Be Derived From ResourceIDs
        [+] IDs Should Be Derived From ResourceIDs (15 ms)
      Location Should Not Be Hardcoded
        [+] Location Should Not Be Hardcoded (24 ms)
      ManagedIdentityExtension must not be used
        [+] ManagedIdentityExtension must not be used (143 ms)
      Min And Max Value Are Numbers
        [+] Min And Max Value Are Numbers (23 ms)
      Outputs Must Not Contain Secrets
        [+] Outputs Must Not Contain Secrets (160 ms)
      Parameter Types Should Be Consistent
        [+] Parameter Types Should Be Consistent (13 ms)
      Parameters Must Be Referenced
        [+] Parameters Must Be Referenced (13 ms)
      Password params must be secure
        [+] Password params must be secure (12 ms)
      providers apiVersions Is Not Permitted
        [+] providers apiVersions Is Not Permitted (79 ms)
      ResourceIds should not contain
        [+] ResourceIds should not contain (12 ms)
      Resources Should Have Location
        [+] Resources Should Have Location (17 ms)
      Resources Should Not Be Ambiguous
        [+] Resources Should Not Be Ambiguous (17 ms)
      Secure Params In Nested Deployments
        [+] Secure Params In Nested Deployments (17 ms)
      Secure String Parameters Cannot Have Default
        [+] Secure String Parameters Cannot Have Default (16 ms)
      Template Should Not Contain Blanks
        [+] Template Should Not Contain Blanks (83 ms)
      URIs Should Be Properly Constructed
        [+] URIs Should Be Properly Constructed (108 ms)
      Variables Must Be Referenced
        [+] Variables Must Be Referenced (111 ms)
      Virtual Machines Should Not Be Preview
        [+] Virtual Machines Should Not Be Preview (16 ms)
      VM Images Should Use Latest Version
        [+] VM Images Should Use Latest Version (22 ms)
      VM Size Should Be A Parameter
        [+] VM Size Should Be A Parameter (133 ms)
    Fail  : 0
    Total : 31
    Pass  : 31   
    

To wszystko! Uruchomiono narzędzie testowe oraz znaleziono błędy i naprawiono je.

Teraz możesz przystąpić do uruchamiania testów dla szablonu.