Déploiements d’abonnements avec des modèles ARMSubscription deployments with ARM templates

Pour simplifier la gestion des ressources, vous pouvez utiliser un modèle Resource Manager pour déployer des ressources au niveau de votre abonnement Azure.To simplify the management of resources, you can use an Azure Resource Manager template (ARM template) to deploy resources at the level of your Azure subscription. Par exemple, vous pouvez déployer des stratégies et un contrôle d’accès en fonction du rôle Azure (Azure RBAC) sur votre abonnement, ce qui les applique à l’ensemble de votre abonnement.For example, you can deploy policies and Azure role-based access control (Azure RBAC) to your subscription, which applies them across your subscription. Vous pouvez également créer des groupes de ressources au sein de l’abonnement et déployer des ressources sur ces groupes de ressources dans l’abonnement.You can also create resource groups within the subscription and deploy resources to resource groups in the subscription.

Notes

Vous pouvez déployer sur 800 différents groupes de ressources dans un déploiement de niveau abonnement.You can deploy to 800 different resource groups in a subscription level deployment.

Pour déployer des modèles au niveau de l’abonnement, utilisez Azure CLI, PowerShell, l’API REST ou le portail.To deploy templates at the subscription level, use Azure CLI, PowerShell, REST API, or the portal.

Ressources prises en chargeSupported resources

Tous les types de ressources ne peuvent pas être déployés au niveau de l’abonnement.Not all resource types can be deployed to the subscription level. Cette section répertorie les types de ressources pris en charge.This section lists which resource types are supported.

Pour Azure Blueprints, utilisez :For Azure Blueprints, use:

Pour les stratégies Azure, utilisez :For Azure Policies, use:

Pour le contrôle d’accès en fonction du rôle Azure (Azure RBAC), utilisez :For Azure role-based access control (Azure RBAC), use:

Pour les modèles imbriqués déployés sur des groupes de ressources, utilisez :For nested templates that deploy to resource groups, use:

Pour la création de groupes de ressources, utilisez :For creating new resource groups, use:

Pour la gestion de votre abonnement, utilisez :For managing your subscription, use:

Les autres types pris en charge sont les suivants :Other supported types include:

schémaSchema

Le schéma que vous utilisez pour les déploiements au niveau de l’abonnement est différent de celui utilisé pour les déploiements de groupes de ressources.The schema you use for subscription-level deployments is different than the schema for resource group deployments.

Pour les modèles, utilisez :For templates, use:

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    ...
}

Le schéma d’un fichier de paramètres est le même pour toutes les étendues de déploiement.The schema for a parameter file is the same for all deployment scopes. Fichiers de fichiers de paramètres, utilisez :For parameter files, use:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    ...
}

Commandes de déploiementDeployment commands

Pour déployer sur un abonnement, utilisez les commandes de déploiement au niveau de l’abonnement.To deploy to a subscription, use the subscription-level deployment commands.

Pour l’interface de ligne de commande Azure, utilisez az deployment sub create.For Azure CLI, use az deployment sub create. L’exemple suivant déploie un modèle pour créer un groupe de ressources :The following example deploys a template to create a resource group:

az deployment sub create \
  --name demoSubDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyRG.json" \
  --parameters rgName=demoResourceGroup rgLocation=centralus

Pour plus d’informations sur les commandes et options de déploiement de modèles ARM, consultez :For more detailed information about deployment commands and options for deploying ARM templates, see:

Étendues de déploiementDeployment scopes

Lors du déploiement dans un abonnement, vous pouvez déployer des ressources vers :When deploying to a subscription, you can deploy resources to:

  • l’abonnement cible de l’opérationthe target subscription from the operation
  • des groupes de ressources dans l’abonnementresource groups within the subscription
  • les ressources d’extension peuvent être appliquées aux ressourcesextension resources can be applied to resources

Vous ne pouvez déployer sur un abonnement différent de l’abonnement cible.You can't deploy to a subscription that is different than the target subscription. L’utilisateur qui déploie le modèle doit avoir accès à l’étendue spécifiée.The user deploying the template must have access to the specified scope.

Cette section montre comment spécifier des étendues différentes.This section shows how to specify different scopes. Vous pouvez combiner ces différentes étendues dans un seul modèle.You can combine these different scopes in a single template.

Étendue à l’abonnementScope to subscription

Pour déployer des ressources dans l’abonnement cible, ajoutez ces ressources à la section des ressources du modèle.To deploy resources to the target subscription, add those resources to the resources section of the template.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        subscription-level-resources
    ],
    "outputs": {}
}

Pour obtenir des exemples de déploiement sur l’abonnement, consultez Créer des groupes de ressources et Affecter une définition de stratégie.For examples of deploying to the subscription, see Create resource groups and Assign policy definition.

Étendue au groupe de ressourcesScope to resource group

Pour déployer des ressources dans un groupe de ressources au sein de l’abonnement, ajoutez un déploiement imbriqué et incluez la propriété resourceGroup.To deploy resources to a resource group within the subscription, add a nested deployment and include the resourceGroup property. Dans l’exemple suivant, le déploiement imbriqué cible un groupe de ressources nommé demoResourceGroup.In the following example, the nested deployment targets a resource group named demoResourceGroup.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2020-06-01",
            "name": "nestedDeployment",
            "resourceGroup": "demoResourceGroup",
            "properties": {
                "mode": "Incremental",
                "template": {
                    resource-group-resources
                }
            }
        }
    ],
    "outputs": {}
}

Pour obtenir un exemple de déploiement dans un groupe de ressources, consultez Créer un groupe de ressources et des ressources.For an example of deploying to a resource group, see Create resource group and resources.

Emplacement et nom du déploiementDeployment location and name

Pour les déploiements au niveau de l’abonnement, vous devez fournir un emplacement de déploiement.For subscription level deployments, you must provide a location for the deployment. L’emplacement du déploiement est distinct de l’emplacement des ressources que vous déployez.The location of the deployment is separate from the location of the resources you deploy. L’emplacement de déploiement indique où stocker les données de déploiement.The deployment location specifies where to store deployment data.

Vous pouvez fournir un nom de déploiement ou utiliser le nom de déploiement par défaut.You can provide a name for the deployment, or use the default deployment name. Le nom par défaut est le nom du fichier de modèle.The default name is the name of the template file. Par exemple, le déploiement d’un modèle nommé azuredeploy.json crée le nom de déploiement par défaut azuredeploy.For example, deploying a template named azuredeploy.json creates a default deployment name of azuredeploy.

Pour chaque nom de déploiement, l’emplacement est immuable.For each deployment name, the location is immutable. Il n’est pas possible de créer un déploiement dans un emplacement s’il existe un déploiement du même nom dans un autre emplacement.You can't create a deployment in one location when there's an existing deployment with the same name in a different location. Si vous obtenez le code d’erreur InvalidDeploymentLocation, utilisez un autre nom ou le même emplacement que le déploiement précédent pour ce nom.If you get the error code InvalidDeploymentLocation, either use a different name or the same location as the previous deployment for that name.

Groupes de ressourcesResource groups

Créer des groupes de ressourcesCreate resource groups

Pour créer un groupe de ressources dans un modèle Resource Manager, définissez une ressource Microsoft.Resources/resourceGroups avec un nom et un emplacement pour le groupe de ressources.To create a resource group in an ARM template, define a Microsoft.Resources/resourceGroups resource with a name and location for the resource group.

Le modèle suivant crée un groupe de ressources vide.The following template creates an empty resource group.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2020-06-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    }
  ],
  "outputs": {}
}

Pour créer plus d’un groupe de ressources, utilisez l’élément copy avec des groupes de ressources.Use the copy element with resource groups to create more than one resource group.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgNamePrefix": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    },
    "instanceCount": {
      "type": "int"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2020-06-01",
      "location": "[parameters('rgLocation')]",
      "name": "[concat(parameters('rgNamePrefix'), copyIndex())]",
      "copy": {
        "name": "rgCopy",
        "count": "[parameters('instanceCount')]"
      },
      "properties": {}
    }
  ],
  "outputs": {}
}

Pour plus d’informations sur l’itération de ressource, consultez Déployer plusieurs instances d’une ressource dans des modèles Azure Resource Manager et Tutoriel : Créer plusieurs instances de ressources grâce à des modèles Resource Manager.For information about resource iteration, see Deploy more than one instance of a resource in Azure Resource Manager Templates, and Tutorial: Create multiple resource instances with Resource Manager templates.

Créer un groupe de ressources et ses ressourcesCreate resource group and resources

Pour créer le groupe de ressources et déployer des ressources sur celui-ci, utilisez un modèle imbriqué.To create the resource group and deploy resources to it, use a nested template. Le modèle imbriqué définit les ressources à déployer sur le groupe de ressources.The nested template defines the resources to deploy to the resource group. Définissez le modèle imbriqué comme dépendant du groupe de ressources pour vous assurer que le groupe de ressources existe avant de déployer les ressources.Set the nested template as dependent on the resource group to make sure the resource group exists before deploying the resources. Vous pouvez effectuer le déploiement sur jusqu’à 800 groupes de ressources.You can deploy to up to 800 resource groups.

L’exemple suivant crée un groupe de ressources, et déploie un compte de stockage sur le groupe de ressources.The following example creates a resource group, and deploys a storage account to the resource group.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    },
    "storagePrefix": {
      "type": "string",
      "maxLength": 11
    }
  },
  "variables": {
    "storageName": "[concat(parameters('storagePrefix'), uniqueString(subscription().id, parameters('rgName')))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2020-06-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      "name": "storageDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2019-06-01",
              "name": "[variables('storageName')]",
              "location": "[parameters('rgLocation')]",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ],
          "outputs": {}
        }
      }
    }
  ],
  "outputs": {}
}

Azure PolicyAzure Policy

Affecter une définition de stratégieAssign policy definition

L’exemple suivant assigne une définition de stratégie existante à l’abonnement.The following example assigns an existing policy definition to the subscription. Si la définition de stratégie utilise des paramètres, fournissez-les en tant qu’objet.If the policy definition takes parameters, provide them as an object. Si la définition de stratégie n’accepte pas de paramètres, utilisez l’objet vide par défaut.If the policy definition doesn't take parameters, use the default empty object.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "policyDefinitionID": {
      "type": "string"
    },
    "policyName": {
      "type": "string"
    },
    "policyParameters": {
      "type": "object",
      "defaultValue": {}
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2018-03-01",
      "name": "[parameters('policyName')]",
      "properties": {
        "scope": "[subscription().id]",
        "policyDefinitionId": "[parameters('policyDefinitionID')]",
        "parameters": "[parameters('policyParameters')]"
      }
    }
  ]
}

Pour déployer cet exemple de modèle avec Azure CLI, utilisez la commande suivante :To deploy this template with Azure CLI, use:

# Built-in policy definition that accepts parameters
definition=$(az policy definition list --query "[?displayName=='Allowed locations'].id" --output tsv)

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policyassign.json" \
  --parameters policyDefinitionID=$definition policyName=setLocation policyParameters="{'listOfAllowedLocations': {'value': ['westus']} }"

Pour déployer ce modèle avec PowerShell, utilisez :To deploy this template with PowerShell, use:

$definition = Get-AzPolicyDefinition | Where-Object { $_.Properties.DisplayName -eq 'Allowed locations' }

$locations = @("westus", "westus2")
$policyParams =@{listOfAllowedLocations = @{ value = $locations}}

New-AzSubscriptionDeployment `
  -Name policyassign `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policyassign.json" `
  -policyDefinitionID $definition.PolicyDefinitionId `
  -policyName setLocation `
  -policyParameters $policyParams

Créer et attribuer des définitions de stratégieCreate and assign policy definitions

Vous pouvez définir et attribuer une définition de stratégie dans le même modèle.You can define and assign a policy definition in the same template.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Authorization/policyDefinitions",
      "apiVersion": "2018-05-01",
      "name": "locationpolicy",
      "properties": {
        "policyType": "Custom",
        "parameters": {},
        "policyRule": {
          "if": {
            "field": "location",
            "equals": "northeurope"
          },
          "then": {
            "effect": "deny"
          }
        }
      }
    },
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2018-05-01",
      "name": "location-lock",
      "dependsOn": [
        "locationpolicy"
      ],
      "properties": {
        "scope": "[subscription().id]",
        "policyDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/policyDefinitions', 'locationpolicy')]"
      }
    }
  ]
}

Pour créer la définition de stratégie dans votre abonnement et l’attribuer à l’abonnement, utilisez la commande CLI suivante :To create the policy definition in your subscription, and assign it to the subscription, use the following CLI command:

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"

Pour déployer ce modèle avec PowerShell, utilisez :To deploy this template with PowerShell, use:

New-AzSubscriptionDeployment `
  -Name definePolicy `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"

Azure BlueprintsAzure Blueprints

Créer une définition de blueprintCreate blueprint definition

Vous pouvez créer une définition de blueprint à partir d’un modèle.You can create a blueprint definition from a template.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "blueprintName": {
      "defaultValue": "sample-blueprint",
      "type": "String",
      "metadata": {
        "description": "The name of the blueprint definition."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Blueprint/blueprints",
      "apiVersion": "2018-11-01-preview",
      "name": "[parameters('blueprintName')]",
      "properties": {
        "targetScope": "subscription",
        "description": "Blueprint with a policy assignment artifact.",
        "resourceGroups": {
          "sampleRg": {
            "description": "Resource group to add the assignment to."
          }
        },
        "parameters": {
          "listOfResourceTypesNotAllowed": {
            "type": "array",
            "metadata": {
              "displayName": "Resource types to pass to the policy assignment artifact."
            },
            "defaultValue": [
              "Citrix.Cloud/accounts"
            ]
          }
        }
      }
    },
    {
      "type": "Microsoft.Blueprint/blueprints/artifacts",
      "apiVersion": "2018-11-01-preview",
      "name": "[concat(parameters('blueprintName'), '/policyArtifact')]",
      "kind": "policyAssignment",
      "dependsOn": [
        "[parameters('blueprintName')]"
      ],
      "properties": {
        "displayName": "Blocked Resource Types policy definition",
        "description": "Block certain resource types",
        "policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', '6c112d4e-5bc7-47ae-a041-ea2d9dccd749')]",
        "resourceGroup": "sampleRg",
        "parameters": {
          "listOfResourceTypesNotAllowed": {
            "value": "[[parameters('listOfResourceTypesNotAllowed')]"
          }
        }
      }
    }
  ]
}

Pour créer la définition de blueprint dans votre abonnement, utilisez la commande CLI suivante :To create the blueprint definition in your subscription, use the following CLI command:

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/blueprints-new-blueprint/azuredeploy.json"

Pour déployer ce modèle avec PowerShell, utilisez :To deploy this template with PowerShell, use:

New-AzSubscriptionDeployment `
  -Name demoDeployment `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/blueprints-new-blueprint/azuredeploy.json"

Contrôle d’accèsAccess control

Pour en savoir plus sur l’attribution de rôles, consultez Ajouter des attributions de rôle Azure à l’aide de modèles Resource Manager.To learn about assigning roles, see Add Azure role assignments using Azure Resource Manager templates.

L’exemple suivant crée un groupe de ressources, lui applique un verrou et attribue un rôle à un principal.The following example creates a resource group, applies a lock to it, and assigns a role to a principal.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string",
      "metadata": {
        "description": "Name of the resourceGroup to create"
      }
    },
    "rgLocation": {
      "type": "string",
      "metadata": {
        "description": "Location for the resourceGroup"
      }
    },
    "principalId": {
      "type": "string",
      "metadata": {
        "description": "principalId of the user that will be given contributor access to the resourceGroup"
      }
    },
    "roleDefinitionId": {
      "type": "string",
      "defaultValue": "b24988ac-6180-42a0-ab88-20f7382dd24c",
      "metadata": {
        "description": "roleDefinition to apply to the resourceGroup - default is contributor"
      }
    },
    "roleAssignmentName": {
      "type": "string",
      "defaultValue": "[guid(parameters('principalId'), parameters('roleDefinitionId'), parameters('rgName'))]",
      "metadata": {
        "description": "Unique name for the roleAssignment in the format of a guid"
      }
    }
  },
  "variables": { },
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2019-10-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "tags": {
        "Note": "subscription level deployment"
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-10-01",
      "name": "applyLock",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[parameters('rgName')]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Authorization/locks",
              "apiVersion": "2017-04-01",
              "name": "DontDelete",
              "properties": {
                "level": "CanNotDelete",
                "notes": "Prevent deletion of the resourceGroup"
              }
            },
            {
              "type": "Microsoft.Authorization/roleAssignments",
              "apiVersion": "2020-04-01-preview",
              "name": "[guid(parameters('roleAssignmentName'))]",
              "properties": {
                "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', parameters('roleDefinitionId'))]",
                "principalId": "[parameters('principalId')]",
                "scope": "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('rgName'))]"
              }
            }
          ]
        }
      }
    }
  ]
}

Étapes suivantesNext steps