Wdrożenia grup zarządzania za pomocą szablonów usługi ARM

W czasie, gdy Twoja organizacja dojrzeje, możesz wdrożyć szablon usługi Azure Resource Manager (ARM) w celu tworzenia 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 poziomu grupy zarządzania można deklaratywnie stosować zasady i przypisywać role na poziomie grupy zarządzania.

Obsługiwane zasoby

Nie wszystkie typy zasobów można wdrożyć na poziomie grupy zarządzania. W tej sekcji wymieniono obsługiwane typy zasobów.

Na Azure Blueprints użyj:

Na Azure Policy użyj:

W przypadku kontroli dostępu na podstawie ról (RBAC) platformy Azure użyj:

W przypadku zagnieżdżonych szablonów 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. Grupy zarządzania można jednak utworzyć we wdrożeniu grupy zarządzania, ustawiając zakres nowej grupy zarządzania na dzierżawę. Zobacz Grupa zarządzania.

Schemat

Schemat wdrożeń grup zarządzania różni się od schematu wdrożeń grup zasobów.

W przypadku szablonów użyj:

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

Schemat pliku parametrów jest taki sam dla wszystkich zakresów wdrożenia. W przypadku plików parametrów użyj:

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

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 również wymagają lokalizacji. W przypadku wdrożeń grup zasobów lokalizacja grupy zasobów jest używana 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 azuredeploy.jspowoduje utworzenie domyślnej nazwy wdrożenia azuredeploy.

Dla każdej nazwy wdrożenia lokalizacja jest niezmienna. Nie można utworzyć wdrożenia w jednej lokalizacji, jeśli istnieje wdrożenie o takiej samej nazwie w innej lokalizacji. Jeśli na przykład utworzysz wdrożenie grupy zarządzania o nazwie deployment1 w lokalizacji centralus, nie możesz później utworzyć kolejnego wdrożenia o nazwie deployment1, ale w lokalizacji westus. Jeśli zostanie wyświetlany kod błędu , użyj dla tej nazwy innej nazwy lub tej samej lokalizacji co w poprzednim InvalidDeploymentLocation wdrożeniu.

Zakresy wdrożenia

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

  • docelową grupę 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

Zakres zasobu rozszerzenia może być ograniczony do obiektu docelowego, który jest inny niż cel wdrożenia.

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

W tej sekcji przedstawiono sposób określania różnych zakresów. Te różne zakresy można połączyć w jednym szablonie.

Zakres do docelowej grupy zarządzania

Zasoby zdefiniowane w sekcji zasobów szablonu są stosowane do grupy zarządzania za pomocą polecenia wdrożenia.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    management-group-resources-default
  ],
  "outputs": {}
}

Zakres dla innej grupy zarządzania

Aby określić inną grupę zarządzania, dodaj wdrożenie zagnieżdżone i określ scope właściwość . Ustaw właściwość scope na wartość w formacie Microsoft.Management/managementGroups/<mg-name> .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string"
    }
  },
  "variables": {
    "mgId": "[concat('Microsoft.Management/managementGroups/', parameters('mgName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedDeployment",
      "scope": "[variables('mgId')]",
      "location": "eastus",
      "properties": {
        "mode": "Incremental",
        "template": {
          management-group-resources-non-default
        }
      }
    }
  ],
  "outputs": {}
}

Zakres do subskrypcji

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

Aby ukierunkować subskrypcję w grupie zarządzania, użyj zagnieżdżonych wdrożeń i subscriptionId właściwości .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedSub",
      "location": "westus2",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              subscription-resources
            }
          ]
        }
      }
    }
  ]
}

Zakres do grupy zasobów

Można również określić docelowe grupy zasobów w grupie zarządzania. Użytkownik wdrażający szablon musi mieć dostęp do określonego zakresu.

Aby ukierunkować grupę zasobów w grupie zarządzania, użyj wdrożenia zagnieżdżone. Ustaw właściwości subscriptionId resourceGroup i . Nie należy ustawiać lokalizacji dla zagnieżdżonych wdrożeń, ponieważ jest ono wdrażane w lokalizacji grupy zasobów.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedRGDeploy",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "resourceGroup": "demoResourceGroup",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              resource-group-resources
            }
          ]
        }
      }
    }
  ]
}

Aby użyć wdrożenia grupy zarządzania do utworzenia grupy zasobów w ramach subskrypcji i wdrożenia konta magazynu w tej grupie zasobów, zobacz Wdrażanie w subskrypcji i grupie zasobów.

Zakres do dzierżawy

Aby utworzyć zasoby w dzierżawie, ustaw wartość scope / . Użytkownik wdrażający szablon musi mieć wymagany dostęp do wdrożenia w dzierżawie.

Aby użyć wdrożenia zagnieżdżonych, ustaw scope i location .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedDeployment",
      "location": "centralus",
      "scope": "/",
      "properties": {
        "mode": "Incremental",
        "template": {
          tenant-resources
        }
      }
    }
  ],
  "outputs": {}
}

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

Grupa zarządzania

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

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

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "mgName": {
      "type": "string",
      "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Management/managementGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('mgName')]",
      "scope": "/",
      "location": "eastus",
      "properties": {}
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

W następnym przykładzie zostanie utworzenie nowej grupy zarządzania w grupie zarządzania określonej jako nadrzędna. Zwróć uwagę, że zakres jest ustawiony na / wartość .

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "mgName": {
            "type": "string",
            "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
        },
        "parentMG": {
            "type": "string"
        }
    },
    "resources": [
        {
            "name": "[parameters('mgName')]",
            "type": "Microsoft.Management/managementGroups",
            "apiVersion": "2020-05-01",
            "scope": "/",
            "location": "eastus",
            "properties": {
                "details": {
                    "parent": {
                        "id": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('parentMG'))]"
                    }
                }
            }
        }
    ],
    "outputs": {
        "output": {
            "type": "string",
            "value": "[parameters('mgName')]"
        }
    }
}

Subskrypcje

Aby utworzyć nową subskrypcję platformy Azure w grupie zarządzania przy użyciu szablonu usługi ARM, 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 są rozszerzeniami grupy zarządzania. Aby uzyskać identyfikator niestandardowej definicji zasad, 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.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "targetMG": {
            "type": "string",
            "metadata": {
                "description": "Target Management Group"
            }
        },
        "allowedLocations": {
            "type": "array",
            "defaultValue": [
                "australiaeast",
                "australiasoutheast",
                "australiacentral"
            ],
            "metadata": {
                "description": "An array of the allowed locations, all other locations will be denied by the created policy."
            }
        }
    },
    "variables": {
        "mgScope": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('targetMG'))]",
        "policyDefinition": "LocationRestriction"
    },
    "resources": [
        {
            "type": "Microsoft.Authorization/policyDefinitions",
            "name": "[variables('policyDefinition')]",
            "apiVersion": "2019-09-01",
            "properties": {
                "policyType": "Custom",
                "mode": "All",
                "parameters": {
                },
                "policyRule": {
                    "if": {
                        "not": {
                            "field": "location",
                            "in": "[parameters('allowedLocations')]"
                        }
                    },
                    "then": {
                        "effect": "deny"
                    }
                }
            }
        },
        {
            "type": "Microsoft.Authorization/policyAssignments",
            "name": "location-lock",
            "apiVersion": "2019-09-01",
            "dependsOn": [
                "[variables('policyDefinition')]"
            ],
            "properties": {
                "scope": "[variables('mgScope')]",
                "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', variables('policyDefinition'))]"
            }
        }
    ]
}

Wdrażanie w subskrypcji i grupie zasobów

Z poziomu wdrożenia na poziomie grupy zarządzania można wybrać subskrypcję docelową w grupie zarządzania. Poniższy przykład tworzy grupę zasobów w ramach subskrypcji i wdraża konto magazynu w tej grupie zasobów.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "nestedsubId": {
            "type": "string"
        },
        "nestedRG": {
            "type": "string"
        },
        "storageAccountName": {
            "type": "string"
        },
        "nestedLocation": {
            "type": "string"
        }
    },
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2020-10-01",
            "name": "nestedSub",
            "location": "[parameters('nestedLocation')]",
            "subscriptionId": "[parameters('nestedSubId')]",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {
                    },
                    "variables": {
                    },
                    "resources": [
                        {
                            "type": "Microsoft.Resources/resourceGroups",
                            "apiVersion": "2020-10-01",
                            "name": "[parameters('nestedRG')]",
                            "location": "[parameters('nestedLocation')]"
                        }
                    ]
                }
            }
        },
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2020-10-01",
            "name": "nestedRG",
            "subscriptionId": "[parameters('nestedSubId')]",
            "resourceGroup": "[parameters('nestedRG')]",
            "dependsOn": [
                "nestedSub"
            ],
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                        {
                            "type": "Microsoft.Storage/storageAccounts",
                            "apiVersion": "2019-04-01",
                            "name": "[parameters('storageAccountName')]",
                            "location": "[parameters('nestedLocation')]",
                            "kind": "StorageV2",
                            "sku": {
                                "name": "Standard_LRS"
                            }
                        }
                    ]
                }
            }
        }
    ]
}

Następne kroki