Esercizio - Distribuire le risorse in più ambiti usando i moduli

Completato

Nota

Per questo esercizio è necessaria una sottoscrizione di Azure. Se non si ha una sottoscrizione, è possibile ottenerne una gratuita.

Il team di ricerca e sviluppo chiede aiuto per creare una rete virtuale nella sottoscrizione Project Teddybear. In futuro sarà possibile aiutare il team con più sottoscrizioni, quindi si decide di estendere il modello Bicep riutilizzabile per distribuire una rete virtuale che i membri del team possono usare.

In questo esercizio si aggiornerà il modello creato nell'ultimo esercizio.

Durante il processo, si eseguiranno queste operazioni:

  • Aggiornare il modello con ambito sottoscrizione per creare un nuovo gruppo di risorse.
  • Creare un modulo di Bicep separato con una rete virtuale e usare i parametri per controllare la configurazione della rete virtuale.
  • Aggiornare il modello per distribuire il modulo nel gruppo di risorse.
  • Distribuire il modello.

Per questo esercizio è necessario avere l'autorizzazione per distribuire risorse con ambito sottoscrizione. Se non è possibile soddisfare questo requisito con l'account Azure corrente, è possibile ottenere una versione di valutazione gratuita e creare una nuova sottoscrizione e un nuovo tenant di Azure. In alternativa, è possibile ignorare i passaggi di distribuzione in questo esercizio.

Creare un gruppo di risorse

  1. In Visual Studio Code aprire il file main.bicep creato nell'esercizio precedente.

  2. Nelle definizioni di variabili correnti aggiungere la definizione di variabile seguente:

    var resourceGroupName = 'ToyNetworking'
    
  3. Alla fine del file aggiungere la definizione di risorsa seguente:

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

    Si noti che il gruppo di risorse viene definito esattamente come si definirebbe un'altra risorsa. Un gruppo di risorse è una risorsa con ambito sottoscrizione che è possibile distribuire e gestire nei file Bicep con la parola chiave targetScope impostata su subscription.

  4. Salvare le modifiche apportate al file.

Aggiungere un modulo per creare una rete virtuale

Successivamente, creare un modulo di Bicep per la rete virtuale del team di ricerca e sviluppo. Le risorse del modulo verranno distribuite nel gruppo di risorse più avanti in questo esercizio.

  1. In Visual Studio Code creare una nuova cartella denominata modules nella stessa cartella in cui è stato creato il file main.bicep.

  2. Nella cartella modules creare e salvare un file denominato virtualNetwork.bicep.

  3. Nel file virtualNetwork.bicep aggiungere il contenuto seguente:

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

    Si noti che non è stata specificata una parola chiave targetScope per questo modulo. Non è necessario specificare un ambito di destinazione quando il file Bicep è destinato a un gruppo di risorse.

  4. Salvare le modifiche apportate al file.

Usare il modulo nella distribuzione della sottoscrizione

A questo punto è possibile indicare a Bicep di distribuire il modulo nel gruppo di risorse.

  1. Nel file main.bicep in Visual Studio Code, sotto la riga targetScope, aggiungere le definizioni di parametri seguenti:

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    Questi parametri rendono riutilizzabile il modello. Ogni volta che il team di ricerca e sviluppo necessita di una nuova sottoscrizione, è possibile creare una rete virtuale con un nome e un intervallo di indirizzi IP univoci.

  2. Alla fine del file aggiungere la definizione di modulo seguente:

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

    Si noti che si specifica in modo esplicito scope per il modulo. Bicep riconosce che le risorse all'interno del modulo devono essere distribuite nel gruppo di risorse creato in precedenza nel file.

Verificare il modello

Il file main.bicep avrà un aspetto simile al seguente:

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
  }
}

Il file modules/virtualNetwork.bicep avrà un aspetto simile al seguente:

param virtualNetworkName string
param virtualNetworkAddressPrefix string

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

Se uno dei file non corrisponde all'esempio, copiare l'esempio oppure modificare il modello.

Distribuire il modello in Azure

Distribuire il modello usando i comandi dell'interfaccia della riga di comando di Azure seguenti nel terminale di Visual Studio Code:

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

Distribuire il modello usando i comandi di Azure PowerShell seguenti nel terminale di Visual Studio Code:

$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

Si noti che si passano valori per i parametri virtualNetworkName e virtualNetworkAddressPrefix. Quando un altro team di ricerca e sviluppo chiede di preparare una sottoscrizione, sarà possibile cambiare questi valori per assegnare al team una rete virtuale specifica.

La distribuzione può richiedere uno o due minuti e al termine verrà visualizzato un messaggio di operazione completata.

Verificare la distribuzione

A questo punto verificare il gruppo di risorse e la distribuzione creati dal modulo.

  1. Vai al portale di Azure.

  2. Nel riquadro sinistro selezionare Gruppi di risorse. Si noti che è stato creato il gruppo di risorse ToyNetworking.

  3. Selezionare il gruppo di risorse ToyNetworking. Si noti che il modulo è stato distribuito correttamente nel gruppo di risorse e che la rete virtuale è stata creata:

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

Pulire le risorse

Le risorse con ambito sottoscrizione sono state distribuite correttamente, incluso un gruppo di risorse, ed è stato usato un modulo per distribuire la risorsa nel gruppo di risorse creato. È possibile rimuovere le risorse dei criteri e il gruppo di risorse creati.

Attenzione

Questo comando eliminerà definitivamente il gruppo di risorse denominato ToyNetworking e tutte le relative risorse. Se sono state distribuite altre risorse in questo gruppo di risorse, ignorare questo passaggio.

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