Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
Découvrez comment utiliser des scripts de déploiement dans des modèles Azure Resource Manager (modèles ARM). Les scripts de déploiement peuvent être utilisés pour effectuer des étapes personnalisées qui ne peuvent pas être effectuées par les modèles ARM. Par exemple, la création d’un certificat auto-signé. Dans ce tutoriel, vous allez créer un modèle pour déployer un coffre de clés Azure, puis utiliser une Microsoft.Resources/deploymentScripts ressource dans le même modèle pour créer un certificat, puis ajouter le certificat au coffre de clés. Pour en savoir plus sur le script de déploiement, consultez Utiliser des scripts de déploiement dans des modèles ARM.
Important
Deux ressources de script de déploiement, un compte de stockage et une instance de conteneur, sont créées dans le même groupe de ressources pour l’exécution et la résolution des problèmes de script. Ces ressources sont généralement supprimées par le service de script lorsque l’exécution du script est dans un état terminal. Vous êtes facturé pour les ressources jusqu’à ce que les ressources soient supprimées. Pour plus d’informations, consultez Nettoyage des ressources de script de déploiement.
Ce tutoriel décrit les tâches suivantes :
- Ouvrir un modèle de démarrage rapide
- Modifier le modèle
- Déployer le modèle
- Déboguer le script ayant échoué
- Nettoyer les ressources
Pour obtenir un module Learn qui couvre les scripts de déploiement, consultez Étendre les modèles ARM à l’aide de scripts de déploiement.
Prerequisites
Pour effectuer ce qui est décrit dans cet article, vous avez besoin des éléments suivants :
Identité managée affectée par l’utilisateur. Cette identité est utilisée pour effectuer des actions spécifiques à Azure dans le script. Pour en créer une, consultez l’identité managée affectée par l’utilisateur. Vous avez besoin de l’ID d’identité lorsque vous déployez le modèle. Le format de l’identité est le suivant :
/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<IdentityID>Utilisez le script CLI suivant pour obtenir l’ID en fournissant le nom du groupe de ressources et le nom de l’identité.
echo "Enter the Resource Group name:" && read resourceGroupName && az identity list -g $resourceGroupName
Ouvrir un modèle de démarrage rapide
Au lieu de créer un modèle à partir de zéro, vous ouvrez un modèle à partir de modèles de démarrage rapide Azure. Les modèles de démarrage rapide Azure sont un référentiel pour les modèles ARM.
Le modèle utilisé dans ce guide de démarrage rapide est appelé Créer un coffre de clés Azure et un secret. Le modèle crée un coffre de clés, puis ajoute un secret au coffre de clés.
Dans Visual Studio Code, sélectionnez Fichier>ouvert.
Dans le nom de fichier, collez l’URL suivante :
https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.keyvault/key-vault-create/azuredeploy.jsonSélectionnez Ouvrir pour ouvrir le fichier.
Sélectionnez Fichier>Enregistrer sous pour enregistrer le fichier en tant que azuredeploy.json sur votre ordinateur local.
Modifier le modèle
Apportez les modifications suivantes au modèle :
Nettoyer le modèle (facultatif)
Le modèle d’origine ajoute un secret au coffre de clés. Pour simplifier le didacticiel, supprimez la ressource suivante :
Microsoft.KeyVault/vaults/secrets
Supprimez les deux définitions de paramètres suivantes :
secretNamesecretValue
Si vous choisissez de ne pas supprimer ces définitions, vous devez spécifier les valeurs de paramètre pendant le déploiement.
Configurer les stratégies d’accès au coffre de clés
Le script de déploiement ajoute un certificat au coffre de clés. Configurez les stratégies d’accès au coffre-fort de clés pour accorder les autorisations à l’identité gérée :
Ajoutez un paramètre pour obtenir l’ID d’identité managée :
"identityId": { "type": "string", "metadata": { "description": "Specifies the ID of the user-assigned managed identity." } },Ajoutez un paramètre pour configurer les stratégies d’accès au coffre de clés afin que l’identité managée puisse ajouter des certificats au coffre de clés :
"certificatesPermissions": { "type": "array", "defaultValue": [ "get", "list", "update", "create" ], "metadata": { "description": "Specifies the permissions to certificates in the vault. Valid values are: all, get, list, update, create, import, delete, recover, backup, restore, manage contacts, manage certificate authorities, get certificate authorities, list certificate authorities, set certificate authorities, delete certificate authorities." } }Mettez à jour les stratégies d’accès existantes du coffre de clés de la ressource
Microsoft.KeyVault/vaultspour :"accessPolicies": [ { "objectId": "[parameters('objectId')]", "tenantId": "[parameters('tenantId')]", "permissions": { "keys": "[parameters('keysPermissions')]", "secrets": "[parameters('secretsPermissions')]", "certificates": "[parameters('certificatesPermissions')]" } }, { "objectId": "[reference(parameters('identityId'), '2018-11-30').principalId]", "tenantId": "[parameters('tenantId')]", "permissions": { "keys": "[parameters('keysPermissions')]", "secrets": "[parameters('secretsPermissions')]", "certificates": "[parameters('certificatesPermissions')]" } } ],Il existe deux stratégies définies, une pour l’utilisateur connecté et l’autre pour l’identité managée. L’utilisateur connecté a uniquement besoin de l’autorisation de liste pour vérifier le déploiement. Pour simplifier le didacticiel, le même certificat est affecté à l’identité managée et aux utilisateurs connectés.
Ajouter le script de déploiement
Ajoutez trois paramètres utilisés par le script de déploiement :
"certificateName": { "type": "string", "defaultValue": "DeploymentScripts2019" }, "subjectName": { "type": "string", "defaultValue": "CN=contoso.com" }, "utcValue": { "type": "string", "defaultValue": "[utcNow()]" }Ajoutez une
deploymentScriptsressource :Note
Étant donné que les scripts de déploiement inline sont placés entre guillemets doubles, les chaînes à l’intérieur des scripts de déploiement doivent être placées entre guillemets simples à la place. Le caractère d’échappement PowerShell est l’accent grave (
`).{ "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2023-08-01", "name": "createAddCertificate", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]" ], "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[parameters('identityId')]": { } } }, "kind": "AzurePowerShell", "properties": { "forceUpdateTag": "[parameters('utcValue')]", "azPowerShellVersion": "3.0", "timeout": "PT30M", "arguments": "[format(' -vaultName {0} -certificateName {1} -subjectName {2}', parameters('keyVaultName'), parameters('certificateName'), parameters('subjectName'))]", // can pass an argument string, double quotes must be escaped "scriptContent": " param( [string] [Parameter(Mandatory=$true)] $vaultName, [string] [Parameter(Mandatory=$true)] $certificateName, [string] [Parameter(Mandatory=$true)] $subjectName ) $ErrorActionPreference = 'Stop' $DeploymentScriptOutputs = @{} $existingCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName if ($existingCert -and $existingCert.Certificate.Subject -eq $subjectName) { Write-Host 'Certificate $certificateName in vault $vaultName is already present.' $DeploymentScriptOutputs['certThumbprint'] = $existingCert.Thumbprint $existingCert | Out-String } else { $policy = New-AzKeyVaultCertificatePolicy -SubjectName $subjectName -IssuerName Self -ValidityInMonths 12 -Verbose # private key is added as a secret that can be retrieved in the Resource Manager template Add-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName -CertificatePolicy $policy -Verbose # it takes a few seconds for KeyVault to finish $tries = 0 do { Write-Host 'Waiting for certificate creation completion...' Start-Sleep -Seconds 10 $operation = Get-AzKeyVaultCertificateOperation -VaultName $vaultName -Name $certificateName $tries++ if ($operation.Status -eq 'failed') { throw 'Creating certificate $certificateName in vault $vaultName failed with error $($operation.ErrorMessage)' } if ($tries -gt 120) { throw 'Timed out waiting for creation of certificate $certificateName in vault $vaultName' } } while ($operation.Status -ne 'completed') $newCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName $DeploymentScriptOutputs['certThumbprint'] = $newCert.Thumbprint $newCert | Out-String } ", "cleanupPreference": "OnSuccess", "retentionInterval": "P1D" } }La
deploymentScriptsressource dépend de la ressource key vault et de la ressource d’attribution de rôle. Il possède ces propriétés :-
identity: le script de déploiement utilise une identité managée affectée par l’utilisateur pour effectuer les opérations dans le script. -
kind: spécifiez le type de script. Actuellement, seuls les scripts PowerShell sont pris en charge. -
forceUpdateTag: déterminez si le script de déploiement doit être exécuté même si la source du script n’a pas changé. Il peut s’agir de l’horodatage actuel ou d’un GUID. Pour plus d’informations, consultez Exécuter le script plusieurs fois. -
azPowerShellVersion: spécifie la version du module Azure PowerShell à utiliser. Actuellement, le script de déploiement prend en charge la version 2.7.0, 2.8.0 et 3.0.0. -
timeout: spécifiez la durée maximale d’exécution de script autorisée spécifiée au format ISO 8601. La valeur par défaut est P1D. -
arguments: spécifiez les valeurs de paramètre. Les valeurs sont séparées par des espaces. -
scriptContent: spécifiez le contenu du script. Pour exécuter un script externe, utilisezprimaryScriptURIplutôt. Pour plus d’informations, consultez Utiliser un script externe. La déclaration$DeploymentScriptOutputsn’est requise que lors du test du script sur un ordinateur local. La déclaration de la variable permet l’exécution du script sur un ordinateur local et dans unedeploymentScriptressource sans avoir à apporter de modifications. La valeur affectée à$DeploymentScriptOutputsest disponible en tant que sorties dans les déploiements. Pour plus d’informations, consultez Utiliser des sorties à partir de scripts de déploiement PowerShell ou Utiliser des sorties à partir de scripts de déploiement CLI. -
cleanupPreference: spécifiez la préférence sur le moment où supprimer les ressources de script de déploiement. La valeur par défaut est Always, ce qui signifie que les ressources de script de déploiement sont supprimées malgré l’état du terminal (Réussite, Échec, Annulation). Dans ce tutoriel, OnSuccess est utilisé pour vous permettre d’afficher les résultats de l’exécution du script. -
retentionInterval: spécifiez l’intervalle pour lequel le service conserve les ressources de script une fois qu’il atteint un état terminal. Les ressources sont supprimées à l’expiration de cette durée. La durée est basée sur le modèle ISO 8601. Ce tutoriel utilise P1D, ce qui signifie un jour. Cette propriété est utilisée lorsquecleanupPreferenceest réglée sur OnExpiration. Cette propriété n’est pas activée actuellement.
Le script de déploiement prend trois paramètres :
keyVaultName,certificateNameetsubjectName. Il crée un certificat, puis ajoute le certificat au coffre de clés.$DeploymentScriptOutputsest utilisé pour stocker la valeur de sortie. Pour plus d’informations, consultez Utiliser des sorties à partir de scripts de déploiement PowerShell ou Utiliser des sorties à partir de scripts de déploiement CLI.Le modèle terminé est disponible ici.
-
Pour afficher le processus de débogage, placez une erreur dans le code en ajoutant la ligne suivante au script de déploiement :
Write-Output1 $keyVaultNameLa commande correcte est
Write-Outputau lieu deWrite-Output1.Sélectionnez Fichier>Enregistrer pour enregistrer le fichier.
Déployer le modèle
Se connecter à Azure Cloud Shell
Choisissez votre environnement préféré en sélectionnant PowerShell ou Bash (pour CLI) dans le coin supérieur gauche. Il est nécessaire de redémarrer l’interpréteur de commandes lors d’un tel changement.
Sélectionnez Charger/télécharger des fichiers, puis sélectionnez Charger. Consultez la capture d’écran précédente. Sélectionnez le fichier que vous avez enregistré dans la section précédente. Après avoir chargé le fichier, vous pouvez utiliser la
lscommande et lacatcommande pour vérifier que le fichier a été chargé avec succès.Exécutez le script Azure CLI ou Azure PowerShell suivant pour déployer le modèle.
echo "Enter a project name that is used to generate resource names:" && read projectName && echo "Enter the location (i.e. centralus):" && read location && echo "Enter your email address used to sign in to Azure:" && read upn && echo "Enter the user-assigned managed identity ID:" && read identityId && adUserId=$((az ad user show --id ${upn}) | jq -r '.id') && resourceGroupName="${projectName}rg" && keyVaultName="${projectName}kv" && az group create --name $resourceGroupName --location $location && az deployment group create --resource-group $resourceGroupName --template-file "$HOME/azuredeploy.json" --parameters identityId=$identityId keyVaultName=$keyVaultName objectId=$adUserIdLe service de script de déploiement doit créer des ressources de script de déploiement supplémentaires pour l’exécution de script. La préparation et le processus de nettoyage peuvent prendre jusqu’à une minute pour se terminer en plus du temps d’exécution du script réel.
Le déploiement a échoué, car la commande
Write-Output1non valide est utilisée dans le script. Vous obtiendrez une erreur indiquant :The term 'Write-Output1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.Le résultat d’exécution du script de déploiement est stocké dans les ressources de script de déploiement à des fins de résolution des problèmes.
Déboguer le script ayant échoué
Connectez-vous au portail Azure.
Ouvrez le groupe de ressources. Il s’agit du nom du projet avec rg ajouté. Vous verrez deux ressources supplémentaires dans le groupe de ressources. Ces ressources sont appelées ressources de script de déploiement.
Les deux fichiers ont le suffixe azscripts . L’un est un compte de stockage et l’autre est une instance de conteneur.
Sélectionnez Afficher les types masqués pour répertorier la
deploymentScriptsressource.Sélectionnez le compte de stockage avec le suffixe azscripts .
Sélectionnez la vignette Partages de fichiers . Vous verrez un dossier azscripts qui contient les fichiers d’exécution du script de déploiement.
Sélectionnez azscripts. Vous verrez deux dossiers azscriptinput et azscriptoutput. Le dossier d’entrée contient un fichier de script PowerShell système et les fichiers de script de déploiement utilisateur. Le dossier de sortie contient un executionresult.json et le fichier de sortie de script. Vous pouvez voir le message d’erreur dans executionresult.json. Le fichier de sortie n’est pas là, car l’exécution a échoué.
Supprimez la Write-Output1 ligne et redéployez le modèle.
Lorsque le deuxième déploiement s’exécute correctement, les ressources de script de déploiement sont supprimées par le service de script, car la cleanupPreference propriété est définie sur OnSuccess.
Nettoyer les ressources
Lorsque les ressources Azure ne sont plus nécessaires, nettoyez les ressources que vous avez déployées en supprimant le groupe de ressources.
- Dans le portail Azure, sélectionnez Groupe de ressources dans le menu de gauche.
- Entrez le nom du groupe de ressources dans le champ Filtrer par nom .
- Sélectionnez le nom du groupe de ressources.
- Sélectionnez Supprimer le groupe de ressources dans le menu supérieur.
Étapes suivantes
Dans ce tutoriel, vous avez appris à utiliser un script de déploiement dans des modèles ARM. Pour savoir comment déployer des ressources Azure en fonction des conditions, consultez :