Wdrożenia grup zarządzania z plikami Bicep

W tym artykule opisano sposób ustawiania zakresu przy użyciu elementu Bicep podczas wdrażania w grupie zarządzania.

W miarę rozwoju organizacji możesz wdrożyć plik Bicep w celu utworzenia zasobów na poziomie grupy zarządzania. Na przykład może być konieczne zdefiniowanie i przypisanie zasad lub kontroli dostępu na podstawie ról (RBAC) platformy Azure dla grupy zarządzania. Za pomocą szablonów na poziomie grupy zarządzania można deklaratywne stosować zasady i przypisywać role na poziomie grupy zarządzania.

Zasoby szkoleniowe

Jeśli wolisz dowiedzieć się więcej o zakresach wdrażania za pomocą szczegółowych wskazówek, zobacz Wdrażanie zasobów w subskrypcjach, grupach zarządzania i dzierżawach przy użyciu narzędzia Bicep.

Obsługiwane zasoby

Nie wszystkie typy zasobów można wdrożyć na poziomie grupy zarządzania. Ta sekcja zawiera listę obsługiwanych typów zasobów.

W przypadku usługi Azure Blueprints użyj:

W przypadku Azure Policy użyj:

Aby uzyskać kontrolę dostępu, użyj:

W przypadku szablonów zagnieżdżonych wdrażanych w subskrypcjach lub grupach zasobów użyj:

Do zarządzania zasobami użyj:

Grupy zarządzania to zasoby na poziomie dzierżawy. Można jednak utworzyć grupy zarządzania we wdrożeniu grupy zarządzania, ustawiając zakres nowej grupy zarządzania na dzierżawę. Zobacz Grupa zarządzania.

Ustawianie zakresu

Aby ustawić zakres na grupę zarządzania, użyj:

targetScope = 'managementGroup'

Polecenia wdrażania

Aby wdrożyć w grupie zarządzania, użyj poleceń wdrażania grupy zarządzania.

W przypadku interfejsu wiersza polecenia platformy Azure użyj polecenia 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"

Aby uzyskać bardziej szczegółowe informacje na temat poleceń wdrażania i opcji wdrażania szablonów usługi ARM, zobacz:

Lokalizacja i nazwa wdrożenia

W przypadku wdrożeń na poziomie grupy zarządzania należy podać lokalizację wdrożenia. Lokalizacja wdrożenia jest oddzielona od lokalizacji wdrażanych zasobów. Lokalizacja wdrożenia określa miejsce przechowywania danych wdrożenia. Wdrożenia subskrypcji i dzierżawy wymagają również lokalizacji. W przypadku wdrożeń grup zasobów lokalizacja grupy zasobów służy do przechowywania danych wdrożenia.

Możesz podać nazwę wdrożenia lub użyć domyślnej nazwy wdrożenia. Nazwa domyślna to nazwa pliku szablonu. Na przykład wdrożenie szablonu o nazwie main.bicep powoduje utworzenie domyślnej nazwy wdrożenia głównego.

Dla każdej nazwy wdrożenia lokalizacja jest niezmienna. Nie można utworzyć wdrożenia w jednej lokalizacji, gdy istnieje istniejące wdrożenie o tej samej nazwie w innej lokalizacji. Jeśli na przykład utworzysz wdrożenie grupy zarządzania o nazwie deployment1 w centralus, nie możesz później utworzyć innego wdrożenia z nazwą deployment1 , ale lokalizacją westus. Jeśli zostanie wyświetlony kod InvalidDeploymentLocationbłędu , użyj innej nazwy lub tej samej lokalizacji co poprzednie wdrożenie dla tej nazwy.

Zakresy wdrażania

Podczas wdrażania w grupie zarządzania można wdrożyć zasoby w programie :

  • docelowa grupa zarządzania z operacji
  • inna grupa zarządzania w dzierżawie
  • subskrypcje w grupie zarządzania
  • grupy zasobów w grupie zarządzania
  • dzierżawa grupy zasobów

Zasób rozszerzenia można ograniczyć do obiektu docelowego, który różni się od docelowego wdrożenia.

Użytkownik wdrażający szablon musi mieć dostęp do określonego zakresu.

Zakres do grupy zarządzania

Aby wdrożyć zasoby w docelowej grupie zarządzania, dodaj te zasoby za pomocą słowa kluczowego resource .

targetScope = 'managementGroup'

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

Aby kierować kolejną grupę zarządzania, dodaj moduł. Użyj funkcji managementGroup , aby ustawić scope właściwość . Podaj nazwę grupy zarządzania.

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

Zakres do subskrypcji

Możesz również kierować subskrypcje w grupie zarządzania. Użytkownik wdrażający szablon musi mieć dostęp do określonego zakresu.

Aby kierować subskrypcję w grupie zarządzania, dodaj moduł. Użyj funkcji subskrypcji , aby ustawić scope właściwość. Podaj identyfikator subskrypcji.

targetScope = 'managementGroup'

param subscriptionID string

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

Zakres do grupy zasobów

Grupy zasobów można również kierować do grup zarządzania. Użytkownik wdrażający szablon musi mieć dostęp do określonego zakresu.

Aby kierować grupę zasobów w grupie zarządzania, dodaj moduł. Użyj funkcji resourceGroup , aby ustawić scope właściwość. Podaj identyfikator subskrypcji i nazwę grupy zasobów.

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

Zakres do dzierżawy

Aby utworzyć zasoby w dzierżawie, dodaj moduł. Użyj funkcji dzierżawy , aby ustawić jej scope właściwość. Użytkownik wdrażający szablon musi mieć wymagany dostęp do wdrożenia w dzierżawie.

targetScope = 'managementGroup'

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

Możesz też ustawić / zakres dla niektórych typów zasobów, takich jak grupy zarządzania. Tworzenie nowej grupy zarządzania zostało opisane w następnej sekcji.

Grupa zarządzania

Aby utworzyć grupę zarządzania we wdrożeniu grupy zarządzania, należy ustawić zakres na dzierżawę.

Poniższy przykład tworzy nową grupę zarządzania w głównej grupie zarządzania.

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

W następnym przykładzie zostanie utworzona nowa grupa zarządzania w grupie zarządzania przeznaczonej do wdrożenia. Używa funkcji grupy zarządzania.

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

Subskrypcje

Aby użyć szablonu usługi ARM do utworzenia nowej subskrypcji platformy Azure w grupie zarządzania, zobacz:

Aby wdrożyć szablon, który przenosi istniejącą subskrypcję platformy Azure do nowej grupy zarządzania, zobacz Przenoszenie subskrypcji w szablonie usługi ARM

Azure Policy

Niestandardowe definicje zasad wdrażane w grupie zarządzania to rozszerzenia grupy zarządzania. Aby uzyskać identyfikator definicji zasad niestandardowych, użyj funkcji extensionResourceId(). Wbudowane definicje zasad to zasoby na poziomie dzierżawy. Aby uzyskać identyfikator wbudowanej definicji zasad, użyj funkcji tenantResourceId().

W poniższym przykładzie pokazano, jak zdefiniować zasady na poziomie grupy zarządzania i przypisać je.

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

Następne kroki

Aby dowiedzieć się więcej o innych zakresach, zobacz: