Partager via


Configurer l’environnement de développement pour les scripts de déploiement dans des modèles ARM

Découvrez comment créer un environnement de développement pour développer et tester des scripts de déploiement de modèle ARM avec une image de script de déploiement. Vous pouvez soit créer une instance de conteneur Azure, soit utiliser Docker. Les deux options sont décrites dans cet article.

Prérequis

Conteneur Azure PowerShell

Si vous n’avez pas de script de déploiement Azure PowerShell, vous pouvez créer un fichier hello.ps1 en utilisant le contenu suivant :

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

Conteneur Azure CLI

Pour une image conteneur Azure CLI, vous pouvez créer un fichier hello.sh en utilisant le contenu suivant :

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

Notes

Lorsque vous exécutez un script de déploiement Azure CLI, une variable d’environnement appelée AZ_SCRIPTS_OUTPUT_PATH stocke l’emplacement du fichier de sortie du script. La variable d’environnement n’est pas disponible dans le conteneur de l’environnement de développement. Pour plus d’informations sur l’utilisation des sorties Azure CLI, consultez Travailler avec les sorties du script CLI.

Utiliser une instance de conteneur Azure PowerShell

Pour créer vos scripts sur votre ordinateur, vous devez créer un compte de stockage et monter celui-ci dans l’instance de conteneur. Cela vous permettra de charger votre script dans le compte de stockage et d’exécuter le script sur l’instance de conteneur.

Notes

Le compte de stockage que vous créez pour tester votre script n’est pas le même que celui qu’utilise le service de script de déploiement pour exécuter le script. Le service de script de déploiement crée un nom unique sous forme de partage de fichiers à chaque exécution.

Créer une instance de conteneur Azure PowerShell

Le modèle Azure Resource Manager (modèle ARM) suivant crée une instance de conteneur et un partage de fichiers, puis monte ce dernier sur l’image conteneur.

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

La valeur par défaut du chemin de montage est /mnt/azscripts/azscriptinput. Il s’agit du chemin dans l’instance de conteneur où il est monté dans le partage de fichiers.

L’image conteneur par défaut spécifiée dans le modèle est mcr.microsoft.com/azuredeploymentscripts-powershell:az9.7. Consultez la liste de toutes les versions d’Azure PowerShell prises en charge.

Le modèle interrompt l’instance de conteneur après 1 800 secondes. Il faut compter 30 minutes avant que l’instance de conteneur passe à l’état terminé et que la session prenne fin.

Pour déployer le modèle, procédez comme suit :

$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

Charger le script de déploiement

Chargez votre script de déploiement dans le compte de stockage. Voici un exemple de script 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

Vous pouvez aussi charger le fichier à l’aide du portail Azure ou d’Azure CLI.

Tester le script de déploiement

  1. Dans le portail Azure, ouvrez le groupe de ressources dans lequel vous avez déployé l’instance de conteneur et le compte de stockage.

  2. Ouvrez le groupe de conteneurs. Par défaut, le nom du groupe de conteneurs est le nom du projet auquel est ajouté « cg ». L’instance de conteneur est à l’état En cours d’exécution.

  3. Dans le menu des ressources, sélectionnez Conteneurs. Le nom de l’instance de conteneur est le nom du projet auquel est ajouté « container ».

    Capture d’écran de l’option d’instance de conteneur du script de déploiement sur le Portail Azure.

  4. Sélectionnez Connecter, puis Connecter. Si vous ne pouvez pas vous connecter à l’instance de conteneur, redémarrez le groupe de conteneurs, puis réessayez.

  5. Dans le volet de la console, exécutez la commande suivante :

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

    La sortie est Hello John Dole.

    Capture d’écran de sortie de test d’instance de conteneur de connexion de script de déploiement affichée dans la console.

Utiliser une instance de conteneur Azure CLI

Pour créer vos scripts sur votre ordinateur, créez un compte de stockage et montez-le sur l’instance de conteneur. Vous pouvez ensuite charger votre script dans le compte de stockage et exécuter le script sur l’instance de conteneur.

Notes

Le compte de stockage que vous créez pour tester votre script n’est pas le même que celui qu’utilise le service de script de déploiement pour exécuter le script. Le service de script de déploiement crée un nom unique sous forme de partage de fichiers à chaque exécution.

Créer une instance de conteneur Azure CLI

Le modèle ARM suivant crée une instance de conteneur et un partage de fichiers, puis monte ce dernier sur l’image conteneur :

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

La valeur par défaut du chemin de montage est /mnt/azscripts/azscriptinput. Il s’agit du chemin dans l’instance de conteneur où il est monté dans le partage de fichiers.

L’image conteneur par défaut spécifiée dans le modèle est mcr.microsoft.com/azure-cli:2.9.1. Consultez la liste des versions de Azure CLI prises en charge.

Important

Le script de déploiement utilise les images CLI disponibles dans Microsoft Container Registry (MCR). Il faut environ un mois pour certifier une image CLI pour un script de déploiement. N’utilisez pas les versions de l’interface CLI qui ont été publiées il y a moins de 30 jours. Pour trouver les dates de publication des images, consultez les Notes de publication d’Azure CLI. Si vous utilisez une version non prise en charge, le message d’erreur répertorie les versions prises en charge.

Le modèle interrompt l’instance de conteneur après 1 800 secondes. Il faut compter 30 minutes avant que l’instance de conteneur passe à l’état terminé et que la session prenne fin.

Pour déployer le modèle, procédez comme suit :

$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

Charger le script de déploiement

Chargez votre script de déploiement dans le compte de stockage. Voici un exemple 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

Vous pouvez aussi charger le fichier à l’aide du portail Azure ou d’Azure CLI.

Tester le script de déploiement

  1. Dans le portail Azure, ouvrez le groupe de ressources dans lequel vous avez déployé l’instance de conteneur et le compte de stockage.

  2. Ouvrez le groupe de conteneurs. Par défaut, le nom du groupe de conteneurs est le nom du projet auquel est ajouté « cg ». L’instance de conteneur est affichée à l’état En cours d’exécution.

  3. Dans le menu des ressources, sélectionnez Conteneurs. Le nom de l’instance de conteneur est le nom du projet auquel est ajouté « container ».

    Capture d’écran de l’option d’instance de conteneur du script de déploiement sur le Portail Azure.

  4. Sélectionnez Connecter, puis Connecter. Si vous ne pouvez pas vous connecter à l’instance de conteneur, redémarrez le groupe de conteneurs, puis réessayez.

  5. Dans le volet de la console, exécutez la commande suivante :

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

    La sortie est Hello John Dole.

    Capture d’écran de sortie de test d’instance de conteneur de script de déploiement affichée dans la console.

Utiliser Docker

Vous pouvez utiliser une image conteneur Docker préconfigurée comme environnement de développement de script de déploiement. Pour installer le Docker, consultez Obtenir le Docker. Vous devez aussi configurer le partage de fichiers pour monter le répertoire, qui contient les scripts de déploiement dans le conteneur Docker.

  1. Extrayez l’image conteneur du script de déploiement pour la mettre sur l’ordinateur local :

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

    L’exemple utilise la version 4.3.0 de PowerShell.

    Pour extraire une image CLI de MCR :

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

    Cet exemple utilise la version 2.0.80 de CLI. Le script de déploiement utilise les images conteneurs CLI par défaut trouvées ici.

  2. Exécutez l’image Docker localement.

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

    Remplacez <host driver letter> (lettre de lecteur hôte) et <host directory name> (nom de répertoire hôte) par un dossier existant sur le lecteur partagé. Le dossier est alors mappé au dossier /data dans le conteneur. Par exemple, pour mapper D:\docker :

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

    -it indique de conserver l’image conteneur active.

    Exemple CLI :

    docker run -v d:/docker:/data -it mcr.microsoft.com/azure-cli:2.0.80
    
  3. La capture d’écran suivante illustre comment exécuter un script PowerShell, étant donné que vous avez un fichier helloworld.ps1 dans le dossier partagé.

    Capture d’écran du script de déploiement de modèle Resource Manager en utilisant la commande Docker.

Dès lors que le script a été testé avec succès, vous pouvez l’utiliser en tant que script de déploiement dans vos modèles.

Étapes suivantes

Dans cet article, vous avez appris à utiliser des scripts de déploiement. Pour suivre un tutoriel sur les scripts de déploiement :