Развертывания группы управления с помощью шаблонов 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 в centralus, вы не сможете позже создать другое развертывание с именем deployment1, но уже в расположении westus. Если появится код ошибки 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"
              }
            }
          ]
        }
      }
    }
  ]
}

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