Implementaciones de grupos de administración con archivos de Bicep

En este artículo se describe cómo establecer el ámbito con Bicep al implementar en un grupo de administración.

A medida que la organización madura, puede implementar un archivo de Bicep para crear recursos en el nivel de grupo de administración. Por ejemplo, es posible que deba definir y asignar directivas o el control de acceso basado en rol de Azure (RBAC de Azure) para un grupo de administración. Con las plantillas de nivel de grupo de administración, puede aplicar directivas y asignar roles mediante declaración en el nivel de grupo de administración.

Recursos de aprendizaje

Para más información sobre los ámbitos de implementación con una guía paso a paso, consulte Implementación de recursos en suscripciones, grupos de administración e inquilinos mediante Bicep.

Recursos compatibles

No todos los tipos de recursos se pueden implementar en el nivel de grupo de administración. En esta sección se enumeran los tipos de recursos que se admiten.

Para Azure Blueprints, use:

En Azure Policy, use:

Para el control de acceso, use:

Para plantillas anidadas que se implementan en suscripciones o grupos de recursos, use:

Para administrar los recursos, use:

Los grupos de administración son recursos de nivel de inquilino. Sin embargo, puede crear grupos de administración en una implementación de tales grupos estableciendo el ámbito del nuevo grupo en el inquilino. Consulte Grupo de administración.

Ámbito de conjunto

Para establecer el ámbito en el grupo de administración, use:

targetScope = 'managementGroup'

Comandos de implementación

Para implementar en un grupo de administración, use los comandos de implementación de grupos de administración.

Para la CLI de Azure, use 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"

Para obtener información más detallada sobre los comandos de implementación y las opciones para implementar plantillas de Resource Manager, consulte:

Ubicación y nombre de la implementación

En el caso de las implementaciones de nivel de grupo de administración, debe proporcionar una ubicación para la implementación. La ubicación de la implementación es independiente de la ubicación de los recursos que se implementan. La ubicación de implementación especifica dónde se almacenarán los datos de la implementación. Las implementaciones de suscripción e inquilino también requieren una ubicación. En las implementaciones de grupo de recursos, la ubicación del grupo de recursos se usa para almacenar los datos de implementación.

Puede proporcionar un nombre para la implementación o usar el nombre de implementación predeterminado. El nombre predeterminado es el nombre del archivo de plantilla. Por ejemplo, la implementación de una plantilla denominada main.bicep crea un nombre de implementación predeterminado de main.

Para cada nombre de implementación, la ubicación es inmutable. No se puede crear una implementación en una ubicación si ya existe una implementación con el mismo nombre en otra ubicación. Por ejemplo, si crea una implementación de grupo de administración con el nombre deployment1 en centralus, no podrá crear otra implementación con el nombre deployment1, sino una ubicación de westus. Si recibe el código de error InvalidDeploymentLocation, use un nombre diferente o utilice la ubicación de la implementación anterior que tenía ese mismo nombre.

Ámbitos de implementación

Al implementar en un grupo de administración, puede implementar los recursos en:

  • el grupo de administración de destino de la operación
  • otro grupo de administración en el inquilino
  • suscripciones en el grupo de administración
  • grupos de recursos en el grupo de administración
  • el inquilino del grupo de recursos

Un recurso de extensión se puede limitar a un destino distinto del destino de implementación.

El usuario que implementa la plantilla debe tener acceso al ámbito especificado.

Ámbito del grupo de administración

Para implementar recursos en el grupo de administración de destino, agregue esos recursos con la palabra clave resource.

targetScope = 'managementGroup'

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

Para establecer como destino otro grupo de administración, agregue un módulo. Use la función managementGroup para establecer la propiedad scope. Proporcione el nombre del grupo de administración.

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)
}

Ámbito de la suscripción

También puede establecer como destino suscripciones con un grupo de administración. El usuario que implementa la plantilla debe tener acceso al ámbito especificado.

Para establecer como destino una suscripción dentro del grupo de administración, agregue un módulo. Use la función de suscripción para establecer la propiedad scope. Proporcione el identificador de la suscripción.

targetScope = 'managementGroup'

param subscriptionID string

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

Ámbito del grupo de recursos

También puede dirigirse a los grupos de recursos dentro del grupo de administración. El usuario que implementa la plantilla debe tener acceso al ámbito especificado.

Para establecer como destino un grupo de recursos dentro del grupo de administración, agregue un módulo. Use la función resourceGroup para establecer la propiedad scope. Proporcione el identificador de suscripción y el nombre del grupo de recursos.

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)
}

Ámbito del inquilino

Para crear recursos en el inquilino, agregue un módulo. Use la función tenant para establecer su propiedad scope. El usuario que implementa la plantilla debe tener el acceso necesario para realizar implementaciones en el inquilino.

targetScope = 'managementGroup'

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

O bien, puede establecer el ámbito en / para algunos tipos de recursos, como los grupos de administración. La creación de un grupo de administración se describe en la sección siguiente.

Grupo de administración

Para crear un grupo de administración en una implementación de grupos de administración, debe establecer el ámbito en inquilino.

En el ejemplo siguiente se crea un grupo de administración en el grupo de administración raíz.

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

En el ejemplo siguiente se crea un grupo de administración en el grupo de administración destinado a la implementación. Usa la función de grupo de administración.

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

Suscripciones

Para usar una plantilla de ARM para crear una nueva suscripción de Azure en un grupo de administración, consulte:

Para implementar una plantilla que mueve una suscripción de Azure existente a un nuevo grupo de administración, consulte Traslado de las suscripciones de la plantilla de ARM.

Azure Policy

Las definiciones de directivas personalizadas que se implementan en un grupo de administración son extensiones del grupo de administración. Para obtener el identificador de una definición de directiva personalizada, use la función extensionResourceId(). Las definiciones de directivas integradas son recursos del nivel de inquilino. Para obtener el identificador de una definición de directiva integrada, use la función tenantResourceId.

En el ejemplo siguiente se muestra cómo definir una directiva en el nivel de grupo de administración y cómo asignarla.

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
  }
}

Pasos siguientes

Para obtener más información sobre otros ámbitos, consulte: