Ejercicio: Implementación de recursos en varios ámbitos mediante módulos

Completado

Nota:

Este ejercicio requiere una suscripción de Azure. Si aún no tiene una, puede obtener una suscripción gratuita.

El equipo de I+D le ha pedido ayuda para crear una red virtual en la suscripción del Project Teddybear. Sabe que va a ayudar al equipo con más suscripciones en el futuro, por lo que decide ampliar la plantilla de Bicep reutilizable para implementar una red virtual que podrán usar los miembros del equipo.

En este ejercicio, actualizará la plantilla que empezó a compilar en el último ejercicio.

Durante el proceso, hará lo siguiente:

  • Actualice la plantilla con ámbito de suscripción para crear un nuevo grupo de recursos.
  • Cree un módulo de Bicep independiente con una red virtual y use parámetros para controlar cómo se configura la red virtual.
  • Actualice la plantilla para implementar el módulo en el grupo de recursos.
  • Implemente la plantilla.

Para realizar este ejercicio, debe tener permiso para implementar recursos con ámbito de suscripción. Si no puede cumplir estos requisitos con la cuenta de Azure actual, puede obtener una evaluación gratuita y crear una suscripción y un inquilino de Azure. Como alternativa, puede omitir los pasos de implementación de este ejercicio.

Crear un grupo de recursos

  1. En Visual Studio Code, abra el archivo main.bicep que creó en el ejercicio anterior.

  2. En las definiciones de variable actuales, agregue la siguiente definición de variable:

    var resourceGroupName = 'ToyNetworking'
    
  3. En la parte inferior del archivo, agregue la siguiente definición de recurso:

    resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-01-01' = {
      name: resourceGroupName
      location: deployment().location
    }
    

    Tenga en cuenta que está definiendo el grupo de recursos igual que definiría otro recurso. Un grupo de recursos es un recurso con ámbito de suscripción que se puede implementar y administrar en archivos de Bicep con targetScope establecido en subscription.

  4. Guarde los cambios en el archivo.

Adición de un módulo para crear una red virtual

A continuación, creará un módulo de Bicep para la red virtual del equipo de I+D. Implementará los recursos del módulo en el grupo de recursos más adelante en este ejercicio.

  1. En Visual Studio Code, cree una carpeta llamada modules en la misma carpeta donde creó el archivo main.bicep.

  2. En la carpeta modules, cree y guarde un archivo denominado virtualNetwork.bicep.

  3. En el archivo virtualNetwork.bicep, agregue el siguiente contenido:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    
    resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-11-01' = {
      name: virtualNetworkName
      location: resourceGroup().location
      properties: {
        addressSpace: {
          addressPrefixes: [
            virtualNetworkAddressPrefix
          ]
        }
      }
    }
    

    Tenga en cuenta que no ha especificado un valor targetScope para este módulo. No es necesario especificar un ámbito de destino cuando el archivo de Bicep tiene como destino un grupo de recursos.

  4. Guarde los cambios en el archivo.

Uso del módulo en la implementación de suscripciones

Ahora está listo para indicar a Bicep que implemente el módulo en el grupo de recursos.

  1. En el archivo main.bicep de Visual Studio Code, en la línea targetScope, agregue las siguientes definiciones de parámetros:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    Estos parámetros hacen que la plantilla sea reutilizable. Cada vez que el equipo de I+D necesite una nueva suscripción, puede crear una red virtual con un nombre único y un intervalo de direcciones IP.

  2. En la parte inferior del archivo, agregue la siguiente definición de módulo:

    module virtualNetwork 'modules/virtualNetwork.bicep' = {
      scope: resourceGroup
      name: 'virtualNetwork'
      params: {
        virtualNetworkName: virtualNetworkName
        virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
      }
    }
    

    Observe que está especificando explícitamente scope para el módulo. Bicep entiende que los recursos del módulo deben implementarse en el grupo de recursos que creó anteriormente en el archivo.

Comprobación de la plantilla

El archivo main.bicep debe tener un aspecto parecido al siguiente:

targetScope = 'subscription'

param virtualNetworkName string
param virtualNetworkAddressPrefix string

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
var resourceGroupName = 'ToyNetworking'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2020-03-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2020-03-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-01-01' = {
  name: resourceGroupName
  location: deployment().location
}

module virtualNetwork 'modules/virtualNetwork.bicep' = {
  scope: resourceGroup
  name: 'virtualNetwork'
  params: {
    virtualNetworkName: virtualNetworkName
    virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
  }
}

El archivo modules/virtualNetwork.bicep debe tener un aspecto parecido al siguiente:

param virtualNetworkName string
param virtualNetworkAddressPrefix string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-11-01' = {
  name: virtualNetworkName
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        virtualNetworkAddressPrefix
      ]
    }
  }
}

Si alguno de los archivos no coincide con el ejemplo, copie el ejemplo o ajuste la plantilla.

Implementación de la plantilla en Azure

En el terminal de Visual Studio Code, implemente la plantilla mediante los siguientes comandos de la CLI de Azure:

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today
virtualNetworkName="rnd-vnet-001"
virtualNetworkAddressPrefix="10.0.0.0/24"

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile \
    --parameters virtualNetworkName=$virtualNetworkName \
                 virtualNetworkAddressPrefix=$virtualNetworkAddressPrefix

En el terminal de Visual Studio Code, implemente la plantilla mediante los siguientes comandos de Azure PowerShell:

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"
$virtualNetworkName = 'rnd-vnet-001'
$virtualNetworkAddressPrefix = '10.0.0.0/24'

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile `
  -virtualNetworkName $virtualNetworkName `
  -virtualNetworkAddressPrefix $virtualNetworkAddressPrefix

Tenga en cuenta que está pasando valores para los parámetros virtualNetworkName y virtualNetworkAddressPrefix. Cuando otro equipo de I+D le pida que prepare una suscripción para ellos, podrá cambiar estos valores para proporcionar a ese equipo su propia red virtual.

La implementación puede tardar un par de minutos en completarse; después, verá que la implementación se ha realizado correctamente.

Comprobación de la implementación

Ahora comprobará el grupo de recursos y la implementación que creó el módulo.

  1. Vaya a Azure Portal.

  2. En el panel izquierdo, seleccione Grupos de recursos. Observe que se ha creado el grupo de recursos ToyNetworking.

  3. Seleccione el grupo de recursos ToyNetworking. Observe que el módulo se ha implementado correctamente en el grupo de recursos y que se ha creado la red virtual:

    Screenshot of the Azure portal, showing the ToyNetworking resource group.

Limpiar los recursos

Ha implementado correctamente los recursos con ámbito de suscripción, incluido un grupo de recursos, y ha usado un módulo para implementar el recurso en el grupo de recursos que ha creado. Puede quitar los recursos de directiva y el grupo de recursos que ha creado.

Precaución

Este comando eliminará permanentemente el grupo de recursos denominado ToyNetworking y todos sus recursos. Si ha implementado algo más en este grupo de recursos, debe omitir este paso.

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
az group delete --name ToyNetworking
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId
Remove-AzResourceGroup -Name ToyNetworking