Ejercicio: Aplicación de procedimientos recomendados a la plantilla mediante el kit de herramientas para pruebas de plantillas de ARM

Completado

Forma parte de un equipo de desarrollo de la empresa Tailwind Traders. Como parte de ese trabajo, debe crear plantillas de Azure Resource Manager (ARM) para implementar y administrar recursos en la nube. Quiere asegurarse de que las plantillas siguen una serie de procedimientos sólidos antes de que se implementen los recursos. Decide usar el kit de herramientas para pruebas de plantillas de ARM a fin de ayudarle a analizar las plantillas y poder rectificar los problemas.

Configuración del entorno de pruebas

La herramienta es un módulo de PowerShell. Para su ejecución, siga estos pasos:

  • Instale el módulo de PowerShell. Esta tarea se realiza de manera diferente en función de si se encuentra en Linux, Mac o Windows.
  • Descargue el módulo. El módulo se hospeda en un repositorio de GitHub. Puede descargarlo desde allí o capturarlo a través de un comando git clone.
  • Importe el módulo. Este paso es simplemente una instrucción de una línea que se escribe en una sesión de PowerShell, lo que hará que los comandos de ARM-TTK estén disponibles.

Instalar PowerShell

  1. Para instalar PowerShell, siga las instrucciones de Instalación de PowerShell en Linux.

  2. Ejecute pwsh en el terminal para comprobar la instalación:

    pwsh
    

    La salida será similar a esta:

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

Descarga del kit de herramientas para pruebas

El kit de herramientas para pruebas se encuentra en un repositorio de GitHub. Elija una de las acciones siguientes:

Inspección del kit de herramientas para pruebas

Acaba de descargar el kit de herramientas para pruebas en el directorio que ha elegido. Veamos la estructura de directorios (asegúrese de que ha descomprimido el archivo si optó por descargar el archivo. zip en lugar de ejecutar el comando git clone). Debe tener una estructura de directorios de aspecto similar al siguiente si va al directorio del kit de herramientas para pruebas de ARM:

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

El kit de herramientas para pruebas está en el subdirectorio /arm-ttk.

Cree el archivo de plantilla

Elija un directorio y cree un archivo llamado azuredeploy.json.

Advertencia

Asegúrese de que el directorio seleccionado está vacío y no contiene subdirectorios

Asígnele el siguiente contenido:

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

Anote la ubicación del archivo de plantilla. Puede ejecutar el comando pwd en el terminal para generar la ruta de acceso. Usará esta ruta de acceso más adelante como parámetro al ejecutar el kit de herramientas para pruebas.

Detección y corrección de problemas en la plantilla mediante la ejecución del kit de herramientas para pruebas

Se recomienda iniciar Visual Studio Code y un terminal integrado.

Ejecutará el kit de herramientas para pruebas en una ruta de acceso que contenga una plantilla de implementación y corregirá los errores que detecte cambiando la plantilla.

Advertencia

En este ejercicio se examina un archivo de plantilla. El kit de herramientas para pruebas examina todos los archivos situados debajo del directorio que especifique. Esto se debe a que una implementación puede contener varios archivos. Asegúrese de que no haya archivos JSON debajo del directorio donde se encuentra azuredeploy.json.

  1. En un terminal, vaya a la ruta de acceso donde reside el archivo azuredeploy.json. Ejecute el comando siguiente para iniciar Visual Studio Code:

    code .
    

    Nota:

    Abra Visual Studio Code de forma manual y abra el directorio de plantillas si Visual Studio Code no está en la ruta de acceso.

  2. Abra el terminal integrado desde Visual Studio Code; para ello, seleccione Terminal>Nuevo terminal en el menú principal. Ejecute el comando siguiente en el terminal para iniciar un shell de PowerShell:

    pwsh
    

    Verá una salida similar a esta:

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

Análisis de la plantilla

  1. Ejecute Import-Module para poder ejecutar las pruebas desde cualquier lugar.

    Nota:

    Antes de importar el módulo, reemplace ruta de acceso\a\arm-ttk\arm-ttk.psd1 con la ruta de acceso al kit de herramientas para pruebas descargado.

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

    Sugerencia

    Si ha descargado o clonado la herramienta en el directorio Descargas, la ruta será similar a esta: /Usuarios/<usuario>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1.

    Ahora está listo para usar la herramienta. Mientras se encuentre en la misma sesión de PowerShell, no es necesario volver a ejecutar el comando de importación.

  2. Ejecute Test-AzTemplate con el parámetro -TemplatePath apuntando a la ubicación de la ruta de acceso del archivo de plantilla (sin incluir el nombre de archivo):

    Test-AzTemplate -TemplatePath .
    

    Verá una salida similar a la siguiente en el terminal:

     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)
    

    En la salida, observe cómo hay dos pruebas que generan errores: Los recursos deben tener una ubicación y Se debe hacer referencia a los parámetros. El prefijo [-] indica una prueba con errores.

    Para comprender lo que sucede, abra el archivo azuredeploy.json. Debería ser parecido a este:

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

    Se producen errores en las pruebas por dos motivos:

    • No se usa el parámetro location. Por ejemplo, este mensaje de error indica que usamos el parámetro en el pasado y olvidamos limpiarlo. O bien, quizás se debería usar, pero olvidamos actualizar el código.
    • La propiedad location se establece en la cadena westus codificada de forma rígida. No se recomienda el uso de esta opción, ya que le interesa poder controlar la ubicación de un recurso con parámetros de entrada durante la implementación.

Aplicación de una corrección a la plantilla

¿Cómo solucionamos las pruebas con errores?

Como indica la prueba, se podría intentar reemplazar westus con el texto global. Sin embargo, eso solo corregiría uno de los problemas. Lo más probable es que le interese usar el parámetro location y establecer la ubicación de los recursos en ese valor.

El motivo es doble. No solo se puede establecer el parámetro location como parámetro para la implementación, sino que también tiene una reserva razonable de establecerse en resourceGroup().location como defaultValue si no establece el parámetro location al ejecutar la implementación.

  1. Busque el primer elemento de recurso de la matriz resources y reemplace el siguiente contenido:

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

    por este:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. Vuelva a ejecutar la herramienta para pruebas en el terminal integrado para comprobar la corrección:

    Test-AzTemplate -TemplatePath .
    

    Ahora obtiene una salida donde se superan todas las pruebas:

    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)
    

¡Hecho! Ha ejecutado la herramienta para pruebas, encontrado errores y los ha corregido.

  1. Siga las instrucciones de Instalación de PowerShell en macOS.

  2. Ejecute pwsh en el terminal para comprobar la instalación:

    pwsh
    

    La salida será similar a esta:

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

Descarga del kit de herramientas para pruebas

El kit de herramientas para pruebas se encuentra en un repositorio de GitHub. Elija una de las acciones siguientes:

Inspección del kit de herramientas para pruebas

Acaba de descargar el kit de herramientas para pruebas en el directorio que ha elegido. Veamos la estructura de directorios (asegúrese de que ha descomprimido el archivo si optó por descargar el archivo. zip en lugar de ejecutar el comando git clone). Debe tener una estructura de directorios de aspecto similar al siguiente si va al directorio del kit de herramientas para pruebas de ARM:

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

El kit de herramientas para pruebas está en el subdirectorio /arm-ttk.

Cree el archivo de plantilla

Elija un directorio y cree un archivo llamado azuredeploy.json.

Advertencia

Asegúrese de que el directorio seleccionado está vacío y no contiene subdirectorios

Asígnele el siguiente contenido:

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

Anote la ubicación del archivo de plantilla. Puede ejecutar el comando pwd en el terminal para generar la ruta de acceso. Usará esta ruta de acceso más adelante como parámetro al ejecutar el kit de herramientas para pruebas.

Detección y corrección de problemas en la plantilla mediante la ejecución del kit de herramientas para pruebas

Se recomienda iniciar Visual Studio Code y un terminal integrado.

Ejecutará el kit de herramientas para pruebas en una ruta de acceso que contenga una plantilla de implementación y corregirá los errores que detecte cambiando la plantilla.

Advertencia

En este ejercicio se examina un archivo de plantilla. El kit de herramientas para pruebas examina todos los archivos situados debajo del directorio que especifique. Esto se debe a que una implementación puede contener varios archivos. Asegúrese de que no haya archivos JSON debajo del directorio donde se encuentra azuredeploy.json.

  1. En un terminal, vaya a la ruta de acceso donde reside el archivo azuredeploy.json. Ejecute el comando siguiente para iniciar Visual Studio Code:

    code .
    

    Nota:

    Abra Visual Studio Code de forma manual y abra el directorio de plantillas si Visual Studio Code no está en la ruta de acceso.

  2. Abra el terminal integrado desde Visual Studio Code; para ello, seleccione Terminal>Nuevo terminal en el menú principal. Ejecute el comando siguiente en el terminal para iniciar un shell de PowerShell:

    pwsh
    

    Verá una salida similar a esta:

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

Análisis de la plantilla

  1. Ejecute Import-Module para poder ejecutar las pruebas desde cualquier lugar.

    Nota:

    Antes de importar el módulo, reemplace ruta de acceso\a\arm-ttk\arm-ttk.psd1 con la ruta de acceso al kit de herramientas para pruebas descargado.

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

    Sugerencia

    Si ha descargado o clonado la herramienta en el directorio Descargas, la ruta será similar a esta: /Usuarios/<usuario>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1.

    Ahora está listo para usar la herramienta. Mientras se encuentre en la misma sesión de PowerShell, no es necesario volver a ejecutar el comando de importación.

  2. Ejecute Test-AzTemplate con el parámetro -TemplatePath apuntando a la ubicación de la ruta de acceso del archivo de plantilla (sin incluir el nombre de archivo):

    Test-AzTemplate -TemplatePath .
    

    Verá una salida similar a la siguiente en el terminal:

    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)
    

    En la salida anterior se muestra cómo hay dos pruebas que generan errores: Los recursos deben tener una ubicación y Se debe hacer referencia a los parámetros. El prefijo [-] indica una prueba con errores.

    Para comprender lo que sucede, abra el archivo azuredeploy.json. Debería ser parecido a este:

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

    Se producen errores en las pruebas por dos motivos:

    • No se usa el parámetro location. Por ejemplo, este mensaje de error indica que usamos el parámetro en el pasado y olvidamos limpiarlo. O bien, quizás se debería usar, pero olvidamos actualizar el código.
    • La propiedad location se establece en la cadena westus codificada de forma rígida. No se recomienda el uso de esta opción, ya que le interesa poder controlar la ubicación de un recurso con parámetros de entrada durante la implementación.

Aplicación de una corrección a la plantilla

¿Cómo solucionamos las pruebas con errores?

Como indica la prueba, se podría intentar reemplazar westus con el texto global. Sin embargo, eso solo corregiría uno de los problemas. Lo más probable es que le interese usar el parámetro location y establecer la ubicación de los recursos en ese valor.

El motivo es doble. No solo se puede establecer el parámetro location como parámetro para la implementación, sino que también tiene una reserva razonable de establecerse en resourceGroup().location como defaultValue si no establece el parámetro location al ejecutar la implementación.

  1. Busque el primer elemento de recurso de la matriz resources y reemplace el siguiente contenido:

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

    por este:

    "resources": [{
      "location": "[parameters('location')]"
    }]
    
  2. Vuelva a ejecutar la herramienta para pruebas en el terminal integrado para comprobar la corrección:

    Test-AzTemplate -TemplatePath .
    

    Ahora obtiene una salida donde se superan todas las pruebas:

    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)
    

¡Hecho! Ha ejecutado la herramienta para pruebas, encontrado errores y los ha corregido.

  1. Siga las instrucciones de Instalación de PowerShell en Windows.
  2. Desde Visual Studio Code, instale la extensión PowerShell.

Descarga del kit de herramientas para pruebas

El kit de herramientas para pruebas se encuentra en un repositorio de GitHub. Elija una de las acciones siguientes:

Inspección del kit de herramientas para pruebas

Acaba de descargar el kit de herramientas para pruebas en el directorio que ha elegido. Veamos la estructura de directorios (asegúrese de que ha descomprimido el archivo si optó por descargar el archivo. zip en lugar de ejecutar el comando git clone). Debe tener una estructura de directorios de aspecto similar al siguiente si va al directorio del kit de herramientas para pruebas de ARM:

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

El kit de herramientas para pruebas está en el subdirectorio \arm-ttk.

Cree el archivo de plantilla

Cree un archivo llamado azuredeploy.json en un directorio que elija, como C:\Temp.

Advertencia

Asegúrese de que el directorio seleccionado está vacío y no contiene subdirectorios

Asígnele el siguiente contenido:

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

Anote la ubicación del archivo de plantilla. Usará esta ruta de acceso de directorio (por ejemplo, C:\Temp) más adelante como parámetro al ejecutar el kit de herramientas para pruebas.

Detección y corrección de problemas en la plantilla mediante la ejecución del kit de herramientas para pruebas

Se recomienda iniciar Visual Studio Code y un terminal integrado.

Ejecutará el kit de herramientas para pruebas en una ruta de acceso que contenga una plantilla de implementación y corregirá los errores que detecte cambiando la plantilla.

Advertencia

En este ejercicio se examina un archivo de plantilla. El kit de herramientas para pruebas examina todos los archivos situados debajo del directorio que especifique. Esto se debe a que una implementación puede contener varios archivos. Asegúrese de que no haya archivos JSON debajo del directorio donde se encuentra azuredeploy.json.

  1. En un terminal, vaya a la ruta de acceso donde reside el archivo azuredeploy.json. Ejecute el comando siguiente para iniciar Visual Studio Code:

    code .
    

    Nota:

    Abra Visual Studio Code de forma manual y abra el directorio de plantillas si Visual Studio Code no está en la ruta de acceso.

  2. Desde Visual Studio Code, abra la paleta de comandos y seleccione el comando PowerShell: Mostrar consola integrada.

Análisis de la plantilla

  1. Ejecute Import-Module en el terminal de PowerShell:

    Nota:

    Antes de importar el módulo, reemplace ruta de acceso\a\arm-ttk\arm-ttk.psd1 con la ruta de acceso al kit de herramientas para pruebas descargado.

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

    El comando anterior apuntará la posición del módulo del kit de herramientas para pruebas.

    Sugerencia

    Si ha descargado o clonado la herramienta en el directorio Descargas, la ruta será similar a esta: C:\Usuarios\<usuario>\Downloads\arm-ttk\arm-ttk\arm-ttk.psd1.

    Ahora está listo para usar la herramienta. Mientras se encuentre en la misma sesión de PowerShell, no es necesario volver a ejecutar el comando de importación.

    Nota

    Si inicia una nueva sesión de PowerShell, tendrá que volver a ejecutar el comando Import-Module.

  2. Ejecute Test-AzTemplate en el terminal de PowerShell para iniciar una serie de pruebas:

    Test-AzTemplate -TemplatePath .
    

    Verá una salida similar a la siguiente en el terminal:

    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
    

    En la salida anterior se muestra cómo se producen errores en tres pruebas: Location Should Not Be Hardcoded (La ubicación no se debe codificar de forma rígida), Parameters Must Be Referenced (Se debe hacer referencia a los parámetros) y Resources Should Have Location (Los recursos deben tener ubicación). El prefijo [-] indica una prueba con errores.

    Para comprender lo que sucede, abra el archivo azuredeploy.json. Debería ser parecido a este:

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

    Se producen errores en las pruebas por dos motivos:

    • No se usa el parámetro location. Por ejemplo, este mensaje de error indica que usamos el parámetro en el pasado y olvidamos limpiarlo. O bien, quizás se debería usar, pero olvidamos actualizar el código.
    • La propiedad location se establece en la cadena westus codificada de forma rígida. No se recomienda el uso de esta opción, ya que le interesa poder controlar la ubicación de un recurso con parámetros de entrada durante la implementación.

Aplicación de una corrección a la plantilla

¿Cómo solucionamos las pruebas con errores?

Como indica la prueba, se podría intentar reemplazar westus con el texto global. Sin embargo, eso solo corregiría uno de los problemas. Lo más probable es que le interese usar el parámetro location y establecer la ubicación de los recursos en ese valor.

El motivo es doble. No solo se puede establecer el parámetro location como parámetro para la implementación, sino que también tiene una reserva razonable de establecerse en resourceGroup().location como defaultValue si no establece el parámetro location al ejecutar la implementación.

  1. Busque el primer elemento de recurso de la matriz resources y reemplace el siguiente contenido:

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

    por este:

    "resources": [{
       "location": "[parameters('location')]"
    }]
    
  2. Ejecute Test-AzTemplate para volver a ejecutar la herramienta para pruebas:

    Test-AzTemplate -TemplatePath .
    

    Ahora obtiene una salida donde se superan todas las pruebas:

    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   
    

¡Hecho! Ha ejecutado la herramienta para pruebas, encontrado errores y los ha corregido.

Ahora está listo para ejecutar las pruebas en la plantilla.