练习 - 使用 ARM 模板测试工具包对模板应用最佳做法

已完成

你是 Tailwind Traders 公司开发团队的成员。 在工作当中,你需要创作 ARM 资源管理器 (ARM) 模板来部署和管理云中的资源。 你需要确保在部署资源之前模板遵循一些合理做法。 你选择使用 ARM 模板测试工具包来帮助分析模板,这样就可以纠正任何问题。

设置测试环境

该工具是 PowerShell 模块。 若要能够运行该工具,请使用以下步骤:

  • 安装 PowerShell 模块。 根据使用的是 Linux、Mac 还是 Windows,此任务的执行方式有所不同。
  • 下载模块。 模块托管在 GitHub 存储库中。 可从此处下载或通过 git clone 命令获取。
  • 导入模块。 此步骤只是在 PowerShell 会话中输入的一行指令,这将使 ARM-TTK 命令可用。

安装 PowerShell

  1. 若要安装 PowerShell,请按照在 Linux 上安装 PowerShell 中的说明进行操作。

  2. 在终端中运行 pwsh 来验证安装:

    pwsh
    

    输出如下所示:

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

下载测试工具包

该测试工具包位于 GitHub 存储库中。 选择执行下列操作之一:

检查测试工具包

你刚才已将测试工具包下载到你选择的目录中。 让我们大致了解一下目录结构。 (如果你选择下载 .zip 文件而不是运行 git clone 命令,请确保已解压缩该文件。)如果要转到 ARM 测试工具包的目录,应具有如下所示的目录结构:

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

测试工具包位于子目录 /arm-ttk 中。

创建模板文件

选择目录,然后创建一个名为 azuredeploy.json 的文件。

警告

确保所选目录为空,不包含任何子目录。

为该目录提供以下内容:

   {
      "$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"
      }]
   }

记下模板文件的位置。 可在终端中运行 pwd 命令来输出路径。 稍后在运行测试工具包时,将使用此路径作为参数。

通过运行测试工具包来检测并修复模板相关问题

建议启动 Visual Studio Code 和集成终端。

你将在包含部署模板的路径上运行测试工具包,并通过更改模板来修复其检测到的所有错误。

警告

在本练习中扫描一个模板文件。 测试工具包会扫描指定目录下的所有文件。 这样做是因为部署可包含多个文件。 请确保 azuredeploy.json 文件所在的目录下不包含任何 JSON 文件。

  1. 在终端中,转到 azuredeploy.json 文件所在的路径。 运行以下命令来启动 Visual Studio Code:

    code .
    

    备注

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开模板目录。

  2. 在 Visual Studio Code 中,通过从顶部菜单中选择“终端”>“新终端”来打开集成终端。 在终端中运行以下命令,启动 PowerShell shell:

    pwsh
    

    应看到与以下内容类似的输出:

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

分析模板

  1. 运行 Import-Module,以便能够从任何位置运行测试。

    备注

    在导入模块之前,将 path/to/arm-ttk/arm-ttk.psd1 替换为已下载的测试工具包的路径。

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

    提示

    如果将工具下载或克隆到“下载”目录,则路径将类似于 /Users/<user>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1。

    现在可以使用该工具了。 只要处于同一 PowerShell 会话中,就无需再次运行导入命令。

  2. 运行带有 -TemplatePath 参数的 Test-AzTemplate,该参数指向模板文件路径(文件名除外)的位置:

    Test-AzTemplate -TemplatePath .
    

    你会在终端中看到如下所示的输出:

     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)
    

    在输出中,记下两个测试是如何失败的:“资源应具有位置”和“必须引用参数”。 前缀 [-] 表示失败的测试。

    若要了解具体情况,请打开 azuredeploy.json 文件。 它应如下所示:

    {
       "$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"
       }]
    }
    

    测试失败的原因有两个:

    • 未使用 location 参数。 例如,此错误消息可能表示过去使用了该参数,却忘了将其清除。 也可能表示应使用该参数,但忘了更新代码。
    • location 属性设置为硬编码字符串 westus。 使用此选项并不是一个好的做法,因为你希望能够在部署时使用输入参数来控制资源的位置。

将修补程序应用于模板

如何修复失败的测试?

如测试所示,我们可以尝试将“westus”替换为文本“全局”。 但是,这样做只能解决其中一个问题。 很可能需要使用 location 参数并将资源位置设置为相应的值。

原因有两个。 你可以将 location 参数设置为部署参数,但如果你在运行部署时没有设置 location 参数,也可以合理地将 resourceGroup().location 设置回默认值。

  1. 在资源数组中找到第一个资源项,并将以下内容:

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

    替换为此内容:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. 再次在集成终端中运行测试工具来验证修复情况:

    Test-AzTemplate -TemplatePath .
    

    现在将获得一个表示所有测试都通过的输出:

    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)
    

成功! 你已运行测试工具,找到错误,并予以修复。

  1. 按照在 macOS 上安装 PowerShell 中的说明进行操作。

  2. 在终端中运行 pwsh 来验证安装:

    pwsh
    

    输出如下所示:

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

下载测试工具包

该测试工具包位于 GitHub 存储库中。 选择执行下列操作之一:

检查测试工具包

你刚才已将测试工具包下载到你选择的目录中。 让我们大致了解一下目录结构。 (如果你选择下载 .zip 文件而不是运行 git clone 命令,请确保已解压缩该文件。)如果要转到 ARM 测试工具包的目录,应具有如下所示的目录结构:

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

测试工具包位于子目录 /arm-ttk 中。

创建模板文件

选择目录,然后创建一个名为 azuredeploy.json 的文件。

警告

确保所选目录为空,不包含任何子目录。

为该目录提供以下内容:

{
   "$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"
   }]
}

记下模板文件的位置。 可在终端中运行 pwd 命令来输出路径。 稍后在运行测试工具包时,将使用此路径作为参数。

通过运行测试工具包来检测并修复模板相关问题

建议启动 Visual Studio Code 和集成终端。

你将在包含部署模板的路径上运行测试工具包,并通过更改模板来修复其检测到的所有错误。

警告

在本练习中扫描一个模板文件。 测试工具包会扫描指定目录下的所有文件。 这样做是因为部署可包含多个文件。 请确保 azuredeploy.json 文件所在的目录下不包含任何 JSON 文件。

  1. 在终端中,转到 azuredeploy.json 文件所在的路径。 运行以下命令来启动 Visual Studio Code:

    code .
    

    备注

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开模板目录。

  2. 在 Visual Studio Code 中,通过从顶部菜单中选择“终端”>“新终端”来打开集成终端。 在终端中运行以下命令,启动 PowerShell shell:

    pwsh
    

    应看到与以下内容类似的输出:

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

分析模板

  1. 运行 Import-Module,以便能够从任何位置运行测试。

    备注

    在导入模块之前,将 path/to/arm-ttk/arm-ttk.psd1 替换为已下载的测试工具包的路径。

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

    提示

    如果将工具下载或克隆到“下载”目录,则路径将类似于 /Users/<user>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1。

    现在可以使用该工具了。 只要处于同一 PowerShell 会话中,就无需再次运行导入命令。

  2. 运行带有 -TemplatePath 参数的 Test-AzTemplate,该参数指向模板文件路径(文件名除外)的位置:

    Test-AzTemplate -TemplatePath .
    

    你会在终端中看到如下所示的输出:

    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)
    

    前面的输出显示了两个测试是如何失败的:“资源应具有位置”和“必须引用参数”。 前缀 [-] 表示失败的测试。

    若要了解具体情况,请打开 azuredeploy.json 文件。 它应如下所示:

    {
       "$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"
       }]
    }
    

    测试失败的原因有两个:

    • 未使用 location 参数。 例如,此错误消息可能表示过去使用了该参数,却忘了将其清除。 也可能表示应使用该参数,但忘了更新代码。
    • location 属性设置为硬编码字符串 westus。 使用此选项并不是一个好的做法,因为你希望能够在部署时使用输入参数来控制资源的位置。

将修补程序应用于模板

如何修复失败的测试?

如测试所示,我们可以尝试将“westus”替换为文本“全局”。 但是,这样做只能解决其中一个问题。 很可能需要使用 location 参数并将资源位置设置为相应的值。

原因有两个。 你可以将 location 参数设置为部署参数,但如果你在运行部署时没有设置 location 参数,也可以合理地将 resourceGroup().location 设置回默认值。

  1. 在资源数组中找到第一个资源项,并将以下内容:

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

    替换为此内容:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. 再次在集成终端中运行测试工具来验证修复情况:

    Test-AzTemplate -TemplatePath .
    

    现在将获得一个表示所有测试都通过的输出:

    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)
    

成功! 你已运行测试工具,找到错误,并予以修复。

  1. 按照在 Windows 上安装 PowerShell 中的说明进行操作。
  2. 从 Visual Studio Code 安装 PowerShell 扩展

下载测试工具包

该测试工具包位于 GitHub 存储库中。 选择执行下列操作之一:

检查测试工具包

你刚才已将测试工具包下载到你选择的目录中。 让我们大致了解一下目录结构。 (如果你选择下载 .zip 文件而不是运行 git clone 命令,请确保已解压缩该文件。)如果要转到 ARM 测试工具包的目录,应具有如下所示的目录结构:

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

测试工具包位于子目录 \arm-ttk 中。

创建模板文件

在所选目录(如 C:\Temp)中创建一个名为 azuredeploy.json 的文件。

警告

确保所选目录为空,不包含任何子目录。

为该目录提供以下内容:

{
   "$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"
   }]
}

记下模板文件的位置。 稍后在运行测试工具包时,将使用此目录路径(例如 C:\Temp)作为参数。

通过运行测试工具包来检测并修复模板相关问题

建议启动 Visual Studio Code 和集成终端。

你将在包含部署模板的路径上运行测试工具包,并通过更改模板来修复其检测到的所有错误。

警告

在本练习中扫描一个模板文件。 测试工具包会扫描指定目录下的所有文件。 这样做是因为部署可包含多个文件。 请确保 azuredeploy.json 文件所在的目录下不包含任何 JSON 文件。

  1. 在终端中,转到 azuredeploy.json 文件所在的路径。 运行以下命令来启动 Visual Studio Code:

    code .
    

    备注

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开模板目录。

  2. 从 Visual Studio Code,打开命令面板并选择命令“PowerShell:显示集成控制台”。

分析模板

  1. 在 PowerShell 终端中运行 Import-Module

    备注

    在导入模块之前,将 path\to\arm-ttk\arm-ttk.psd1 替换为已下载的测试工具包的路径。

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

    上述命令将指出测试工具包模块的位置。

    提示

    如果将工具下载或克隆到“下载”目录,则路径将类似于 C:\Users\<user>\Downloads\arm-ttk\arm-ttk\arm-ttk.psd1。

    现在可以使用该工具了。 只要处于同一 PowerShell 会话中,就无需再次运行导入命令。

    注意

    如果启动新的 PowerShell 会话,则需要再次运行 Import-Module 命令。

  2. 在 PowerShell 终端中运行 Test-AzTemplate,启动测试运行:

    Test-AzTemplate -TemplatePath .
    

    你会在终端中看到如下所示的输出:

    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
    

    前面的输出显示了三个测试失败的原因:位置不应硬编码、必须引用参数和资源应具有位置。 前缀 [-] 表示失败的测试。

    若要了解具体情况,请打开 azuredeploy.json 文件。 它应如下所示:

    {
       "$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"
       }]
    }
    

    测试失败的原因有两个:

    • 未使用 location 参数。 例如,此错误消息可能表示过去使用了该参数,却忘了将其清除。 也可能表示应使用该参数,但忘了更新代码。
    • location 属性设置为硬编码字符串 westus。 使用此选项并不是一个好的做法,因为你希望能够在部署时使用输入参数来控制资源的位置。

将修补程序应用于模板

如何修复失败的测试?

如测试所示,我们可以尝试将“westus”替换为文本“全局”。 但是,这样做只能解决其中一个问题。 很可能需要使用 location 参数并将资源位置设置为相应的值。

原因有两个。 你可以将 location 参数设置为部署参数,但如果你在运行部署时没有设置 location 参数,也可以合理地将 resourceGroup().location 设置回默认值。

  1. 在资源数组中找到第一个资源项,并将以下内容:

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

    替换为此内容:

    "resources": [{
       "location": "[parameters('location')]"
    }]
    
  2. 再次运行 Test-AzTemplate 来运行测试工具:

    Test-AzTemplate -TemplatePath .
    

    现在将获得一个表示所有测试都通过的输出:

    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   
    

成功! 你已运行测试工具,找到错误,并予以修复。

现在,可以在模板上运行测试了。