Utiliser des scripts de déploiement dans des modèles ARM
Découvrez comment utiliser des scripts de déploiement dans des modèles Azure Resource Manager (ARM). Avec la ressource deploymentScripts
, les utilisateurs peuvent exécuter des scripts dans des déploiements ARM et examiner les résultats d’exécution.
Conseil
Nous recommandons Bicep parce qu’il offre les mêmes fonctionnalités que les modèles ARM et que la syntaxe est plus facile d’utilisation. Pour plus d’informations, consultez Script de déploiement.
Ces scripts peuvent être utilisés pour effectuer des étapes personnalisées, comme :
- Ajouter des utilisateurs à un annuaire ;
- Effectuer des opérations de plan de données, par exemple, copier des objets blob ou alimenter une base de données ;
- Rechercher et valider une clé de licence ;
- Créez un certificat auto-signé.
- Créer un objet dans Microsoft Entra ID
- Rechercher des blocs d’adresses IP à partir du système personnalisé.
Les avantages du script de déploiement :
- Facile à coder, utiliser et déboguer. Vous pouvez développer des scripts de déploiement dans vos environnements de développement préférés. Les scripts peuvent être incorporés aux modèles ou dans des fichiers de script externe.
- Vous pouvez spécifier le langage de script et la plateforme. À l’heure actuelle, les scripts de déploiement Azure PowerShell et Azure CLI dans l’environnement Linux sont pris en charge.
- Permet la transmission des arguments de ligne de commande au script.
- Peut spécifier des sorties de script et les renvoyer au déploiement.
La ressource de script de déploiement n'est disponible que dans les régions où Azure Container Instance est disponible. Consultez Disponibilité des ressources pour Azure Container Instances dans les régions Azure. Actuellement, le script de déploiement utilise uniquement la mise en réseau publique.
Important
Le service de script de déploiement nécessite deux ressources complémentaires pour l’exécution et la résolution des problèmes de scripts : un compte de stockage et une instance de conteneur. Vous pouvez spécifier un compte de stockage existant. Sinon, le service de script en crée un pour vous. Les deux ressources complémentaires créées automatiquement sont généralement supprimées par le service de script quand l’exécution du script de déploiement arrive à un état terminal. Vous êtes facturé pour les ressources complémentaires jusqu’à ce qu’elles soient supprimées. Pour plus d’informations sur les prix, consultez Tarifs Container Instances et Tarifs Stockage Azure. Pour plus d’informations, consultez Nettoyer les ressources de script de déploiement.
Notes
La logique de nouvelle tentative pour la connexion à Azure est désormais intégrée au script wrapper. Si vous accordez des autorisations dans le même modèle que vos scripts de déploiement, le service de script de déploiement tente de se connecter pendant 10 minutes avec un intervalle de 10 secondes jusqu’à la réplication de l’attribution de rôle d’identité managée.
Ressources de formation
Si vous préférez découvrir les scripts de déploiement avec une aide pas à pas, consultez Étendre des modèles ARM à l’aide de scripts de déploiement.
Configurer les autorisations minimales
Pour l’API de script de déploiement version 2020-10-01 ou ultérieure, deux principaux sont impliqués dans l’exécution du script de déploiement :
Déploiement principal (principal utilisé pour le déploiement du modèle) : ce principal est utilisé pour créer des ressources sous-jacentes nécessaires à l’exécution de la ressource de script de déploiement : un compte de stockage et une instance de conteneur Azure. Pour configurer les autorisations de privilège minimum, affectez un rôle personnalisé avec les propriétés suivantes au principal de déploiement :
{ "roleName": "deployment-script-minimum-privilege-for-deployment-principal", "description": "Configure least privilege for the deployment principal in deployment script", "type": "customRole", "IsCustom": true, "permissions": [ { "actions": [ "Microsoft.Storage/storageAccounts/*", "Microsoft.ContainerInstance/containerGroups/*", "Microsoft.Resources/deployments/*", "Microsoft.Resources/deploymentScripts/*" ], } ], "assignableScopes": [ "[subscription().id]" ] }
Si le stockage Azure et les fournisseurs de ressources Azure Container Instance n’ont pas été inscrits, vous devez également ajouter
Microsoft.Storage/register/action
etMicrosoft.ContainerInstance/register/action
.Principal du script de déploiement : ce principal est requis uniquement si le script de déploiement doit s’authentifier auprès d’Azure et appeler l’instance CLI Azure/PowerShell. Deux méthodes permettent de spécifier le principal du script de déploiement :
- Spécifiez une identité managée affectée par l’utilisateur dans la
identity
propriété (voir exemples de modèles). Lorsqu’il est spécifié, le service de script appelleConnect-AzAccount -Identity
avant d’appeler le script de déploiement. L’identité managée doit avoir l’accès requis pour terminer l’opération dans le script. Actuellement, seule l’identité managée affectée par l’utilisateur est prise en charge pour la propriétéidentity
. Pour vous connecter avec une identité différente, utilisez la deuxième méthode de cette liste. - Transmettez les informations d’identification du principal de service en tant que variables d’environnement sécurisées, puis appelez Connecter-AzAccount ou az login dans le script de déploiement.
Si une identité gérée est utilisée, le principal de déploiement a besoin du rôle Opérateur d’identités gérées (un rôle intégré) affecté à la ressource d’identité gérée.
- Spécifiez une identité managée affectée par l’utilisateur dans la
Exemples de modèles
L’extrait JSON ci-dessous est un exemple. Pour plus d’informations, consultez la dernière version du schéma de modèle.
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "runPowerShellInline",
"location": "[resourceGroup().location]",
"tags": {
"tagName1": "tagValue1",
"tagName2": "tagValue2"
},
"kind": "AzurePowerShell", // or "AzureCLI"
"identity": {
"type": "userAssigned",
"userAssignedIdentities": {
"/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myID": {}
}
},
"properties": {
"forceUpdateTag": "1",
"containerSettings": {
"containerGroupName": "mycustomaci"
},
"storageAccountSettings": {
"storageAccountName": "myStorageAccount",
"storageAccountKey": "myKey"
},
"azPowerShellVersion": "9.7", // or "azCliVersion": "2.47.0",
"arguments": "-name \\\"John Dole\\\"",
"environmentVariables": [
{
"name": "UserName",
"value": "jdole"
},
{
"name": "Password",
"secureValue": "jDolePassword"
}
],
"scriptContent": "
param([string] $name)
$output = 'Hello {0}. The username is {1}, the password is {2}.' -f $name,${Env:UserName},${Env:Password}
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
", // or "primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",
"supportingScriptUris":[],
"timeout": "PT30M",
"cleanupPreference": "OnSuccess",
"retentionInterval": "P1D"
}
}
Notes
L’exemple ne sert qu’à des fins de démonstration. Les propriétés scriptContent
et primaryScriptUri
ne peuvent pas coexister dans un modèle.
Notes
La propriété scriptContent affiche un script de plusieurs lignes. Le portail Azure et le pipeline Azure DevOps ne peuvent pas analyser un script de déploiement de plusieurs lignes. Vous pouvez chaîner les commandes PowerShell (en utilisant des points-virgules ou \rn ou \n) en une seule ligne, ou utiliser la propriété primaryScriptUri
avec un fichier de script externe. De nombreux outils gratuits d’échappement ou d’annulation d’échappement de chaîne JSON sont disponibles. Par exemple, https://www.freeformatter.com/json-escape.html.
Détails des valeurs de propriété :
identity
: Pour l’API de script de déploiement version 2020-10-01 ou ultérieure, une identité managée attribuée par l’utilisateur est facultative, sauf si vous devez effectuer des actions spécifiques à Azure dans le script. Pour la version d’API 2019-10-01-preview, une identité managée est nécessaire, car le service de script de déploiement l’utilise pour exécuter les scripts. Lorsque la propriété d’identité est spécifiée, le service de script appelleConnect-AzAccount -Identity
avant d’appeler le script utilisateur. Actuellement, seule l’identité managée affectée par l’utilisateur est prise en charge. Pour vous connecter avec une identité différente, vous pouvez appeler Connect-AzAccount dans le script.tags
: Balises de script de déploiement. Si le service de script de déploiement génère un compte de stockage et une instance de conteneur, les balises sont transmises aux deux ressources, qui peuvent être utilisées pour les identifier. Une autre façon d’identifier ces ressources consiste à utiliser leurs suffixes, qui contiennent des « azscripts ». Pour plus d’informations, consultez Surveiller et dépanner les scripts de déploiement.kind
: spécifie le type de script. Actuellement, les scripts Azure PowerShell et Azure CLI sont pris en charge. Les valeurs sont AzurePowerShell et AzureCLI.forceUpdateTag
: la modification de cette valeur entre les déploiements de modèle force le script de déploiement à s’exécuter de nouveau. Si vous utilisez les fonctionsnewGuid()
ouutcNow()
, ces deux fonctions ne peuvent être utilisées que dans la valeur par défaut d’un paramètre. Pour plus d’informations, consultez Exécuter le script plusieurs fois.containerSettings
: Spécifiez les paramètres pour personnaliser l’instance de conteneur Azure. Le script de déploiement nécessite une nouvelle instance de conteneur Azure. Vous ne pouvez pas spécifier une instance de conteneur Azure existante. Toutefois, vous pouvez personnaliser le nom du groupe de conteneurs en utilisantcontainerGroupName
. S’il n’est pas spécifié, le nom du groupe est généré automatiquement.storageAccountSettings
: Spécifiez les paramètres pour utiliser un compte de stockage existant. SistorageAccountName
n’est pas spécifié, un compte de stockage est créé automatiquement. Consultez Utiliser un compte de stockage existant.azPowerShellVersion
/azCliVersion
: spécifie la version du module à utiliser. Consultez la liste des versions de Azure PowerShell prises en charge. La version détermine l’image conteneur à utiliser :- La version Az supérieure ou égale à 9 utilise Ubuntu 22.04.
- La version Az supérieure ou égale à 6 mais inférieure à 9 utilise Ubuntu 20.04.
- La version Az inférieure à 6 utilise Ubuntu 18.04.
Important
Il est recommandé de mettre à niveau vers la dernière version d’Ubuntu, car Ubuntu 18.04 arrive à sa fin de vie et ne recevra plus de mises à jour de sécurité au-delà du 31 mai 2023.
Consultez la liste des versions de Azure CLI prises en charge.
Important
Le script de déploiement utilise les images CLI disponibles à partir de Microsoft Container Registry (MCR). La certification d’une image CLI pour un script de déploiement prend environ un mois. 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 une version non prise en charge est utilisée, le message d’erreur répertorie les versions prises en charge.
arguments
: Spécifiez les valeurs de paramètre. Les valeurs sont séparées par des espaces.Les scripts de déploiement divisent les arguments en un tableau de chaînes en effectuant l’appel système CommandLineToArgvW. Cette étape est nécessaire, car les arguments sont transmis en tant que propriétés de commande à Azure Container Instance et la propriété de commande est un tableau de chaîne.
Si les arguments contiennent des caractères d’échappement, utilisez JsonEscaper pour double-placer les caractères. Collez votre chaîne d’échappement d’origine dans l’outil, puis sélectionnez Échappement. L’outil génère une chaîne avec deux séquences d’échappement. Par exemple, dans l’exemple de modèle précédent, l’argument est
-name \"John Dole\"
. La chaîne placée dans une séquence d’échappement est-name \\\"John Dole\\\"
.Pour passer un paramètre de modèle ARM d’objet type en tant qu’argument, convertissez l’objet en chaîne à l’aide de la fonction chaîne(), puis utilisez la fonction remplacer() pour remplacer tout
\"
en\\\"
. Par exemple :replace(string(parameters('tables')), '\"', '\\\"')
Pour plus d’informations, consultez l’exemple de modèle.
environmentVariables
: spécifie les variables d'environnement à transmettre au script. Pour plus d'informations, consultez Développer des scripts de déploiement.scriptContent
: précise le contenu du script. Pour exécuter un script externe, utilisez plutôtprimaryScriptUri
. Pour obtenir des exemples, consultez Utiliser un script inclus et Utiliser un script externe.primaryScriptUri
: spécifiez une URL accessible publiquement pour le script de déploiement principal avec les extensions de fichier prises en charge. Pour plus d’informations, consultez Utiliser des scripts externes.primaryScriptUri
: spécifiez un tableau d’URL accessibles publiquement pour les fichiers de support qui seront appelés danssupportingScriptUris
ouscriptContent
. Pour plus d’informations, consultez Utiliser des scripts externes.timeout
: précise la durée d’exécution maximale autorisée du script, définie au format ISO 8601. La valeur par défaut est P1D.cleanupPreference
. Spécifiez la préférence de nettoyage des deux ressources de déploiement complémentaires, du compte de stockage et de l’instance de conteneur quand l’exécution du script arrive à un état terminal. Le paramètre par défaut est Always, ce qui signifie que les ressources complémentaires sont supprimées malgré l’état terminal (Succeeded, Failed, Canceled). Pour plus d’informations, consultez Nettoyer les ressources de script de déploiement.retentionInterval
: Spécifie l’intervalle pendant lequel le service conserve la ressource du script de déploiement quand l’exécution du script arrive à un état terminal. La ressource du script de déploiement est supprimée à la fin de cette période. La durée est basée sur le modèle ISO 8601. L’intervalle de rétention est compris entre 1 et 26 heures (PT26H). Cette propriété est utilisée quandcleanupPreference
a la valeur OnExpiration. Pour plus d’informations, consultez Nettoyer les ressources de script de déploiement.
Autres exemples
- Exemple 1 : créez un coffre de clés et utiliser le script de déploiement pour affecter un certificat au coffre de clés.
- Exemple 2 : créez un groupe de ressources au niveau de l’abonnement, créez un coffre de clés dans le groupe de ressources, puis utilisez le script de déploiement pour affecter un certificat au coffre de clés.
- Exemple 3 : créez une identité gérée affectée par l’utilisateur, attribuez le rôle collaborateur à l’identité au niveau du groupe de ressources, créez un coffre de clés, puis utilisez le script de déploiement pour affecter un certificat au coffre de clés.
- Exemple 4 : il s’agit du même scénario que l’Exemple 1 dans cette liste. Un nouveau groupe de ressources est créé pour exécuter le script de déploiement. Ce modèle est un modèle de niveau d’abonnement.
- Exemple 5 : il s’agit du même scénario que l’Exemple 4. Ce modèle est un modèle de niveau groupe de ressources.
- Exemple 6 : créez manuellement une identité managée affectée par l’utilisateur et attribuez-lui l’autorisation d’utiliser l’API Microsoft Graph pour créer des applications Microsoft Entra. Dans le modèle ARM, utilisez un script de déploiement pour créer une application et un principal de service Microsoft Entra et générer les ID d’objet et l’ID client.
Utiliser des scripts inclus
Le modèle suivant dispose d’une ressource définie avec le type Microsoft.Resources/deploymentScripts
. La partie en surbrillance est le script inclus.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"name": {
"type": "string",
"defaultValue": "\\\"John Dole\\\""
},
"utcValue": {
"type": "string",
"defaultValue": "[utcNow()]"
}
},
"resources": [
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "runPowerShellInlineWithOutput",
"location": "[resourceGroup().location]",
"kind": "AzurePowerShell",
"properties": {
"forceUpdateTag": "[parameters('utcValue')]",
"azPowerShellVersion": "8.3",
"scriptContent": "
param([string] $name)
$output = \"Hello {0}\" -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
",
"arguments": "[concat('-name', ' ', parameters('name'))]",
"timeout": "PT1H",
"cleanupPreference": "OnSuccess",
"retentionInterval": "P1D"
}
}
],
"outputs": {
"result": {
"value": "[reference('runPowerShellInlineWithOutput').outputs.text]",
"type": "string"
}
}
}
Notes
Étant donné que les scripts de déploiement inclus sont placés entre guillemets doubles, les chaînes contenues dans les scripts de déploiement doivent être échappées à l’aide d’une barre oblique inverse (\) ou mises entre guillemets simples. Vous pouvez également envisager d’utiliser la substitution de chaîne, comme montré dans l’exemple JSON précédent.
Le script accepte un paramètre, et génère la valeur du paramètre. DeploymentScriptOutputs
s’utilise pour stocker les sorties. À la section outputs, la ligne value
montre comment accéder aux valeurs stockées. Write-Output
s’utilise pour le débogage. Pour savoir comment accéder au fichier de sortie, consultez Analyser et résoudre les problèmes des scripts de déploiement. Pour obtenir les descriptions des propriétés, consultez Exemples de modèles.
Afin d’exécuter le script, sélectionnez Try it (Essayer) pour ouvrir Cloud Shell, puis collez le code suivant dans le volet de l’interpréteur de commandes.
$resourceGroupName = Read-Host -Prompt "Enter the name of the resource group to be created"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.json"
Write-Host "Press [ENTER] to continue ..."
Le résultat se présente ainsi :
Utiliser des scripts externes
En plus des scripts inclus, vous pouvez utiliser des fichiers de script externe. Seuls les scripts PowerShell principaux dotés de l’extension de fichier ps1 sont pris en charge. Pour les scripts CLI, les scripts principaux peuvent avoir n’importe quelle extension (ou n’avoir aucune extension), à condition que les scripts soient des scripts Bash valides. Pour utiliser les fichiers de script externe, remplacez scriptContent
par primaryScriptUri
. Par exemple :
"primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",
Pour plus d’informations, consultez l’exemple de modèle.
Les fichiers de script externe doivent être accessibles. Pour sécuriser vos fichiers de script stockés dans des comptes de stockage Azure, générez un jeton SAP et incluez-le dans l’URI du modèle. Définissez le délai d’expiration de façon à laisser suffisamment de temps pour terminer le déploiement. Pour plus d’informations, consultez Déployer un modèle privé ARM avec un jeton SAP.
Vous êtes chargé de garantir l'intégrité des scripts référencés par le script de déploiement, à savoir primaryScriptUri
ou supportingScriptUris
. Référencez uniquement les scripts auxquels vous faites confiance.
Utiliser des scripts de prise en charge
Vous pouvez séparer les logiques complexes en un ou plusieurs fichiers de script de prise en charge. La propriété supportingScriptUris
vous permet de fournir un tableau d’URI pour les fichiers de script de prise en charge, le cas échéant :
"scriptContent": "
...
./Create-Cert.ps1
...
"
"supportingScriptUris": [
"https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/create-cert.ps1"
],
Les fichiers de script de prise en charge peuvent être appelés à partir de scripts inclus et de fichiers de script principal. Les fichiers de script de prise en charge n’ont aucune restriction quant à l’extension de fichier.
Les fichiers de prise en charge sont copiés dans azscripts/azscriptinput
au moment de l’exécution. Utilisez un chemin relatif pour référencer les fichiers de prise en charge à partir de scripts inclus et de fichiers de script principal.
Utiliser les sorties des scripts PowerShell
Le modèle suivant montre comment passer des valeurs entre deux ressources deploymentScripts
:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"name": {
"type": "string",
"defaultValue": "John Dole"
},
"utcValue": {
"type": "string",
"defaultValue": "[utcNow()]"
}
},
"resources": [
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "scriptInTemplate1",
"location": "[resourceGroup().location]",
"kind": "AzurePowerShell",
"properties": {
"forceUpdateTag": "[parameters('utcValue')]",
"azPowerShellVersion": "8.3",
"timeout": "PT1H",
"arguments": "[concat('-name', ' ', concat('\\\"', parameters('name'), '\\\"'))]",
"scriptContent": "
param([string] $name)
$output = 'Hello {0}' -f $name
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
",
"cleanupPreference": "Always",
"retentionInterval": "P1D"
}
},
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "scriptInTemplate2",
"location": "[resourceGroup().location]",
"kind": "AzurePowerShell",
"dependsOn": [
"scriptInTemplate1"
],
"properties": {
"forceUpdateTag": "[parameters('utcValue')]",
"azPowerShellVersion": "8.3",
"timeout": "PT1H",
"arguments": "[concat('-textToEcho', ' ', concat('\\\"', reference('scriptInTemplate1').outputs.text, '\\\"'))]",
"scriptContent": "
param([string] $textToEcho)
Write-Output $textToEcho
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $textToEcho
",
"cleanupPreference": "Always",
"retentionInterval": "P1D"
}
}
],
"outputs": {
"result": {
"value": "[reference('scriptInTemplate2').outputs.text]",
"type": "string"
}
}
}
Dans la première ressource, vous définissez une variable appelée $DeploymentScriptOutputs
et l’utilisez pour stocker les valeurs de sortie. Pour accéder à la valeur de sortie à partir d’une autre ressource dans le modèle, utilisez :
reference('<ResourceName>').outputs.text
Utiliser les sorties des scripts CLI
Contrairement aux scripts de déploiement Azure PowerShell, CLI/bash n’expose pas de variable commune pour le stockage des sorties de script. Au lieu de cela, il utilise une variable d’environnement nommée AZ_SCRIPTS_OUTPUT_PATH
pour indiquer l’emplacement du fichier de sorties de script. Lors de l’exécution d’un script de déploiement dans un modèle ARM, l’interpréteur de commandes Bash configure automatiquement cette variable d’environnement pour vous. Sa valeur prédéfinie est définie avec /mnt/azscripts/azscriptoutput/scriptoutputs.json. Les sorties doivent se conformer à une structure d’objet de chaîne JSON valide. Le contenu du fichier doit être mis sous la forme d’une paire clé-valeur. Par exemple, un tableau de chaînes doit être enregistré sous { "MyResult": [ "foo", "bar"] }. Le stockage uniquement des résultats du tableau, tels que [ "foo", "bar" ], est considéré comme non valide.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"identity": {
"type": "string"
},
"utcValue": {
"type": "string",
"defaultValue": "[utcNow()]"
}
},
"resources": [
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2020-10-01",
"name": "runBashWithOutputs",
"location": "[resourceGroup().location]",
"kind": "AzureCLI",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"[parameters('identity')]": {
}
}
},
"properties": {
"forceUpdateTag": "[parameters('utcValue')]",
"AzCliVersion": "2.40.0",
"timeout": "PT30M",
"arguments": "'foo' 'bar'",
"environmentVariables": [
{
"name": "UserName",
"value": "jdole"
},
{
"name": "Password",
"secureValue": "jDolePassword"
}
],
"scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo \"arg2 is: $2\"; echo \"Username is: $UserName\"; echo \"password is: $Password\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
"cleanupPreference": "OnExpiration",
"retentionInterval": "P1D"
jq est utilisé dans l’exemple précédent. Il est fourni avec les images conteneurs. Consultez Configurer l’environnement de développement.
Utiliser un compte de stockage existant
Un compte de stockage et une instance de conteneur sont nécessaires pour l’exécution et la résolution des problèmes d’un script. Vous avez le choix entre les options pour spécifier un compte de stockage existant ; sinon, le compte de stockage et l’instance de conteneur sont automatiquement créés par le service de script. Exigences requises pour l’utilisation d’un compte de stockage existant :
Les types de comptes de stockage pris en charge sont les suivants :
SKU Genre pris en charge Premium_LRS FileStorage Premium_ZRS FileStorage Standard_GRS Storage, StorageV2 Standard_GZRS StorageV2 Standard_LRS Storage, StorageV2 Standard_RAGRS Storage, StorageV2 Standard_RAGZRS StorageV2 Standard_ZRS StorageV2 Ces combinaisons prennent en charge les partages de fichiers. Pour plus d’informations, consultezCrée un partage de fichiers Azure et Types de compte de stockage.
Les règles de pare-feu de compte de stockage ne sont pas encore prises en charge. Pour plus d’informations, consultez Configurer Pare-feu et réseaux virtuels dans Stockage Azure.
Le principal de déploiement doit avoir les autorisations nécessaires pour gérer le compte de stockage, y compris la lecture, la création et la suppression des partages de fichiers.
La propriété
allowSharedKeyAccess
du compte de stockage doit être définie surtrue
. La seule façon de monter un compte de stockage dans Azure Container Instance(ACI) consiste à utiliser une clé d’accès.
Pour spécifier un compte de stockage existant, ajoutez le code JSON suivant à l’élément de propriété de Microsoft.Resources/deploymentScripts
:
"storageAccountSettings": {
"storageAccountName": "myStorageAccount",
"storageAccountKey": "myKey"
},
storageAccountName
: spécifiez le nom du compte de stockage.storageAccountKey
: spécifiez l’une des clés de compte de stockage. Vous pouvez utiliser la fonction listKeys() pour récupérer la clé. Par exemple :"storageAccountSettings": { "storageAccountName": "[variables('storageAccountName')]", "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]" }
Consultez Exemples de modèles pour obtenir un exemple complet de la définition Microsoft.Resources/deploymentScripts
.
Lorsqu’un compte de stockage existant est utilisé, le service de script crée un partage de fichiers avec un nom unique. Pour savoir comment le service de script nettoie le partage de fichiers, consultez Nettoyer les ressources de script de déploiement.
Développer des scripts de déploiement
Gérer les erreurs sans fin d’exécution
Vous pouvez contrôler la façon dont PowerShell répond aux erreurs sans fin d’exécution à l’aide de la variable $ErrorActionPreference
dans votre script de déploiement. Si la variable n’est pas définie dans votre script de déploiement, le service de script utilise la valeur par défaut Continuer.
Le service de script définit l’état d’approvisionnement de la ressource sur Échec quand le script rencontre une erreur malgré le paramètre $ErrorActionPreference
.
Utiliser des variables d’environnement
Le script de déploiement utilise ces variables d’environnement :
Variable d’environnement | Valeur par défaut | Réservé au système |
---|---|---|
AZ_SCRIPTS_AZURE_ENVIRONMENT | AzureCloud | N |
AZ_SCRIPTS_CLEANUP_PREFERENCE | OnExpiration | N |
AZ_SCRIPTS_OUTPUT_PATH | <AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY>/<AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME> | O |
AZ_SCRIPTS_PATH_INPUT_DIRECTORY | /mnt/azscripts/azscriptinput | O |
AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY | /mnt/azscripts/azscriptoutput | O |
AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME | Azure PowerShell : userscript.ps1 ; Azure CLI : userscript.sh | O |
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME | primaryscripturi.config | O |
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME | supportingscripturi.config | O |
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME | scriptoutputs.json | O |
AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAM | executionresult.json | O |
AZ_SCRIPTS_USER_ASSIGNED_IDENTITY | /subscriptions/ | N |
Pour plus d’informations sur l’utilisation de AZ_SCRIPTS_OUTPUT_PATH
, consultez Utiliser des sorties à partir de scripts de déploiement.
Passer des chaînes sécurisées au script de déploiement
La définition de variables d'environnement (EnvironmentVariable) dans vos instances de conteneur vous permet de fournir une configuration dynamique de l'application ou du script exécuté par le conteneur. Le script de déploiement gère les variables d’environnement sécurisées et non sécurisées de la même manière qu’Azure Container Instance. Pour plus d’informations, consultez Définir des variables d’environnement dans des instances de conteneur. Pour un exemple, voir Exemples de modèles.
La taille maximale autorisée pour les variables d’environnement est de 64 Ko.
Analyser et détecter les problèmes des scripts de déploiement
Le service de script crée un compte de stockage (sauf si vous spécifiez un compte de stockage existant) et une instance de conteneur pour l’exécution du script. Si ces ressources sont créées automatiquement par le service de script, les deux ressources ont le suffixe azscripts
dans les noms des ressources.
Le script utilisateur, les résultats de l’exécution et le fichier stdout sont stockés dans les partages de fichiers du compte de stockage. Un dossier est nommé azscripts
. Dans celui-ci, se trouvent deux dossiers supplémentaires pour les fichiers d’entrée et de sortie : azscriptinput
et azscriptoutput
.
Le dossier output contient un fichier executionresult.json et le fichier de sortie du script. Vous pouvez voir le message d’erreur de l’exécution du script dans executionresult.json. Le fichier de sortie est créé uniquement lorsque le script est exécuté correctement. Le dossier input contient un fichier de script PowerShell système et les fichiers de script de déploiement utilisateur. Vous pouvez remplacer le fichier de script de déploiement utilisateur par un fichier révisé, puis réexécuter le script de déploiement à partir de l’instance de conteneur Azure.
Utilisation du portail Azure
Une fois que vous avez déployé une ressource de script de déploiement, la ressource est listée sous le groupe de ressources dans la Portail Azure. La capture d’écran suivante montre la page de présentation d’une ressource de script de déploiement :
La page de présentation affiche des informations importantes sur la ressource, telles que l’État d’approvisionnement, le Compte de stockage, l’Instance de conteneuret les Journaux.
Dans le menu de gauche, vous pouvez afficher le contenu du script de déploiement, les arguments passés au script et la sortie. Vous pouvez également exporter un modèle pour le script de déploiement, y compris le script de déploiement.
Utiliser PowerShell
À l’aide de Azure PowerShell, vous pouvez gérer les scripts de déploiement au niveau de l’abonnement ou de l’étendue du groupe de ressources :
- Get-AzDeploymentScript : Obtient ou liste les scripts de déploiement.
- Get-AzDeploymentScriptLog : Obtient le journal de l’exécution d’un script de déploiement.
- Remove-AzDeploymentScript : Supprime un script de déploiement et ses ressources associées.
- Save-AzDeploymentScriptLog : Enregistre le journal d’exécution d’un script de déploiement sur le disque.
Le résultat Get-AzDeploymentScript
ressemble à ce qui suit :
Name : runPowerShellInlineWithOutput
Id : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput
ResourceGroupName : myds0618rg
Location : centralus
SubscriptionId : aaaabbbb-0000-cccc-1111-dddd2222eeee
ProvisioningState : Succeeded
Identity : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mydentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami
ScriptKind : AzurePowerShell
AzPowerShellVersion : 9.7
StartTime : 5/11/2023 7:46:45 PM
EndTime : 5/11/2023 7:49:45 PM
ExpirationDate : 5/12/2023 7:49:45 PM
CleanupPreference : OnSuccess
StorageAccountId : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.Storage/storageAccounts/ftnlvo6rlrvo2azscripts
ContainerInstanceId : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.ContainerInstance/containerGroups/ftnlvo6rlrvo2azscripts
Outputs :
Key Value
================== ==================
text Hello John Dole
RetentionInterval : P1D
Timeout : PT1H
Utiliser l’interface de ligne de commande Microsoft Azure
À l’aide de Azure CLI, vous pouvez gérer les scripts de déploiement au niveau de l’abonnement ou de l’étendue du groupe de ressources :
- supprimer les scripts de déploiement az : Supprimez un script de déploiement.
- lister des scripts de déploiement az : Listez tous les scripts de déploiement.
- montrer les scripts de déploiement az : Récupérez un script de déploiement.
- journal des scripts de déploiement az : Affichez les journaux de script de déploiement.
La sortie de la commande de liste ressemble à ce qui suit :
[
{
"arguments": "'foo' 'bar'",
"azCliVersion": "2.40.0",
"cleanupPreference": "OnExpiration",
"containerSettings": {
"containerGroupName": null
},
"environmentVariables": null,
"forceUpdateTag": "20231101T163748Z",
"id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runBashWithOutputs",
"identity": {
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "userAssigned",
"userAssignedIdentities": {
"/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourcegroups/myidentity/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"principalId": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
}
},
"kind": "AzureCLI",
"location": "centralus",
"name": "runBashWithOutputs",
"outputs": {
"Result": [
{
"id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mytest/providers/Microsoft.KeyVault/vaults/mykv1027",
"resourceGroup": "mytest"
}
]
},
"primaryScriptUri": null,
"provisioningState": "Succeeded",
"resourceGroup": "mytest",
"retentionInterval": "1 day, 0:00:00",
"scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
"status": {
"containerInstanceId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mytest/providers/Microsoft.ContainerInstance/containerGroups/eg6n7wvuyxn7iazscripts",
"endTime": "2023-11-01T16:39:12.080950+00:00",
"error": null,
"expirationTime": "2023-11-02T16:39:12.080950+00:00",
"startTime": "2023-11-01T16:37:53.139700+00:00",
"storageAccountId": null
},
"storageAccountSettings": {
"storageAccountKey": null,
"storageAccountName": "dsfruro267qwb4i"
},
"supportingScriptUris": null,
"systemData": {
"createdAt": "2023-10-31T19:06:57.060909+00:00",
"createdBy": "someone@contoso.com",
"createdByType": "User",
"lastModifiedAt": "2023-11-01T16:37:51.859570+00:00",
"lastModifiedBy": "someone@contoso.com",
"lastModifiedByType": "User"
},
"tags": null,
"timeout": "0:30:00",
"type": "Microsoft.Resources/deploymentScripts"
}
]
Avec l’API REST
Vous pouvez récupérer les informations de déploiement de la ressource de script de déploiement au niveau du groupe de ressources et du niveau de l’abonnement à l’aide de l’API REST :
/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>?api-version=2020-10-01
/subscriptions/<SubscriptionID>/providers/microsoft.resources/deploymentScripts?api-version=2020-10-01
L’exemple suivant utilise ARMClient :
armclient login
armclient get /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourcegroups/myrg/providers/microsoft.resources/deploymentScripts/myDeployementScript?api-version=2020-10-01
Le résultat ressemble à ce qui suit :
{
"kind": "AzurePowerShell",
"identity": {
"type": "userAssigned",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"userAssignedIdentities": {
"/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myidentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
"principalId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444"
}
}
},
"location": "centralus",
"systemData": {
"createdBy": "someone@contoso.com",
"createdByType": "User",
"createdAt": "2023-05-11T02:59:04.7501955Z",
"lastModifiedBy": "someone@contoso.com",
"lastModifiedByType": "User",
"lastModifiedAt": "2023-05-11T02:59:04.7501955Z"
},
"properties": {
"provisioningState": "Succeeded",
"forceUpdateTag": "20220625T025902Z",
"azPowerShellVersion": "9.7",
"scriptContent": "\r\n param([string] $name)\r\n $output = \"Hello {0}\" -f $name\r\n Write-Output $output\r\n $DeploymentScriptOutputs = @{}\r\n $DeploymentScriptOutputs['text'] = $output\r\n ",
"arguments": "-name \\\"John Dole\\\"",
"retentionInterval": "P1D",
"timeout": "PT1H",
"containerSettings": {},
"status": {
"containerInstanceId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.ContainerInstance/containerGroups/64lxews2qfa5uazscripts",
"storageAccountId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Storage/storageAccounts/64lxews2qfa5uazscripts",
"startTime": "2023-05-11T02:59:07.5951401Z",
"endTime": "2023-05-11T03:00:16.7969234Z",
"expirationTime": "2023-05-12T03:00:16.7969234Z"
},
"outputs": {
"text": "Hello John Dole"
},
"cleanupPreference": "OnSuccess"
},
"id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput",
"type": "Microsoft.Resources/deploymentScripts",
"name": "runPowerShellInlineWithOutput"
}
L’API REST suivante retourne le journal :
/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>/logs?api-version=2020-10-01
Elle fonctionne uniquement avant la suppression des ressources de script de déploiement.
Pour afficher la ressource deploymentScripts dans le portail, sélectionnez Afficher les types masqués :
Nettoyer les ressources de script de déploiement
Les deux ressources complémentaires créées automatiquement ne peuvent jamais survivre à la ressource deploymentScript
, sauf en cas d’échec de leur suppression. Le cycle de vie des ressources complémentaires est contrôlé par la propriété cleanupPreference
. Le cycle de vie de la ressource deploymentScript
est contrôlé par la propriété retentionInterval
:
cleanupPreference
: Spécifie la préférence de nettoyage des deux ressources complémentaires quand l’exécution du script arrive à un état terminal. Les valeurs prises en charge sont les suivantes :Always : Supprime les deux ressources complémentaires quand l’exécution du script arrive à un état terminal. Si un compte de stockage existant est utilisé, le service de script supprime le partage de fichiers créé par le service. Étant donné que la ressource
deploymentScripts
risque d’être toujours présente après le nettoyage des ressources complémentaires, le service de script conserve les résultats de l’exécution du script (par exemple, stdout, sorties et valeur renvoyée) avant la suppression des ressources.OnSuccess : Supprime les deux ressources complémentaires uniquement quand l’exécution du script s’est déroulée correctement. Si un compte de stockage existant est utilisé, le service de script supprime le partage de fichiers uniquement en cas de réussite de l’exécution du script.
Si l’exécution du script échoue, le service de script attend l’expiration de
retentionInterval
avant de nettoyer les ressources complémentaires, puis la ressource du script de déploiement.OnExpiration : Supprime les deux ressources complémentaires uniquement quand le paramètre
retentionInterval
arrive à expiration. Si un compte de stockage existant est utilisé, le service de script supprime le partage de fichiers, mais conserve le compte de stockage.
L’instance de conteneur et le compte de stockage sont supprimés en fonction de
cleanupPreference
. Toutefois, si le script échoue et sicleanupPreference
n’est pas défini sur Always, le processus de déploiement maintient automatiquement l’exécution du conteneur pendant une heure ou jusqu’au nettoyage du conteneur. Vous pouvez utiliser cette période pour résoudre les problèmes de script. Si vous souhaitez laisser le conteneur s’exécuter après des déploiements réussis, ajoutez une étape de mise en veille à votre script. Par exemple, ajoutez Start-Sleep à la fin de votre script. Si vous n’ajoutez pas l’étape de mise en veille, le conteneur est défini sur un état terminal et n’est pas accessible, même s’il n’a pas encore été supprimé.retentionInterval
: Spécifie l’intervalle de temps pendant lequel une ressourcedeploymentScript
est conservée et après lequel elle expire et est supprimée.
Notes
Il n’est pas recommandé d’utiliser le compte de stockage et l’instance de conteneur qui sont générés par le service de script à d’autres fins. Les deux ressources peuvent être supprimées en fonction du cycle de vie du script.
L’instance de compte de stockage et de conteneur créée automatiquement ne peut pas être supprimée si le script de déploiement est déployé vers un groupe de ressources avec un verrou CanNotDelete. Pour résoudre ce problème, vous pouvez déployer le script de déploiement vers un autre groupe de ressources sans verrous. Consultez l’Exemple 4 et l’Exemple 5 dans les Exemples de modèles.
Exécuter le script plusieurs fois
L’exécution d’un script de déploiement est une opération idempotente. Si aucune des propriétés de la ressource deploymentScripts
(y compris le script inclus) n’est modifiée, le script ne s’exécute pas lorsque vous redéployez le modèle. Le service de script de déploiement compare les noms des ressource du modèle aux ressources existantes dans le même groupe de ressources. Vous avez deux options à votre disposition si vous souhaitez exécuter le même script de déploiement plusieurs fois :
Sélectionnez le nom de votre ressource
deploymentScripts
. Par exemple, utilisez la fonction de modèle utcNow comme nom de ressource, ou comme partie du nom de la ressource. La modification du nom de la ressource crée une nouvelle ressourcedeploymentScripts
. C’est un moyen pratique pour conserver un historique de l’exécution des scripts.Notes
La fonction
utcNow
peut uniquement être utilisée dans la valeur par défaut d’un paramètre.Spécifiez une autre valeur dans la propriété de modèle
forceUpdateTag
. Par exemple, utilisezutcNow
comme valeur.
Notes
Écrivez les scripts de déploiement qui sont idempotents. Cela garantit que, s’ils sont exécutés accidentellement, cela n’entraînera de modifications du système. Par exemple, si le script de déploiement est utilisé pour créer une ressource Azure, vérifiez que la ressource n’existe pas avant de la créer, afin que le script aboutisse ou que vous ne recréiez pas la ressource.
Configurer l’environnement de développement
Vous pouvez utiliser une image conteneur préconfigurée comme environnement de développement de scripts de déploiement. Pour plus d’informations, consultez Configuration de l’environnement de développement pour les scripts de déploiement dans les modèles.
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.
Codes d’erreur des scripts de déploiement
Code d'erreur | Description |
---|---|
DeploymentScriptInvalidOperation | La définition de la ressource de script de déploiement dans le modèle contient des noms de propriétés non valides. |
DeploymentScriptResourceConflict | Il est impossible de supprimer une ressource de script de déploiement qui se trouve dans un état non terminal et dont l’exécution n’a pas dépassé une heure. Il est également impossible de réexécuter le même script de déploiement avec le même identificateur de ressource (même abonnement, même nom de groupe de ressources et même nom de ressource), mais un contenu de corps de script différent en même temps. |
DeploymentScriptOperationFailed | L’opération de script de déploiement a échoué en interne. Contactez le Support Microsoft. |
DeploymentScriptStorageAccountAccessKeyNotSpecified | La clé d’accès n’a pas été spécifiée pour le compte de stockage existant. |
DeploymentScriptContainerGroupContainsInvalidContainers | Un groupe de conteneurs créé par le service de script de déploiement a été modifié en externe et des conteneurs non valides ont été ajoutés. |
DeploymentScriptContainerGroupInNonterminalState | Au moins deux ressources de script de déploiement utilisent le même nom Azure Container Instance dans le même groupe de ressources, et l’une d’entre elles n’a pas encore terminé son exécution. |
DeploymentScriptStorageAccountInvalidKind | Le compte de stockage existant du type BlobBlobStorage ou BlobStorage ne prend pas en charge les partages de fichiers et ne peut pas être utilisé. |
DeploymentScriptStorageAccountInvalidKindAndSku | Le compte de stockage existant ne prend pas en charge les partages de fichiers. Pour connaître la liste des types de comptes de stockage pris en charge, consultez Recours à un compte de stockage existant. |
DeploymentScriptStorageAccountNotFound | Le compte de stockage n’existe pas ou a été supprimé par un processus ou un outil externe. |
DeploymentScriptStorageAccountWithServiceEndpointEnabled | Le compte de stockage spécifié possède un point de terminaison de service. Les comptes de stockage comportant un point de terminaison de service ne sont pas pris en charge. |
DeploymentScriptStorageAccountInvalidAccessKey | La clé d’accès spécifiée pour le compte de stockage existant n’est pas valide. |
DeploymentScriptStorageAccountInvalidAccessKeyFormat | Le format de la clé de compte de stockage n’est pas valide. Consultez Gérer les clés d’accès au compte de stockage. |
DeploymentScriptExceededMaxAllowedTime | Le temps d’exécution du script de déploiement a dépassé la valeur de délai d’attente spécifiée dans la définition de la ressource de script de déploiement. |
DeploymentScriptInvalidOutputs | La sortie du script de déploiement n’est pas un objet JSON valide. |
DeploymentScriptContainerInstancesServiceLoginFailure | L’identité managée attribuée par l’utilisateur n’est pas parvenue à se connecter au bout de 10 tentatives à 1 minute d’intervalle. |
DeploymentScriptContainerGroupNotFound | Un groupe de conteneurs créé par le service de script de déploiement a été supprimé par un processus ou un outil externe. |
DeploymentScriptDownloadFailure | Le téléchargement d’un script d’accompagnement a échoué. Consultez Utilisation d’un script d’accompagnement. |
DeploymentScriptError | Le script utilisateur a généré une erreur. |
DeploymentScriptBootstrapScriptExecutionFailed | Le script de démarrage a généré une erreur. Le script de démarrage correspond au script système qui orchestre l’exécution du script de déploiement. |
DeploymentScriptExecutionFailed | Une erreur inconnue s’est produite pendant l’exécution du script de déploiement. |
DeploymentScriptContainerInstancesServiceUnavailable | Lors de la création de l’instance Azure Container Instances (ACI), ACI a généré une erreur Service indisponible. |
DeploymentScriptContainerGroupInNonterminalState | Lors de la création d’une instance Azure Container Instances (ACI), un autre script de déploiement utilise le même nom ACI dans la même étendue (même abonnement, même nom de groupe de ressources et même nom de ressource). |
DeploymentScriptContainerGroupNameInvalid | Le nom de l’instance Azure Container Instances (ACI) spécifié ne répond pas aux exigences ACI. Consultez Résolution des problèmes courants dans Azure Container Instances. |
Utiliser Microsoft Graph dans un script de déploiement
Un script de déploiement peut utiliser Microsoft Graph pour créer et utiliser des objets dans Microsoft Entra ID.
Commandes
Quand vous utilisez des scripts de déploiement Azure CLI, vous pouvez utiliser des commandes du groupe de commandes az ad
pour travailler avec des applications, des principaux de service, des groupes et des utilisateurs. Vous pouvez également appeler directement des API Microsoft Graph à l’aide de la commande az rest
.
Quand vous utilisez des scripts de déploiement Azure PowerShell, vous pouvez utiliser la cmdlet Invoke-RestMethod
pour appeler directement des API Microsoft Graph.
Autorisations
L’identité utilisée par votre script de déploiement doit être autorisée à utiliser l’API Microsoft Graph et doit avoir les autorisations appropriées pour les opérations qu’il effectue. Vous devez autoriser l’identité en dehors de votre déploiement de modèle, par exemple en créant au préalable une identité managée affectée par l’utilisateur et en lui attribuant un rôle d’application pour Microsoft Graph. Pour plus d’informations, consultez cet exemple de guide de démarrage rapide.
Accéder à un réseau virtuel privé
Avec Microsoft.Resources/deploymentScripts version 2023-08-01, vous pouvez exécuter des scripts de déploiement dans des réseaux privés avec des configurations supplémentaires.
Créez une identité managée affectée par l’utilisateur et spécifiez-la dans la propriété
identity
. Pour affecter l’identité, consultez Identité.Créez un compte de stockage avec
allowSharedKeyAccess
et défini àtrue
et spécifiez le script de déploiement pour utiliser le compte de stockage existant. Pour spécifier un compte de stockage existant, consultez Utiliser un compte de stockage existant. Une configuration supplémentaire est requise pour le compte de stockage.Ouvrez le compte de stockage dans le portail Microsoft Azure.
Dans le menu de gauche, sélectionnez Contrôle d’accès (IAM), puis sélectionnez l’onglet Attributions de rôles.
Ajoutez le rôle
Storage File Data Privileged Contributor
à l’identité managée d’attribution d’utilisateur.Dans le menu de gauche, sous Sécurité et mise en réseau, sélectionnezMise en réseau, puis sélectionnez Pare-feu et réseaux virtuels.
Sélectionnez Activé à partir de réseaux virtuels et d’adresses IP sélectionnés.
Sous Réseaux virtuels, ajoutez un sous-réseau. Dans la capture d’écran, le sous-réseau est appelé dspvnVnet.
Sous Exceptions, sélectionnez Autoriser les services Azure de la liste des services approuvés à accéder à ce de stockage.
Le modèle ARM suivant montre comment configurer l’environnement pour l’exécution d’un script de déploiement :
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"prefix": {
"type": "string",
"maxLength": 10
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"userAssignedIdentityName": {
"type": "string",
"defaultValue": "[format('{0}Identity', parameters('prefix'))]"
},
"storageAccountName": {
"type": "string",
"defaultValue": "[format('{0}stg{1}', parameters('prefix'), uniqueString(resourceGroup().id))]"
},
"vnetName": {
"type": "string",
"defaultValue": "[format('{0}Vnet', parameters('prefix'))]"
},
"subnetName": {
"type": "string",
"defaultValue": "[format('{0}Subnet', parameters('prefix'))]"
}
},
"resources": [
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2023-09-01",
"name": "[parameters('vnetName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"10.0.0.0/16"
]
},
"enableDdosProtection": false,
"subnets": [
{
"name": "[parameters('subnetName')]",
"properties": {
"addressPrefix": "10.0.0.0/24",
"serviceEndpoints": [
{
"service": "Microsoft.Storage"
}
],
"delegations": [
{
"name": "Microsoft.ContainerInstance.containerGroups",
"properties": {
"serviceName": "Microsoft.ContainerInstance/containerGroups"
}
}
]
}
}
]
}
},
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2",
"properties": {
"networkAcls": {
"bypass": "AzureServices",
"virtualNetworkRules": [
{
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]",
"action": "Allow",
"state": "Succeeded"
}
],
"defaultAction": "Deny"
},
"allowSharedKeyAccess": true
},
"dependsOn": [
"[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]"
]
},
{
"type": "Microsoft.ManagedIdentity/userAssignedIdentities",
"apiVersion": "2023-07-31-preview",
"name": "[parameters('userAssignedIdentityName')]",
"location": "[parameters('location')]"
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2022-04-01",
"scope": "[format('Microsoft.Storage/storageAccounts/{0}', parameters('storageAccountName'))]",
"name": "[guid(tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd'), resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]",
"properties": {
"principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), '2023-07-31-preview').principalId]",
"roleDefinitionId": "[tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd')]",
"principalType": "ServicePrincipal"
},
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
"[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))]"
]
}
]
}
Vous pouvez utiliser le modèle ARM suivant pour tester le déploiement :
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"prefix": {
"type": "string"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"utcValue": {
"type": "string",
"defaultValue": "[utcNow()]"
},
"storageAccountName": {
"type": "string"
},
"vnetName": {
"type": "string"
},
"subnetName": {
"type": "string"
},
"userAssignedIdentityName": {
"type": "string"
}
},
"resources": [
{
"type": "Microsoft.Resources/deploymentScripts",
"apiVersion": "2023-08-01",
"name": "[format('{0}DS', parameters('prefix'))]",
"location": "[parameters('location')]",
"identity": {
"type": "userAssigned",
"userAssignedIdentities": {
"[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')))]": {}
}
},
"kind": "AzureCLI",
"properties": {
"forceUpdateTag": "[parameters('utcValue')]",
"azCliVersion": "2.47.0",
"storageAccountSettings": {
"storageAccountName": "[parameters('storageAccountName')]"
},
"containerSettings": {
"subnetIds": [
{
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]"
}
]
},
"scriptContent": "echo \"Hello world!\"",
"retentionInterval": "P1D",
"cleanupPreference": "OnExpiration"
}
}
]
}
Étapes suivantes
Dans cet article, vous avez appris à utiliser des scripts de déploiement. Pour suivre un tutoriel sur les scripts de déploiement :