Поделиться через


Развертывания групп управления с помощью шаблонов ARM

По мере развития организации можно развернуть шаблон Azure Resource Manager (шаблон ARM) для создания ресурсов на уровне группы управления. Например, может потребоваться определить и назначить политики или управление доступом на основе ролей Azure (Azure RBAC) для группы управления. С помощью шаблонов уровня управления можно декларативно применять политики и назначать роли на уровне группы управления.

Совет

Bicep рекомендуется, так как он предлагает те же возможности, что и шаблоны ARM, и синтаксис проще использовать. Дополнительные сведения см. в статье о развертывании групп управления.

Поддерживаемые ресурсы

Не все типы ресурсов можно развернуть на уровне группы управления. В этом разделе перечислены поддерживаемые типы ресурсов.

Для Azure Blueprints используйте следующие типы:

Для Политики Azure используйте следующие типы:

Для управления доступом используйте:

Для вложенных шаблонов, которые развертываются в подписках или группах ресурсов, используйте следующие типы:

Для управления ресурсами используйте следующие типы:

Группы управления — это ресурсы уровня клиента. Однако вы можете создавать группы управления в развертывании группы управления, задав для арендатора область действия новой группы управления. См. раздел Группа управления.

Схема

Схема, используемая для развертываний групп управления, отличается от схемы для развертываний групп ресурсов.

Для шаблонов используйте:

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

Схема для файла параметров одинакова для всех областей развертывания. Для файлов параметров используйте:

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

Команды развертывания

Чтобы развернуть в группе управления ресурсами, используйте команды для развертывания в группе управления.

Для Azure CLI используйте az deployment sub 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"

Более подробные сведения о командах и параметрах развертывания для развертывания шаблонов ARM приведены в следующих статьях:

Расположение и имя развертывания

Для развертываний на уровне группы управления необходимо указать местоположение развертывания. Расположение развертывания отделено от расположения развертываемых ресурсов. В расположении развертывания указывается место хранения данных развертывания. Для развертываний подписок и клиентов также требуется указать расположение. При развертывании группы ресурсов для хранения данных развертывания используется расположение группы ресурсов.

Можно указать имя развертывания или использовать имя развертывания по умолчанию. Имя по умолчанию — это имя файла шаблона. Например, развернув шаблон с именем azuredeploy.json создается имя развертывания по умолчанию azuredeploy.

Для каждого имени развертывания расположение остается неизменным. Нельзя создать развертывание в одном расположении, если в другом уже есть развертывание с таким же именем. Например, если вы создаете развертывание группы управления с именем deployment1 в центральном регионе США, вы не сможете позже создать другое развертывание с именем deployment1, но с расположением в западной части США. Если вы получите код InvalidDeploymentLocation ошибки, используйте другое имя или то же расположение, что и при предыдущем развертывании для этого имени.

Области развертывания

При развертывании в группе управления можно развернуть следующие ресурсы:

  • целевую группу управления из операции;
  • другую группу управления в клиенте;
  • подписки в группе управления;
  • группы ресурсов в группе управления;
  • клиенте для группы ресурсов.

Переходы только запрещенных областей происходят из группы ресурсов в группу управления или из подписки на группу управления.

Ресурс расширения может быть ограничен целевым объектом, который отличается от целевого объекта развертывания.

Пользователь, развертывающий шаблон, должен иметь доступ к указанной области.

В этом разделе показано, как указать различные области. Такие различные области можно объединить в один шаблон.

Область для целевой группы управления

Ресурсы, определенные в разделе ресурсов шаблона, применяются к группе управления из команды развертывания:

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

Область для другой группы управления

Чтобы назначить другую группу управления, добавьте вложенное развертывание и укажите свойство scope. scope Задайте для свойства значение в 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": "[format('Microsoft.Management/managementGroups/{0}', parameters('mgName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "nestedDeployment",
      "scope": "[variables('mgId')]",
      "location": "eastus",
      "properties": {
        "mode": "Incremental",
        "template": {
          management-group-resources-non-default
        }
      }
    }
  ],
  "outputs": {}
}

Область действия для подписки

Также можно назначить подписку в группе управления. Пользователь, развертывающий шаблон, должен иметь доступ к указанной области.

Чтобы настроить подписку в группе управления, используйте вложенное развертывание и subscriptionId свойство:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-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
            }
          ]
        }
      }
    }
  ]
}

Область для группы ресурсов

Также вы можете назначить группы ресурсов в группе управления. Пользователь, развертывающий шаблон, должен иметь доступ к указанной области.

Чтобы назначить группу ресурсов в группе управления, используйте вложенное развертывание. Укажите свойства subscriptionId и resourceGroup. Не устанавливайте расположение для вложенного развертывания, так как оно развернуто в расположении группы ресурсов:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-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
            }
          ]
        }
      }
    }
  ]
}

Чтобы использовать развертывание группы управления для создания группы ресурсов в подписке и развертывания учетной записи хранения в этой группе ресурсов, см. раздел "Развертывание в подписке и группе ресурсов".

Область для клиента

Чтобы создать ресурсы в клиенте, присвойте свойству scope значение /. Пользователь, развертывающий шаблон, должен иметь необходимый доступ для развертывания в клиенте.

Чтобы использовать вложенное развертывание, задайте scope и location.

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

Кроме того, можно задать область / для некоторых типов ресурсов, таких как группы управления. Создание новой группы управления описано в следующем разделе.

Группа управления

Чтобы создать группу управления в развертывании группы управления, необходимо задать область / для группы управления.

В следующем примере создается новая группа управления в корневой группе управления:

{
  "$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')]"
    }
  }
}

В приведенном ниже примере показано как создать новую группу управления в группе управления, заданной как родительская. Обратите внимание, что для области задано значение /.

{
  "$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": "2021-04-01",
      "scope": "/",
      "location": "eastus",
      "properties": {
        "details": {
          "parent": {
            "id": "[tenantResourceId('Microsoft.Management/managementGroups', parameters('parentMG'))]"
          }
        }
      }
    }
  ],
  "outputs": {
    "output": {
      "type": "string",
      "value": "[parameters('mgName')]"
    }
  }
}

Подписки

Чтобы использовать шаблон ARM для создания новой подписки Azure в группе управления, см. следующие статьи:

Для сведений о том, как развернуть шаблон, который перемещает существующую подписку Azure в новую группу управления, см. раздел Перемещение подписок в шаблоне ARM

Политика Azure

Определения настраиваемой политики, развернутые в группе управления, являются расширениями группы управления. Чтобы получить идентификатор определения пользовательской политики, используйте функцию extensionResourceId() . Встроенные определения политик — это ресурсы на уровне клиента. Чтобы получить идентификатор встроенного определения политики, используйте функцию tenantResourceId() .

В следующем примере показано, как определить политику на уровне группы управления и назначить ее:

{
  "$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": "2020-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": "2020-09-01",
      "dependsOn": [
        "[variables('policyDefinition')]"
      ],
      "properties": {
        "scope": "[variables('mgScope')]",
        "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', variables('policyDefinition'))]"
      }
    }
  ]
}

Развертывание в подписке и группе ресурсов

В развертывании на уровне группы управления вы можете нацелить подписку в этой группе управления. В следующем примере создается группа ресурсов в подписке и развертывается учетная запись хранения в этой группе ресурсов:

{
  "$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": "2021-04-01",
      "name": "nestedSub",
      "location": "[parameters('nestedLocation')]",
      "subscriptionId": "[parameters('nestedSubId')]",
      "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.Resources/resourceGroups",
              "apiVersion": "2021-04-01",
              "name": "[parameters('nestedRG')]",
              "location": "[parameters('nestedLocation')]"
            }
          ]
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedRG",
      "subscriptionId": "[parameters('nestedSubId')]",
      "resourceGroup": "[parameters('nestedRG')]",
      "dependsOn": [
        "nestedSub"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2021-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "[parameters('nestedLocation')]",
              "kind": "StorageV2",
              "sku": {
                "name": "Standard_LRS"
              }
            }
          ]
        }
      }
    }
  ]
}

Следующие шаги