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
Dans le portail Azure, ouvrez le groupe de ressources dans lequel vous avez déployé l’instance de conteneur et le compte de stockage.
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.
Dans le menu des ressources, sélectionnez Conteneurs. Le nom de l’instance de conteneur est le nom du projet auquel est ajouté « container ».
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.
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.
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
Dans le portail Azure, ouvrez le groupe de ressources dans lequel vous avez déployé l’instance de conteneur et le compte de stockage.
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.
Dans le menu des ressources, sélectionnez Conteneurs. Le nom de l’instance de conteneur est le nom du projet auquel est ajouté « container ».
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.
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.
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.
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.
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
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é.
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 :