Creación de grupos de recursos y otros recursos en el nivel de suscripciónCreate resource groups and resources at the subscription level

Para simplificar la administración de recursos en su suscripción de Azure, puede definir y asignar directivas o controles de acceso basado en rol en la suscripción.To simplify the management of resources in your Azure subscription, you can define and assign policies or role-based access controls across the subscription. Con las plantillas de nivel de suscripción, puede aplicar directivas y asignar roles en la suscripción de forma declarativa.With subscription level templates, you declaratively apply policies and assign roles at the subscription. También puede crear grupos de recursos e implementar recursos.You can also create resource groups and deploy resources.

Para implementar plantillas en el nivel de suscripción, use la CLI de Azure, PowerShell o la API REST.To deploy templates at the subscription level, use Azure CLI, PowerShell, or REST API. Azure Portal no admite la implementación en el nivel de suscripción.The Azure portal doesn't support deployment in the subscription level.

Recursos compatiblesSupported resources

Puede implementar los siguientes tipos de recursos en el nivel de suscripción:You can deploy the following resource types at the subscription level:

SchemaSchema

El esquema que se usa para las implementaciones de nivel de suscripción es diferente del esquema de las implementaciones de grupo de recursos.The schema you use for subscription-level deployments is different than the schema for resource group deployments.

Para las plantillas, use:For templates, use:

https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#

El esquema de un archivo de parámetros es el mismo para todos los ámbitos de implementación.The schema for a parameter file is the same for all deployment scopes. Para los archivos de parámetros, use:For parameter files, use:

https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#

Comandos de implementaciónDeployment commands

Los comandos para las implementaciones de nivel de suscripción son diferentes de los comandos de las implementaciones de grupo de recursos.The commands for subscription-level deployments are different than the commands for resource group deployments.

Para la CLI de Azure, use az deployment sub create.For Azure CLI, use az deployment sub create. El ejemplo siguiente implementa una plantilla para crear un grupo de recursos:The following example deploys a template to create a resource group:

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

En el comando de implementación de PowerShell, use New-AzDeployment o New-AzSubscriptionDeployment.For the PowerShell deployment command, use New-AzDeployment or New-AzSubscriptionDeployment. El ejemplo siguiente implementa una plantilla para crear un grupo de recursos:The following example deploys a template to create a resource group:

New-AzSubscriptionDeployment `
  -Name demoSubDeployment `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyRG.json" `
  -rgName demoResourceGroup `
  -rgLocation centralus

Para la API REST, use Deployments: Create At Subscription Scope.For REST API, use Deployments - Create At Subscription Scope.

Ubicación y nombre de la implementaciónDeployment location and name

En el caso de las implementaciones de nivel de suscripción, debe proporcionar una ubicación para la implementación.For subscription level deployments, you must provide a location for the deployment. La ubicación de la implementación es independiente de la ubicación de los recursos que se implementan.The location of the deployment is separate from the location of the resources you deploy. La ubicación de implementación especifica dónde se almacenarán los datos de la implementación.The deployment location specifies where to store deployment data.

Puede proporcionar un nombre para la implementación o usar el nombre de implementación predeterminado.You can provide a name for the deployment, or use the default deployment name. El nombre predeterminado es el nombre del archivo de plantilla.The default name is the name of the template file. Por ejemplo, al implementar una plantilla llamada azuredeploy.json, se crea un nombre de predeterminado azuredeploy.For example, deploying a template named azuredeploy.json creates a default deployment name of azuredeploy.

Para cada nombre de implementación, la ubicación es inmutable.For each deployment name, the location is immutable. No se puede crear una implementación en una ubicación si ya existe una implementación con el mismo nombre en otra ubicación.You can't create a deployment in one location when there's an existing deployment with the same name in a different location. Si recibe el código de error InvalidDeploymentLocation, use un nombre diferente o utilice la ubicación de la implementación anterior que tenía ese mismo nombre.If you get the error code InvalidDeploymentLocation, either use a different name or the same location as the previous deployment for that name.

Usar funciones de plantillasUse template functions

En las implementaciones de nivel de suscripción, hay algunas consideraciones importantes que deben tenerse en cuenta al usar las funciones de plantilla:For subscription-level deployments, there are some important considerations when using template functions:

  • La función resourceGroup()no se admite.The resourceGroup() function is not supported.

  • Se admiten las funciones reference() y list().The reference() and list() functions are supported.

  • O bien, use la función subscriptionResourceId() para obtener el id. de recurso para recursos implementados en nivel de suscripción.Use the subscriptionResourceId() function to get the resource ID for resources that are deployed at subscription level.

    Por ejemplo, para obtener el identificador de recurso de una definición de directiva, utilice:For example, to get the resource ID for a policy definition, use:

    subscriptionResourceId('Microsoft.Authorization/roleDefinitions/', parameters('roleDefinition'))
    

    El identificador de recurso devuelto tiene el formato siguiente:The returned resource ID has the following format:

    /subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
    

Crear grupos de recursosCreate resource groups

Para crear un grupo de recursos en una plantilla de Azure Resource Manager, defina un recurso Microsoft.Resources/resourceGroups con un nombre y una ubicación para el grupo de recursos.To create a resource group in an Azure Resource Manager template, define a Microsoft.Resources/resourceGroups resource with a name and location for the resource group. También se puede crear un grupo de recursos e implementar recursos en él en la misma plantilla.You can create a resource group and deploy resources to that resource group in the same template.

En la plantilla siguiente se crea un grupo de recursos vacío.The following template creates an empty resource group.

{
  "$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": "2018-05-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    }
  ],
  "outputs": {}
}

Use el elemento copy con grupos de recursos para crear más de un grupo de recursos.Use the copy element with resource groups to create more than one resource group.

{
  "$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": "2018-05-01",
      "location": "[parameters('rgLocation')]",
      "name": "[concat(parameters('rgNamePrefix'), copyIndex())]",
      "copy": {
        "name": "rgCopy",
        "count": "[parameters('instanceCount')]"
      },
      "properties": {}
    }
  ],
  "outputs": {}
}

Para más información sobre la iteración de recursos, consulte este artículo sobre la implementación de varias instancias de un recurso en las plantillas de Azure Resource Manager y Tutorial: Creación de varias instancias de recursos con plantillas de Resource Manager.For information about resource iteration, see Deploy more than one instance of a resource in Azure Resource Manager Templates, and Tutorial: Create multiple resource instances with Resource Manager templates.

Grupo de recursos y recursosResource group and resources

Para crear el grupo de recursos e implementar recursos en él, utilice una plantilla anidada.To create the resource group and deploy resources to it, use a nested template. La plantilla anidada define los recursos que se van a implementar en el grupo de recursos.The nested template defines the resources to deploy to the resource group. Establezca la plantilla anidada como dependiente del grupo de recursos para asegurarse de que el grupo de recursos existe antes de implementar los recursos.Set the nested template as dependent on the resource group to make sure the resource group exists before deploying the resources.

En el ejemplo siguiente se crea un grupo de recursos y se implementa una cuenta de almacenamiento en el grupo de recursos.The following example creates a resource group, and deploys a storage account to the resource group.

{
  "$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": "[concat(parameters('storagePrefix'), uniqueString(subscription().id, parameters('rgName')))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2018-05-01",
      "location": "[parameters('rgLocation')]",
      "name": "[parameters('rgName')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2018-05-01",
      "name": "storageDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ],
      "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.Storage/storageAccounts",
              "apiVersion": "2017-10-01",
              "name": "[variables('storageName')]",
              "location": "[parameters('rgLocation')]",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ],
          "outputs": {}
        }
      }
    }
  ],
  "outputs": {}
}

Creación de directivasCreate policies

Asignación de directivaAssign policy

En el ejemplo siguiente se asigna una definición de directiva existente a la suscripción.The following example assigns an existing policy definition to the subscription. Si la directiva toma parámetros, proporciónelos como un objeto.If the policy takes parameters, provide them as an object. Si la directiva no toma parámetros, use el objeto vacío predeterminado.If the policy doesn't take parameters, use the default empty object.

{
  "$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": "2018-03-01",
      "name": "[parameters('policyName')]",
      "properties": {
        "scope": "[subscription().id]",
        "policyDefinitionId": "[parameters('policyDefinitionID')]",
        "parameters": "[parameters('policyParameters')]"
      }
    }
  ]
}

Para implementar esta plantilla con la CLI de Azure, use:To deploy this template with Azure CLI, use:

# Built-in policy 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 implementar esta plantilla con PowerShell, use:To deploy this template with 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

Definición y asignación de directivasDefine and assign policy

Puede definir y asignar una directiva en la misma plantilla.You can define and assign a policy in the same template.

{
  "$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": "2018-05-01",
      "name": "locationpolicy",
      "properties": {
        "policyType": "Custom",
        "parameters": {},
        "policyRule": {
          "if": {
            "field": "location",
            "equals": "northeurope"
          },
          "then": {
            "effect": "deny"
          }
        }
      }
    },
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2018-05-01",
      "name": "location-lock",
      "dependsOn": [
        "locationpolicy"
      ],
      "properties": {
        "scope": "[subscription().id]",
        "policyDefinitionId": "[resourceId('Microsoft.Authorization/policyDefinitions', 'locationpolicy')]"
      }
    }
  ]
}

Para crear la definición de directiva en su suscripción y aplicarla a la suscripción, use el siguiente comando de la CLI:To create the policy definition in your subscription, and apply it to the subscription, use the following CLI command:

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 implementar esta plantilla con PowerShell, use:To deploy this template with PowerShell, use:

New-AzSubscriptionDeployment `
  -Name definePolicy `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"

Ejemplos de plantillasTemplate samples

Pasos siguientesNext steps