Déploiements de groupes d’administration avec des fichiers Bicep

Cet article explique comment définir l’étendue avec Bicep lors du déploiement sur un groupe d’administration.

À mesure que votre organisation devient plus mature, vous pouvez déployer un fichier Bicep pour créer des ressources au niveau du groupe d’administration. Par exemple, vous pouvez être amené à définir et attribuer des stratégies ou un contrôle d’accès en fonction du rôle Azure (Azure RBAC) pour un groupe d’administration. Avec des modèles au niveau du groupe d’administration, vous pouvez de façon déclarative appliquer des stratégies et assigner des rôles au niveau du groupe d’administration.

Ressources de formation

Si vous préférez découvrir les étendues de déploiement via des instructions d’aide pas à pas, consultez Déployer des ressources sur des abonnements, des groupes d’administration et des locataires en utilisant Bicep.

Ressources prises en charge

Certains types de ressources ne peuvent pas être déployés au niveau du groupe d’administration. Cette section répertorie les types de ressources pris en charge.

Pour Azure Blueprints, utilisez :

Pour Azure Policy, utilisez :

Pour le contrôle d’accès, utilisez :

Pour les modèles imbriqués qui sont déployés sur des abonnements ou des groupes de ressources, utilisez :

Pour gérer vos ressources, utilisez :

Les groupes d’administration sont des ressources de niveau client. Toutefois, vous pouvez créer des groupes d’administration dans un déploiement de groupe d’administration en définissant l’étendue du nouveau groupe d’administration sur le locataire. Consultez Groupe d’administration.

Étendue de jeu

Pour définir l’étendue sur le groupe d’administration, utilisez :

targetScope = 'managementGroup'

Commandes de déploiement

Pour opérer un déploiement vers un groupe d’administration, utilisez les commandes de déploiement de groupes d’administration.

Pour Azure CLI, utilisez az deployment mg create :

az deployment mg create \
  --name demoMGDeployment \
  --location WestUS \
  --management-group-id myMG \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/management-level-deployment/azuredeploy.json"

Pour plus d’informations sur les commandes et options de déploiement de modèles Resource Manager, consultez :

Emplacement et nom du déploiement

Pour les déploiements au niveau du groupe d'administration, vous devez fournir un emplacement de déploiement. L’emplacement du déploiement est distinct de l’emplacement des ressources que vous déployez. L’emplacement de déploiement indique où stocker les données de déploiement. Les déploiements d’abonnement et de locataire nécessitent également un emplacement. Pour les déploiements d’un groupe de ressources, l’emplacement du groupe de ressources est utilisé pour stocker les données de déploiement.

Vous pouvez fournir un nom de déploiement ou utiliser le nom de déploiement par défaut. Le nom par défaut est le nom du fichier de modèle. Par exemple, le déploiement d’un modèle nommé main.bicep crée le nom de déploiement par défaut main.

Pour chaque nom de déploiement, l’emplacement est immuable. 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. Par exemple, si vous créez un déploiement de groupe d’administration avec le nom deployment1 dans centralus, vous ne pouvez pas créer par la suite un autre déploiement avec le nom deployment1 mais un emplacement westus. 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.

Étendues de déploiement

Lors du déploiement sur un groupe d’administration, vous pouvez déployer des ressources vers :

  • le groupe d’administration cible de l’opération
  • un autre groupe d’administration dans le locataire
  • des abonnements dans le groupe d’administration
  • les groupes de ressources dans le groupe d’administration
  • le locataire pour le groupe de ressources

Une ressource d’extension peut être étendue à une cible différente de la cible de déploiement.

L’utilisateur qui déploie le modèle doit avoir accès à l’étendue spécifiée.

Étendue au groupe d’administration

Pour déployer des ressources dans le groupe d’administration cible, ajoutez ces ressources avec le mot clé resource.

targetScope = 'managementGroup'

// policy definition created in the management group
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  ...
}

Pour cibler un autre groupe d'administration, ajoutez un module. Utilisez la fonction managementGroup pour définir la propriété scope. Indiquez le nom du groupe d’administration.

targetScope = 'managementGroup'

param otherManagementGroupName string

// module deployed at management group level but in a different management group
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentMG'
  scope: managementGroup(otherManagementGroupName)
}

Étendue à l’abonnement

Vous pouvez également cibler des abonnements dans un groupe d’administration. L’utilisateur qui déploie le modèle doit avoir accès à l’étendue spécifiée.

Pour cibler un abonnement au sein du groupe d'administration, ajoutez un module. Utilisez la fonction d’abonnement pour définir la propriété scope. Indiquez l’ID d’abonnement.

targetScope = 'managementGroup'

param subscriptionID string

// module deployed to subscription in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToSub'
  scope: subscription(subscriptionID)
}

Étendue au groupe de ressources

Vous pouvez également cibler des groupes de ressources au sein du groupe d’administration. L’utilisateur qui déploie le modèle doit avoir accès à l’étendue spécifiée.

Pour cibler un groupe de ressources au sein du groupe d’administration, ajoutez un module. Utilisez la fonction resourceGroup pour définir la propriété scope. Fournissez l’ID d’abonnement et le nom du groupe de ressources.

targetScope = 'managementGroup'

param subscriptionID string
param resourceGroupName string

// module deployed to resource group in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToRG'
  scope: resourceGroup(subscriptionID, resourceGroupName)
}

Étendue au locataire

Pour créer des ressources au niveau du locataire, ajoutez un module. Utilisez la fonction locataire pour définir sa propriété scope. L’utilisateur qui déploie le modèle doit disposer de l’accès requis pour déployer au niveau du locataire.

targetScope = 'managementGroup'

// module deployed at tenant level
module exampleModule 'module.bicep' = {
  name: 'deployToTenant'
  scope: tenant()
}

Ou vous pouvez définir l’étendue sur / pour certains types de ressources, comme les groupes d’administration. La création d’un nouveau groupe d’administration est décrite dans la section suivante.

Groupe d’administration

Pour créer un groupe d’administration dans un déploiement de groupes d’administration, vous devez définir l’étendue sur le locataire.

L’exemple suivant crée un groupe d’administration dans le groupe d’administration racine.

targetScope = 'managementGroup'

param mgName string = 'mg-${uniqueString(newGuid())}'

resource newMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output newManagementGroup string = mgName

L’exemple suivant crée un nouveau groupe d’administration dans le groupe de gestion ciblé pour le déploiement. Il utilise la fonction de groupe d’administration.

targetScope = 'managementGroup'

param mgName string = 'mg-${uniqueString(newGuid())}'

resource newMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {
    details: {
      parent: {
        id: managementGroup().id
      }
    }
  }
}

output newManagementGroup string = mgName

Abonnements

Pour utiliser un modèle ARM afin de créer un nouvel abonnement Azure dans un groupe d’administration, consultez :

Pour déployer un modèle qui déplace un abonnement Azure existant vers un nouveau groupe d’administration, consultez Déplacer des abonnements dans un modèle ARM

Azure Policy

Les définitions de stratégie personnalisée qui sont déployées sur un groupe d’administration sont des extensions de celui-ci. Pour obtenir l’ID d’une définition de stratégie personnalisée, utilisez la fonction extensionResourceId(). Les définitions de stratégie intégrées sont des ressources de niveau locataire. Pour obtenir l’ID d’une définition de stratégie intégrée, utilisez la fonction tenantResourceId().

L’exemple suivant montre comment définir une stratégie au niveau du groupe d’administration et l’attribuer.

targetScope = 'managementGroup'

@description('An array of the allowed locations, all other locations will be denied by the created policy.')
param allowedLocations array = [
  'australiaeast'
  'australiasoutheast'
  'australiacentral'
]

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: 'locationRestriction'
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        not: {
          field: 'location'
          in: allowedLocations
        }
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'locationAssignment'
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

Étapes suivantes

Pour en apprendre plus sur d’autres étendues, consultez :