Share via


Configuración del entorno de desarrollo para scripts de implementación en plantillas de Resource Manager

Aprenda a crear un entorno de desarrollo para desarrollar y probar scripts de implementación de plantillas de ARM con una imagen de script de implementación. Puede crear una instancia de contenedor de Azure o usar Docker. En este artículo se explican ambas opciones.

Requisitos previos

Contenedor de Azure PowerShell

Si no tiene un script de implementación de Azure PowerShell, puede crear un archivo hello.ps1 mediante el siguiente contenido:

param([string] $name)
$output = 'Hello {0}' -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output

Contenedor de la CLI de Azure

En el caso de una imagen de contenedor de la CLI de Azure, puede crear un archivo hello.sh con el siguiente contenido:

FIRSTNAME=$1
LASTNAME=$2
OUTPUT="{\"name\":{\"displayName\":\"$FIRSTNAME $LASTNAME\",\"firstName\":\"$FIRSTNAME\",\"lastName\":\"$LASTNAME\"}}"
echo -n "Hello "
echo $OUTPUT | jq -r '.name.displayName'

Nota:

Al ejecutar un script de implementación de la CLI de Azure, una variable de entorno denominada AZ_SCRIPTS_OUTPUT_PATH almacena la ubicación del archivo de salida del script. La variable de entorno no está disponible en el contenedor del entorno de desarrollo. Para obtener más información acerca cómo trabajar con las salidas de la CLI de Azure, consulte Tareas con las salidas del script de la CLI.

Uso de la instancia de contenedor de Azure PowerShell

Para crear los scripts en el equipo, debe crear una cuenta de almacenamiento y montarla en la instancia de contenedor. Así, podrá cargar el script en la cuenta de almacenamiento y ejecutar el script en la instancia de contenedor.

Nota:

La cuenta de almacenamiento que cree para probar el script no es la misma que usa el servicio de script de implementación para ejecutarlo. El servicio de implementación del script crea un nombre único como un recurso compartido de archivos en cada ejecución.

Creación de una instancia de contenedor de Azure PowerShell

La siguiente plantilla de Resource Manager crea una instancia de contenedor y un recurso compartido de archivos, y, luego, monta este en la imagen de contenedor.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specify a project name that is used for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the resource location."
      }
    },
    "containerImage": {
      "type": "string",
      "defaultValue": "mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7",
      "metadata": {
        "description": "Specify the container image."
      }
    },
    "mountPath": {
      "type": "string",
      "defaultValue": "/mnt/azscripts/azscriptinput",
      "metadata": {
        "description": "Specify the mount path."
      }
    }
  },
  "variables": {
    "storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
    "fileShareName": "[format('{0}share', parameters('projectName'))]",
    "containerGroupName": "[format('{0}cg', parameters('projectName'))]",
    "containerName": "[format('{0}container', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2023-01-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2023-05-01",
      "name": "[variables('containerGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "containers": [
          {
            "name": "[variables('containerName')]",
            "properties": {
              "image": "[parameters('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGB": "[json('1.5')]"
                }
              },
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "[parameters('mountPath')]"
                }
              ],
              "command": [
                "/bin/sh",
                "-c",
                "pwsh -c 'Start-Sleep -Seconds 1800'"
              ]
            }
          }
        ],
        "osType": "Linux",
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
              "readOnly": false,
              "shareName": "[variables('fileShareName')]",
              "storageAccountName": "[variables('storageAccountName')]",
              "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').keys[0].value]"
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    }
  ]
}

El valor predeterminado de la ruta de montaje es /mnt/azscripts/azscriptinput. Se trata de la ruta de acceso en la instancia de contenedor donde se monta en el recurso compartido de archivos.

La imagen de contenedor predeterminada especificada en la plantilla es mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Consulte una lista de todas las versiones de Azure PowerShell compatibles.

La plantilla suspende la instancia de contenedor después de 1800 segundos. Dispone de 30 minutos antes de que la instancia de contenedor pase al estado finalizado y la sesión finalice.

Para implementar la plantilla:

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName

Descargue el script de implementación.

Cargue el script de implementación en la cuenta de almacenamiento. A continuación se muestra un ejemplo de script de PowerShell:

$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"

$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"

$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force

También puede cargar el archivo mediante Azure Portal o la CLI de Azure.

Prueba del script de implementación

  1. En Azure Portal, abra el grupo de recursos en el que implementó la instancia de contenedor y la cuenta de almacenamiento.

  2. Abra el grupo de contenedores. El nombre predeterminado del grupo de contenedores es el nombre del proyecto con cg anexado. La instancia de contenedor está en el estado En ejecución.

  3. En el menú del recurso, seleccione Contenedores. El nombre de la instancia de contenedor es el del proyecto con la palabra container (contenedor) anexada.

    Captura de pantalla de la opción de conexión de la instancia de contenedor del script de implementación en Azure Portal.

  4. Seleccione Conectar y, después, Conectar. Si no puede conectarse a la instancia de contenedor, reinicie el grupo de contenedores e inténtelo de nuevo.

  5. En el panel de la consola, ejecute el siguiente comando:

    cd /mnt/azscripts/azscriptinput
    ls
    pwsh ./hello.ps1 "John Dole"
    

    La salida es Hello John Dole.

    Captura de pantalla de la salida de prueba de la conexión de la instancia de contenedor del script de implementación mostrada en la consola.

Uso de una instancia de contenedor de la CLI de Azure

Para crear los scripts en el equipo, cree una cuenta de almacenamiento y móntela en la instancia de contenedor. Después, podrá cargar el script en la cuenta de almacenamiento y ejecutar el script en la instancia de contenedor.

Nota:

La cuenta de almacenamiento que cree para probar el script no es la misma que usa el servicio de script de implementación para ejecutar el script. El servicio de implementación del script crea un nombre único como un recurso compartido de archivos en cada ejecución.

Creación de una instancia de contenedor de la CLI de Azure

La siguiente plantilla de ARM crea una instancia de contenedor y un recurso compartido de archivos y, a continuación, monta el recurso compartido de archivos en la imagen de contenedor:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specify a project name that is used for generating resource names."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the resource location."
      }
    },
    "containerImage": {
      "type": "string",
      "defaultValue": "mcr.microsoft.com/azure-cli:2.9.1",
      "metadata": {
        "description": "Specify the container image."
      }
    },
    "mountPath": {
      "type": "string",
      "defaultValue": "/mnt/azscripts/azscriptinput",
      "metadata": {
        "description": "Specify the mount path."
      }
    }
  },
  "variables": {
    "storageAccountName": "[toLower(format('{0}store', parameters('projectName')))]",
    "fileShareName": "[format('{0}share', parameters('projectName'))]",
    "containerGroupName": "[format('{0}cg', parameters('projectName'))]",
    "containerName": "[format('{0}container', parameters('projectName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('fileShareName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2023-05-01",
      "name": "[variables('containerGroupName')]",
      "location": "[parameters('location')]",
      "properties": {
        "containers": [
          {
            "name": "[variables('containerName')]",
            "properties": {
              "image": "[parameters('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGB": "[json('1.5')]"
                }
              },
              "ports": [
                {
                  "protocol": "TCP",
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "[parameters('mountPath')]"
                }
              ],
              "command": [
                "/bin/bash",
                "-c",
                "echo hello; sleep 1800"
              ]
            }
          }
        ],
        "osType": "Linux",
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
              "readOnly": false,
              "shareName": "[variables('fileShareName')]",
              "storageAccountName": "[variables('storageAccountName')]",
              "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').keys[0].value]"
            }
          }
        ]
      },
      "dependsOn": [
        "storageAccount"
      ]
    }
  ]
}

El valor predeterminado de la ruta de montaje es /mnt/azscripts/azscriptinput. Se trata de la ruta de acceso en la instancia de contenedor donde se monta en el recurso compartido de archivos.

La imagen de contenedor predeterminada especificada en la plantilla es mcr.microsoft.com/azure-cli:2.9.1. Consulte una lista de versiones de la CLI de Azure compatibles.

Importante

El script de implementación usa las imágenes de la CLI disponibles de Microsoft Container Registry (MCR). Se necesita aproximadamente un mes para certificar una imagen de la CLI para el script de implementación. No utilice las versiones de la CLI que se publicaron en un plazo de 30 días. Para buscar las fechas de publicación de las imágenes, consulte las notas de la versión de la CLI de Azure. Si usa una versión no compatible, el mensaje de error mostrará las versiones admitidas.

La plantilla suspende la instancia de contenedor después de 1800 segundos. Dispone de 30 minutos antes de que la instancia de contenedor pase al estado terminal y la sesión finalice.

Para implementar la plantilla:

$projectName = Read-Host -Prompt "Enter a project name that is used to generate resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$templateFile = Read-Host -Prompt "Enter the template file path and file name"
$resourceGroupName = "${projectName}rg"

New-AzResourceGroup -Location $location -name $resourceGroupName
New-AzResourceGroupDeployment -resourceGroupName $resourceGroupName -TemplateFile $templatefile -projectName $projectName

Descargue el script de implementación.

Cargue el script de implementación en la cuenta de almacenamiento. Este es un ejemplo de PowerShell:

$projectName = Read-Host -Prompt "Enter the same project name that you used earlier"
$fileName = Read-Host -Prompt "Enter the deployment script file name with the path"

$resourceGroupName = "${projectName}rg"
$storageAccountName = "${projectName}store"
$fileShareName = "${projectName}share"

$context = (Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName).Context
Set-AzStorageFileContent -Context $context -ShareName $fileShareName -Source $fileName -Force

También puede cargar el archivo mediante Azure Portal o la CLI de Azure.

Prueba del script de implementación

  1. En Azure Portal, abra el grupo de recursos en el que implementó la instancia de contenedor y la cuenta de almacenamiento.

  2. Abra el grupo de contenedores. El nombre predeterminado del grupo de contenedores es el nombre del proyecto con cg anexado. La instancia de contenedor se muestra en el estado En ejecución.

  3. En el menú del recurso, seleccione Contenedores. El nombre de la instancia de contenedor es el del proyecto con la palabra container (contenedor) anexada.

    Captura de pantalla de la opción de conexión de la instancia de contenedor del script de implementación en Azure Portal.

  4. Seleccione Conectar y, después, Conectar. Si no puede conectarse a la instancia de contenedor, reinicie el grupo de contenedores e inténtelo de nuevo.

  5. En el panel de la consola, ejecute el siguiente comando:

    cd /mnt/azscripts/azscriptinput
    ls
    ./hello.sh John Dole
    

    La salida es Hello John Dole.

    Captura de pantalla de la salida de prueba de la instancia de contenedor del script de implementación mostrada en la consola.

Uso de Docker

Puede usar una imagen de contenedor de Docker preconfigurada como entorno de desarrollo del script de implementación. Para instalar Docker, consulte Obtener Docker. También debe configurar el uso compartido de archivos para montar el directorio que contiene los scripts de implementación en el contenedor de Docker.

  1. Extraiga la imagen del contenedor de scripts de implementación en el equipo local:

    docker pull mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    En este ejemplo se usa PowerShell versión 4.3.0.

    Para extraer una imagen de la CLI de un MCR, haga lo siguiente:

    docker pull mcr.microsoft.com/azure-cli:2.0.80
    

    En este ejemplo se usa la CLI versión 2.0.80. El script de implementación usa las imágenes predeterminadas de contenedores de la CLI que se encuentran aquí.

  2. Ejecute la imagen de Docker de manera local.

    docker run -v <host drive letter>:/<host directory name>:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    Reemplace <letra de unidad del host> y <nombre del directorio host> por una carpeta existente en la unidad compartida. La carpeta se asigna a la carpeta /data del contenedor. Por ejemplo, para asignar D:\docker:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azuredeploymentscripts-powershell:az4.3
    

    -it significa mantener activa la imagen del contenedor.

    Un ejemplo de la CLI:

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
    
  3. En la siguiente captura de pantalla se muestra cómo ejecutar un script de PowerShell, dado que tiene un archivo helloworld.ps1 en la unidad compartida.

    Captura de pantalla del portal de script de implementación de plantilla de Resource Manager que usa el comando Docker.

Después de que el script se pruebe correctamente, puede usarlo como script de implementación en sus plantillas.

Pasos siguientes

En este artículo, aprendió a usar scripts de implementación. Para seguir un tutorial sobre scripts de implementación: