Implantações de assinatura com modelos ARM
Para simplificar o gerenciamento de recursos, você pode usar um modelo do Azure Resource Manager (modelo ARM) para implantar recursos no nível de sua assinatura do Azure. Por exemplo, você pode implantar políticas e o controle de acesso baseado em função do Azure (Azure RBAC) à sua assinatura, que as aplica em toda a sua assinatura. Você também pode criar grupos de recursos dentro da assinatura e implantar recursos em grupos de recursos na assinatura.
Nota
Você pode implantar em 800 grupos de recursos diferentes em uma implantação de nível de assinatura.
Para implantar modelos no nível de assinatura, use a CLI do Azure, o PowerShell, a API REST ou o portal.
Gorjeta
Recomendamos o Bicep porque ele oferece os mesmos recursos que os modelos ARM e a sintaxe é mais fácil de usar. Para saber mais, consulte Implantações de assinatura.
Recursos suportados
Nem todos os tipos de recursos podem ser implantados no nível de assinatura. Esta seção lista quais tipos de recursos são suportados.
Para Azure Blueprints, use:
Para Políticas do Azure, use:
Para controle de acesso, use:
- accessReviewScheduleDefinitions
- accessReviewScheduleSettings
- funçõesAtribuições
- funçãoAtribuiçãoAgendaSolicitações
- roleDefinitions
- funçãoElegibilidadeAgendaSolicitações
- funçãoGestãoPolíticasAtribuições
Para modelos aninhados que implantam em grupos de recursos, use:
Para criar novos grupos de recursos, use:
Para gerenciar sua assinatura, use:
- orçamentos
- configurações - Advisor
- linha de crédito
- fechaduras
- profile - Análise de Alterações
- supportPlanTypes
- etiquetas
Para monitorização, utilize:
Por segurança, use:
- advancedThreatProtectionSettings
- alertasRegras de supressão
- avaliaçãoMetadados
- avaliações
- autoProvisioningSettings
- conectores
- deviceSecurityGroups
- ingestãoConfigurações
- Preços
- segurançaContactos
- Configurações
- workspaceSettings
Outros tipos suportados incluem:
Esquema
O esquema usado para implantações no nível de assinatura é diferente do esquema para implantações de grupo de recursos.
Para modelos, use:
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
...
}
O esquema para um arquivo de parâmetro é o mesmo para todos os escopos de implantação. Para arquivos de parâmetros, use:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
...
}
Comandos de implantação
Para implantar em uma assinatura, use os comandos de implantação no nível de assinatura.
Para a CLI do Azure, use az deployment sub create. O exemplo a seguir implanta um modelo para criar um grupo de recursos:
az deployment sub create \
--name demoSubDeployment \
--location centralus \
--template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyrg.json" \
--parameters rgName=demoResourceGroup rgLocation=centralus
Para obter informações mais detalhadas sobre comandos de implantação e opções para implantar modelos ARM, consulte:
- Implantar recursos com modelos ARM e o portal do Azure
- Implantar recursos com modelos ARM e CLI do Azure
- Implantar recursos com modelos ARM e Azure PowerShell
- Implantar recursos com modelos ARM e a API REST do Azure Resource Manager
- Use um botão de implantação para implantar modelos do repositório GitHub
- Implantar modelos ARM a partir do Cloud Shell
Local e nome da implantação
Para implantações de nível de assinatura, você deve fornecer um local para a implantação. O local da implantação é separado do local dos recursos implantados. O local de implantação especifica onde armazenar os dados de implantação. As implantações de grupo de gerenciamento e locatário também exigem um local. Para implantações de grupo de recursos, o local do grupo de recursos é usado para armazenar os dados de implantação.
Você pode fornecer um nome para a implantação ou usar o nome de implantação padrão. O nome padrão é o nome do arquivo de modelo. Por exemplo, implantar um modelo chamado azuredeploy.json cria um nome de implantação padrão de azuredeploy.
Para cada nome de implantação, o local é imutável. Não é possível criar uma implantação em um local quando há uma implantação existente com o mesmo nome em um local diferente. Por exemplo, se você criar uma implantação de assinatura com o nome deployment1 no centralus, não poderá criar outra implantação posteriormente com o nome deployment1 , mas um local do westus. Se você receber o código InvalidDeploymentLocation
de erro , use um nome diferente ou o mesmo local da implantação anterior para esse nome.
Escopos de implantação
Ao implantar em uma assinatura, você pode implantar recursos para:
- a subscrição de destino da operação
- qualquer subscrição no inquilino
- grupos de recursos dentro da assinatura ou outras assinaturas
- O inquilino da subscrição
As únicas transições de escopo proibidas ocorrem do Grupo de Recursos para o Grupo de Gerenciamento ou da Assinatura para o Grupo de Gerenciamento.
Um recurso de extensão pode ter o escopo definido para um destino diferente do destino de implantação.
O usuário que implanta o modelo deve ter acesso ao escopo especificado.
Esta seção mostra como especificar escopos diferentes. Você pode combinar esses diferentes escopos em um único modelo.
Âmbito da subscrição de destino
Para implantar recursos na assinatura de destino, adicione esses recursos à seção de recursos do modelo.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
subscription-level-resources
],
"outputs": {}
}
Para obter exemplos de implantação na assinatura, consulte Criar grupos de recursos e Atribuir definição de política.
Âmbito de aplicação de outras subscrições
Para implantar recursos em uma assinatura diferente da assinatura da operação, adicione uma implantação aninhada. Defina a subscriptionId
propriedade como a ID da assinatura na qual você deseja implantar. Defina a location
propriedade para a implantação aninhada.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedDeployment",
"subscriptionId": "00000000-0000-0000-0000-000000000000",
"location": "westus",
"properties": {
"mode": "Incremental",
"template": {
subscription-resources
}
}
}
],
"outputs": {}
}
Âmbito do grupo de recursos
Para implantar recursos em um grupo de recursos dentro da assinatura, adicione uma implantação aninhada e inclua a resourceGroup
propriedade. No exemplo a seguir, a implantação aninhada tem como alvo um grupo de recursos chamado demoResourceGroup
.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedDeployment",
"resourceGroup": "demoResourceGroup",
"properties": {
"mode": "Incremental",
"template": {
resource-group-resources
}
}
}
],
"outputs": {}
}
Para obter um exemplo de implantação em um grupo de recursos, consulte Criar grupo de recursos e recursos.
Âmbito de aplicação para o inquilino
Para criar recursos no locatário, defina como scope
/
. O usuário que implanta o modelo deve ter o acesso necessário para implantar no locatário.
Para usar uma implantação aninhada, defina scope
e location
.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.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": {}
}
Ou, você pode definir o escopo para /
alguns tipos de recursos, como grupos de gerenciamento.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.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')]"
}
}
}
Para obter mais informações, consulte Grupo de gerenciamento.
Grupos de recursos
Criar grupos de recursos
Para criar um grupo de recursos em um modelo ARM, defina um recurso Microsoft.Resources/resourceGroups com um nome e um local para o grupo de recursos.
O modelo a seguir cria um grupo de recursos vazio.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"rgName": {
"type": "string"
},
"rgLocation": {
"type": "string"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Resources/resourceGroups",
"apiVersion": "2022-09-01",
"name": "[parameters('rgName')]",
"location": "[parameters('rgLocation')]",
"properties": {}
}
],
"outputs": {}
}
Use o elemento copy com grupos de recursos para criar mais de um grupo de recursos.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"rgNamePrefix": {
"type": "string"
},
"rgLocation": {
"type": "string"
},
"instanceCount": {
"type": "int"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Resources/resourceGroups",
"apiVersion": "2022-09-01",
"location": "[parameters('rgLocation')]",
"name": "[concat(parameters('rgNamePrefix'), copyIndex())]",
"copy": {
"name": "rgCopy",
"count": "[parameters('instanceCount')]"
},
"properties": {}
}
],
"outputs": {}
}
Para obter informações sobre iteração de recursos, consulte Iteração de recursos em modelos ARM e Tutorial: Criar várias instâncias de recursos com modelos ARM.
Criar grupo de recursos e recursos
Para criar o grupo de recursos e implantar recursos nele, use um modelo aninhado. O modelo aninhado define os recursos a serem implantados no grupo de recursos. Defina o modelo aninhado como dependente do grupo de recursos para garantir que o grupo de recursos exista antes de implantar os recursos. Você pode implantar em até 800 grupos de recursos.
O exemplo a seguir cria um grupo de recursos e implanta uma conta de armazenamento no grupo de recursos.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"rgName": {
"type": "string"
},
"rgLocation": {
"type": "string"
},
"storagePrefix": {
"type": "string",
"maxLength": 11
}
},
"variables": {
"storageName": "[format('{0}{1}', parameters('storagePrefix'), uniqueString(subscription().id, parameters('rgName')))]"
},
"resources": [
{
"type": "Microsoft.Resources/resourceGroups",
"apiVersion": "2022-09-01",
"name": "[parameters('rgName')]",
"location": "[parameters('rgLocation')]",
"properties": {}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "storageDeployment",
"resourceGroup": "[parameters('rgName')]",
"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": "2022-09-01",
"name": "[variables('storageName')]",
"location": "[parameters('rgLocation')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
},
"dependsOn": [
"[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
]
}
]
}
Azure Policy
Atribuir definição de política
O exemplo a seguir atribui uma definição de política existente à assinatura. Se a definição de política usar parâmetros, forneça-os como um objeto. Se a definição de política não usar parâmetros, use o objeto vazio padrão.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"policyDefinitionID": {
"type": "string"
},
"policyName": {
"type": "string"
},
"policyParameters": {
"type": "object",
"defaultValue": {}
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Authorization/policyAssignments",
"apiVersion": "2020-03-01",
"name": "[parameters('policyName')]",
"properties": {
"scope": "[subscription().id]",
"policyDefinitionId": "[parameters('policyDefinitionID')]",
"parameters": "[parameters('policyParameters')]"
}
}
]
}
Para implantar esse modelo com a CLI do Azure, use:
# Built-in policy definition that accepts parameters
definition=$(az policy definition list --query "[?displayName=='Allowed locations'].id" --output tsv)
az deployment sub create \
--name demoDeployment \
--location centralus \
--template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policyassign.json" \
--parameters policyDefinitionID=$definition policyName=setLocation policyParameters="{'listOfAllowedLocations': {'value': ['westus']} }"
Para implantar esse modelo com o PowerShell, use:
$definition = Get-AzPolicyDefinition | Where-Object { $_.Properties.DisplayName -eq 'Allowed locations' }
$locations = @("westus", "westus2")
$policyParams =@{listOfAllowedLocations = @{ value = $locations}}
New-AzSubscriptionDeployment `
-Name policyassign `
-Location centralus `
-TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policyassign.json" `
-policyDefinitionID $definition.PolicyDefinitionId `
-policyName setLocation `
-policyParameters $policyParams
Criar e atribuir definições de política
Você pode definir e atribuir uma definição de política no mesmo modelo.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"resources": [
{
"type": "Microsoft.Authorization/policyDefinitions",
"apiVersion": "2020-03-01",
"name": "locationpolicy",
"properties": {
"policyType": "Custom",
"parameters": {},
"policyRule": {
"if": {
"field": "location",
"equals": "northeurope"
},
"then": {
"effect": "deny"
}
}
}
},
{
"type": "Microsoft.Authorization/policyAssignments",
"apiVersion": "2020-03-01",
"name": "location-lock",
"dependsOn": [
"locationpolicy"
],
"properties": {
"scope": "[subscription().id]",
"policyDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/policyDefinitions', 'locationpolicy')]"
}
}
]
}
Para criar a definição de política em sua assinatura e atribuí-la à assinatura, use o seguinte comando da CLI:
az deployment sub create \
--name demoDeployment \
--location centralus \
--template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"
Para implantar esse modelo com o PowerShell, use:
New-AzSubscriptionDeployment `
-Name definePolicy `
-Location centralus `
-TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"
Azure Blueprints
Criar definição de blueprint
Você pode criar uma definição de blueprint a partir de um modelo.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"blueprintName": {
"defaultValue": "sample-blueprint",
"type": "String",
"metadata": {
"description": "The name of the blueprint definition."
}
}
},
"resources": [
{
"type": "Microsoft.Blueprint/blueprints",
"apiVersion": "2018-11-01-preview",
"name": "[parameters('blueprintName')]",
"properties": {
"targetScope": "subscription",
"description": "Blueprint with a policy assignment artifact.",
"resourceGroups": {
"sampleRg": {
"description": "Resource group to add the assignment to."
}
},
"parameters": {
"listOfResourceTypesNotAllowed": {
"type": "array",
"metadata": {
"displayName": "Resource types to pass to the policy assignment artifact."
},
"defaultValue": [
"Citrix.Cloud/accounts"
]
}
}
}
},
{
"type": "Microsoft.Blueprint/blueprints/artifacts",
"apiVersion": "2018-11-01-preview",
"name": "[concat(parameters('blueprintName'), '/policyArtifact')]",
"kind": "policyAssignment",
"dependsOn": [
"[parameters('blueprintName')]"
],
"properties": {
"displayName": "Blocked Resource Types policy definition",
"description": "Block certain resource types",
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', '6c112d4e-5bc7-47ae-a041-ea2d9dccd749')]",
"resourceGroup": "sampleRg",
"parameters": {
"listOfResourceTypesNotAllowed": {
"value": "[[parameters('listOfResourceTypesNotAllowed')]"
}
}
}
}
]
}
Para criar a definição de blueprint em sua assinatura, use o seguinte comando da CLI:
az deployment sub create \
--name demoDeployment \
--location centralus \
--template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/blueprints-new-blueprint/azuredeploy.json"
Para implantar esse modelo com o PowerShell, use:
New-AzSubscriptionDeployment `
-Name demoDeployment `
-Location centralus `
-TemplateUri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/blueprints-new-blueprint/azuredeploy.json"
Controlo de acesso
Para saber mais sobre como atribuir funções, consulte Atribuir funções do Azure usando modelos do Azure Resource Manager.
O exemplo a seguir cria um grupo de recursos, aplica um bloqueio a ele e atribui uma função a uma entidade de segurança.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.5.6.12127",
"templateHash": "16815708176905569328"
}
},
"parameters": {
"rgName": {
"type": "string",
"metadata": {
"description": "Name of the resourceGroup to create"
}
},
"rgLocation": {
"type": "string",
"metadata": {
"description": "Location for the resourceGroup"
}
},
"principalId": {
"type": "string",
"metadata": {
"description": "principalId of the user that will be given contributor access to the resourceGroup"
}
},
"roleDefinitionId": {
"type": "string",
"defaultValue": "b24988ac-6180-42a0-ab88-20f7382dd24c",
"metadata": {
"description": "roleDefinition to apply to the resourceGroup - default is contributor"
}
},
"roleAssignmentName": {
"type": "string",
"defaultValue": "[guid(parameters('principalId'), parameters('roleDefinitionId'), parameters('rgName'))]",
"metadata": {
"description": "Unique name for the roleAssignment in the format of a guid"
}
}
},
"resources": [
{
"type": "Microsoft.Resources/resourceGroups",
"apiVersion": "2019-10-01",
"name": "[parameters('rgName')]",
"location": "[parameters('rgLocation')]",
"tags": {
"Note": "subscription level deployment"
},
"properties": {}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2020-10-01",
"name": "applyLock",
"resourceGroup": "[parameters('rgName')]",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
},
"mode": "Incremental",
"parameters": {
"principalId": {
"value": "[parameters('principalId')]"
},
"roleDefinitionId": {
"value": "[parameters('roleDefinitionId')]"
},
"roleAssignmentName": {
"value": "[parameters('roleAssignmentName')]"
}
},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.5.6.12127",
"templateHash": "6034226420560042393"
}
},
"parameters": {
"principalId": {
"type": "string",
"metadata": {
"description": "principalId of the user that will be given contributor access to the resourceGroup"
}
},
"roleDefinitionId": {
"type": "string",
"metadata": {
"description": "roleDefinition to apply to the resourceGroup - default is contributor"
}
},
"roleAssignmentName": {
"type": "string",
"metadata": {
"description": "Unique name for the roleAssignment in the format of a guid"
}
}
},
"resources": [
{
"type": "Microsoft.Authorization/locks",
"apiVersion": "2016-09-01",
"name": "DontDelete",
"properties": {
"level": "CanNotDelete",
"notes": "Prevent deletion of the resourceGroup"
}
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2020-04-01-preview",
"name": "[guid(parameters('roleAssignmentName'))]",
"properties": {
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', parameters('roleDefinitionId'))]",
"principalId": "[parameters('principalId')]"
}
}
]
}
},
"dependsOn": [
"[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('rgName'))]"
]
}
]
}
Próximos passos
- Para obter um exemplo de implantação de configurações de espaço de trabalho para o Microsoft Defender for Cloud, consulte deployASCwithWorkspaceSettings.json.
- Modelos de exemplo podem ser encontrados no GitHub.
- Você também pode implantar modelos no nível do grupo de gerenciamento e no nível do locatário.