Compartir vía


Configuración del entorno de desarrollo para scripts de implementación en archivos de Bicep

Aprenda a crear un entorno de desarrollo para desarrollar y probar scripts de implementación 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
param([string] $name, [string] $subscription)
$output = 'Hello {0}' -f $name
#Write-Output $output

Connect-AzAccount -UseDeviceAuthentication
Set-AzContext -subscription $subscription

$kv = Get-AzKeyVault
#Write-Output $kv

$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['greeting'] = $output
$DeploymentScriptOutputs['kv'] = $kv.resourceId
Write-Output $DeploymentScriptOutputs

En un script de implementación de Azure PowerShell, la variable $DeploymentScriptOutputs se usa para almacenar los valores de salida. Para obtener más información sobre cómo trabajar con las salidas de Azure PowerShell, consulte Trabajar con salidas.

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'

En 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 sobre cómo trabajar con las salidas de la CLI de Azure, consulte Trabajar con salidas de scripts de la CLI.

Uso de la instancia de contenedor de Azure PowerShell

Para crear los scripts de Azure PowerShell 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. 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 Azure PowerShell

El siguiente archivo de Bicep 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.

@description('Specify a project name that is used for generating resource names.')
param projectName string

@description('Specify the resource location.')
param location string = resourceGroup().location

@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7'

@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'

var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource fileShare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01' = {
  name: '${storageAccountName}/default/${fileShareName}'
  dependsOn: [
    storageAccount
  ]
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
  name: containerGroupName
  location: location
  properties: {
    containers: [
      {
        name: containerName
        properties: {
          image: containerImage
          resources: {
            requests: {
              cpu: 1
              memoryInGB: json('1.5')
            }
          }
          ports: [
            {
              protocol: 'TCP'
              port: 80
            }
          ]
          volumeMounts: [
            {
              name: 'filesharevolume'
              mountPath: mountPath
            }
          ]
          command: [
            '/bin/sh'
            '-c'
            'pwsh -c \'Start-Sleep -Seconds 1800\''
          ]
        }
      }
    ]
    osType: 'Linux'
    volumes: [
      {
        name: 'filesharevolume'
        azureFile: {
          readOnly: false
          shareName: fileShareName
          storageAccountName: storageAccountName
          storageAccountKey: storageAccount.listKeys().keys[0].value
        }
      }
    ]
  }
}

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 el archivo de Bicep es mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Consulte una lista de todas las versiones de Azure PowerShell compatibles.

El archivo de Bicep 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 el archivo de Bicep, use el siguiente script:

$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 Bicep 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 de la CLI de Azure 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. 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

El siguiente archivo de Bicep 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:

@description('Specify a project name that is used for generating resource names.')
param projectName string

@description('Specify the resource location.')
param location string = resourceGroup().location

@description('Specify the container image.')
param containerImage string = 'mcr.microsoft.com/azure-cli:2.9.1'

@description('Specify the mount path.')
param mountPath string = '/mnt/azscripts/azscriptinput'

var storageAccountName = toLower('${projectName}store')
var fileShareName = '${projectName}share'
var containerGroupName = '${projectName}cg'
var containerName = '${projectName}container'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource fileshare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
  name: '${storageAccountName}/default/${fileShareName}'
  dependsOn: [
    storageAccount
  ]
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
  name: containerGroupName
  location: location
  properties: {
    containers: [
      {
        name: containerName
        properties: {
          image: containerImage
          resources: {
            requests: {
              cpu: 1
              memoryInGB: json('1.5')
            }
          }
          ports: [
            {
              protocol: 'TCP'
              port: 80
            }
          ]
          volumeMounts: [
            {
              name: 'filesharevolume'
              mountPath: mountPath
            }
          ]
          command: [
            '/bin/bash'
            '-c'
            'echo hello; sleep 1800'
          ]
        }
      }
    ]
    osType: 'Linux'
    volumes: [
      {
        name: 'filesharevolume'
        azureFile: {
          readOnly: false
          shareName: fileShareName
          storageAccountName: storageAccountName
          storageAccountKey: storageAccount.listKeys().keys[0].value
        }
      }
    ]
  }
}

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 el archivo de Bicep es mcr.microsoft.com/azure-cli:2.9.1. Consulte una lista de versiones de la CLI de Azure compatibles. 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.

El archivo de Bicep 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 el archivo de Bicep:

$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 Bicep 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. El siguiente script 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:az10.0
    

    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.52.0
    

    En este ejemplo se usa la CLI versión 2.52.0. El script de implementación usa las imágenes de contenedores de la CLI predeterminadas.

  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:az10.0
    

    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:az10.0
    

    -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.52.0
    
  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.

Una vez que el script se ha probado satisfactoriamente, puede usarlo como script de implementación en sus archivos de Bicep.

Pasos siguientes

En este artículo, ha aprendido a crear entornos de desarrollo de scripts. Para obtener más información: