Esercizio - Usare cicli di variabili e output

Completato

Per l'azienda di giocattoli è necessario distribuire reti virtuali in ogni Paese/area geografica in cui si sta lanciando l'orsacchiotto. Gli sviluppatori hanno anche chiesto di fornire i nomi di dominio completi (FQDN) di ognuno dei server logici Azure SQL a livello di area che sono stati distribuiti.

In questo esercizio si aggiungeranno la rete virtuale e la relativa configurazione al codice Bicep, per restituire i nomi di dominio completi (FQDN) dei server logici.

Durante il processo, si eseguiranno queste operazioni:

  • Aggiornare il codice Bicep per specificare un parametro per ogni subnet di rete virtuale.
  • Aggiungere un ciclo di variabili per creare una matrice di subnet, che verrà usata nella dichiarazione della risorsa di rete virtuale.
  • Aggiungere un ciclo di output per creare l'elenco di FQDN dei server logici.
  • Distribuire il file Bicep e verificare la distribuzione.

Aggiungere la rete virtuale al file Bicep

  1. Aprire il file main.bicep.

  2. Sotto le dichiarazioni di parametri aggiungere i parametri seguenti:

    @description('The IP address range for all virtual networks to use.')
    param virtualNetworkAddressPrefix string = '10.10.0.0/16'
    
    @description('The name and IP address range for each subnet in the virtual networks.')
    param subnets array = [
      {
        name: 'frontend'
        ipAddressRange: '10.10.5.0/24'
      }
      {
        name: 'backend'
        ipAddressRange: '10.10.10.0/24'
      }
    ]
    
  3. Sotto i parametri aggiungere una riga vuota e quindi aggiungere il ciclo di variabili subnetProperties:

    var subnetProperties = [for subnet in subnets: {
      name: subnet.name
      properties: {
        addressPrefix: subnet.ipAddressRange
      }
    }]
    
  4. Nella parte inferiore del file, sotto il ciclo del modulo databases, aggiungere il ciclo di risorse seguente:

    resource virtualNetworks 'Microsoft.Network/virtualNetworks@2021-08-01' = [for location in locations: {
      name: 'teddybear-${location}'
      location: location
      properties:{
        addressSpace:{
          addressPrefixes:[
            virtualNetworkAddressPrefix
          ]
        }
        subnets: subnetProperties
      }
    }]
    

    Nota

    Questo esempio usa lo stesso spazio indirizzi per tutte le reti virtuali. In genere, quando si creano più reti virtuali, è necessario assegnare spazi indirizzi diversi nel caso in cui sia necessario connetterle tra loro.

  5. Salvare le modifiche apportate al file.

Aggiungere output al modulo di database

  1. Aprire il file modules/database.bicep.

  2. Nella parte inferiore del file aggiungere gli output seguenti:

    output serverName string = sqlServer.name
    output location string = location
    output serverFullyQualifiedDomainName string = sqlServer.properties.fullyQualifiedDomainName
    
  3. Salvare le modifiche apportate al file.

Creare un flusso di output nel file Bicep padre

  1. Aprire il file main.bicep.

  2. Nella parte inferiore del file aggiungere il ciclo di output seguente:

    output serverInfo array = [for i in range(0, length(locations)): {
      name: databases[i].outputs.serverName
      location: databases[i].outputs.location
      fullyQualifiedDomainName: databases[i].outputs.serverFullyQualifiedDomainName
    }]
    
  3. Salvare le modifiche apportate al file.

Verificare il file Bicep

Al termine di tutte le modifiche precedenti, il file main.bicep avrà un aspetto simile al seguente:

@description('The Azure regions into which the resources should be deployed.')
param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The IP address range for all virtual networks to use.')
param virtualNetworkAddressPrefix string = '10.10.0.0/16'

@description('The name and IP address range for each subnet in the virtual networks.')
param subnets array = [
  {
    name: 'frontend'
    ipAddressRange: '10.10.5.0/24'
  }
  {
    name: 'backend'
    ipAddressRange: '10.10.10.0/24'
  }
]

var subnetProperties = [for subnet in subnets: {
  name: subnet.name
  properties: {
    addressPrefix: subnet.ipAddressRange
  }
}]

module databases 'modules/database.bicep' = [for location in locations: {
  name: 'database-${location}'
  params: {
    location: location
    sqlServerAdministratorLogin: sqlServerAdministratorLogin
    sqlServerAdministratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}]

resource virtualNetworks 'Microsoft.Network/virtualNetworks@2021-08-01' = [for location in locations: {
  name: 'teddybear-${location}'
  location: location
  properties:{
    addressSpace:{
      addressPrefixes:[
        virtualNetworkAddressPrefix
      ]
    }
    subnets: subnetProperties
  }
}]

output serverInfo array = [for i in range(0, length(locations)): {
  name: databases[i].outputs.serverName
  location: databases[i].outputs.location
  fullyQualifiedDomainName: databases[i].outputs.serverFullyQualifiedDomainName
}]

Il file database.bicep dovrebbe essere simile all'esempio seguente:

@description('The Azure region into which the resources should be deployed.')
param location string

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object = {
  name: 'Standard'
  tier: 'Standard'
}

@description('The name of the environment. This must be Development or Production.')
@allowed([
  'Development'
  'Production'
])
param environmentName string = 'Development'

@description('The name of the audit storage account SKU.')
param auditStorageAccountSkuName string = 'Standard_LRS'

var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
var sqlDatabaseName = 'TeddyBear'
var auditingEnabled = environmentName == 'Production'
var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)

resource sqlServer 'Microsoft.Sql/servers@2021-11-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdministratorLogin
    administratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2021-11-01-preview' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: sqlDatabaseSku
}

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: auditStorageAccountSkuName
  }
  kind: 'StorageV2'  
}

resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: sqlServer
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

output serverName string = sqlServer.name
output location string = location
output serverFullyQualifiedDomainName string = sqlServer.properties.fullyQualifiedDomainName

In caso contrario, copiare gli esempi o modificare i modelli in modo che corrispondano agli esempi.

Distribuire il modello Bicep in Azure

Nel terminale di Visual Studio Code distribuire il modello Bicep in Azure eseguendo il codice seguente. Il processo può richiedere alcuni minuti, dopo i quali la distribuzione sarà completata.

az deployment group create --template-file main.bicep

Nel terminale di Visual Studio Code distribuire il modello Bicep in Azure eseguendo il comando di Azure PowerShell seguente. Il processo può richiedere alcuni minuti, dopo i quali la distribuzione sarà completata.

New-AzResourceGroupDeployment -TemplateFile main.bicep

Attenzione

Assicurarsi di usare lo stesso account di accesso e la stessa password usati in precedenza o che la distribuzione non venga completata correttamente.

Attendere il completamento della distribuzione.

Verificare la distribuzione

Al termine della distribuzione, verificare che le nuove reti virtuali siano state distribuite e che le subnet siano configurate come previsto.

  1. Passare al portale di Azure e assicurarsi di trovarsi nella sottoscrizione sandbox.

  2. Selezionare [nome gruppo di risorse sandbox].

  3. Verificare che le reti virtuali siano state distribuite nelle tre località di Azure.

    Screenshot of the Azure portal, showing a list of virtual networks after deployment.

  4. Selezionare la rete virtuale denominata teddybear-eastasia.

  5. Nella barra di ricerca, immettere Subnet. In Impostazioni selezionare Subnet.

    Screenshot of the Azure portal interface for the virtual network, showing the search field with Subnets entered.

  6. Verificare che le subnet distribuite abbiano i nomi e gli indirizzi IP specificati nel valore predefinito del parametro subnets.

    Screenshot of the Azure portal that shows two virtual network subnets after deployment.

  7. Controllare l'output del comando di distribuzione. Deve includere il nome e il nome di dominio completo (FQDN) di tutti e tre i server logici distribuiti, come illustrato di seguito:

    Screenshot of the deployment output, displaying the properties of the logical servers.

  1. Passare al portale di Azure e assicurarsi di trovarsi nella sottoscrizione sandbox.

  2. Selezionare [nome gruppo di risorse sandbox].

  3. Verificare che le reti virtuali siano state distribuite nelle tre località di Azure.

    Screenshot of the Azure portal, showing a list of virtual networks after deployment.

  4. Selezionare la rete virtuale denominata teddybear-eastasia.

  5. Nella barra di ricerca, immettere Subnet. In Impostazioni selezionare Subnet.

    Screenshot of the Azure portal interface for the virtual network, showing the search field with Subnets entered.

  6. Verificare che le subnet distribuite abbiano i nomi e gli indirizzi IP specificati nel valore predefinito del parametro subnets.

    Screenshot of the Azure portal that shows two virtual network subnets after deployment.

  7. Controllare l'output del comando di distribuzione. Deve includere il nome e il nome di dominio completo (FQDN) di tutti e tre i server logici distribuiti, come illustrato di seguito:

    Screenshot of the deployment output, displaying the properties of the logical servers.