Упражнение. Использование циклов переменных и выходных циклов

Завершено

Для вашей компании необходимо развернуть виртуальные сети в каждой стране или регионе, где вы запускаете тедди медведя. Разработчики также попросили предоставить им полные доменные имена (FQDN) всех развернутых вами региональных логических серверов Azure SQL.

В этом упражнении вы добавите виртуальную сеть и ее конфигурацию в код Bicep и выведите полные доменные имена логических серверов.

В процессе вы:

  • обновить код Bicep, чтобы указать параметр для каждой подсети виртуальной сети;
  • добавить цикл переменных, чтобы создать массив подсети для использования в объявлении ресурса виртуальной сети;
  • добавить цикл вывода, чтобы создать список полных доменных имен логических серверов;
  • развернуть файл Bicep и проверить развертывание.

Добавление виртуальной сети в файл Bicep

  1. Откройте файл main.bicep.

  2. Под объявлениями параметров добавьте следующие параметры:

    @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. Под параметрами добавьте пустую строку, а затем добавьте цикл переменных subnetProperties:

    var subnetProperties = [for subnet in subnets: {
      name: subnet.name
      properties: {
        addressPrefix: subnet.ipAddressRange
      }
    }]
    
  4. Внизу файла под циклом модуля databases добавьте следующий цикл ресурсов:

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

    Примечание.

    В этом примере для всех виртуальных сетей используется одинаковое адресное пространство. Обычно при создании нескольких виртуальных сетей вы можете предоставить им разные адресные пространства на случай, если их нужно будет соединить.

  5. Сохраните изменения в файле.

Добавление выходных данных в модуль базы данных

  1. Откройте файл modules/database.bicep.

  2. В нижней части файла добавьте следующие выходные данные:

    output serverName string = sqlServer.name
    output location string = location
    output serverFullyQualifiedDomainName string = sqlServer.properties.fullyQualifiedDomainName
    
  3. Сохраните изменения в файле.

Потоковая передача выходных данных через родительский файл Bicep

  1. Откройте файл main.bicep.

  2. В нижней части файла добавьте следующий цикл выходных данных:

    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. Сохраните изменения в файле.

Проверка файла Bicep

После выполнения всех описанных выше изменений файл main.bicep должен выглядеть, как в следующем примере:

@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@2024-05-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
}]

Файл database.bicep должен выглядеть, как в следующем примере:

@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@2024-05-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdministratorLogin
    administratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}

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

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

resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2024-05-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

Если они нет, скопируйте примеры или измените шаблоны в соответствии с примерами.

Разверните шаблон Bicep в Azure

В окне терминала Visual Studio Code разверните шаблон Bicep в Azure, выполнив указанный ниже код. Этот процесс может занять несколько минут. Затем будет выполнено успешное развертывание.

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

В окне терминала Visual Studio Code разверните шаблон Bicep в Azure, выполнив указанную ниже команду Azure PowerShell. Этот процесс может занять несколько минут. Затем будет выполнено успешное развертывание.

New-AzResourceGroupDeployment -Name main -TemplateFile main.bicep

Внимание

Не забудьте использовать тот же пароль для входа и пароля, который вы использовали ранее, или развертывание не завершится успешно.

Дождитесь окончания развертывания.

Проверка развертывания

После завершения развертывания необходимо проверить, развернуты ли новые виртуальные сети и настроены ли для них подсети должным образом.

  1. Перейдите на портал Azure и убедитесь, что вы находитесь в подписке песочницы.

  2. Выберите "[имя группы ресурсов песочницы]"

  3. Убедитесь, что виртуальные сети развернуты в трех расположениях Azure.

    Снимок экрана: портал Azure со списком виртуальных сетей после развертывания.

  4. Выберите виртуальную сеть с именем teddybear-eastasia.

  5. В поле поиска введите Подсети. В разделе Параметры выберите Подсети.

    Снимок экрана: интерфейс портала Azure для виртуальной сети, показывающий поле поиска с введенным значением

  6. Убедитесь, что развернутые подсети имеют имена и IP-адреса, указанные в значении по умолчанию параметра subnets.

    Снимок экрана: портал Azure, отображающий две подсети виртуальной сети после развертывания.

  7. Проверьте выходные данные команды развертывания. Они должны включать имя и полное доменное имя всех трех развернутых логических серверов, как показано ниже:

    Снимок экрана: выходные данные развертывания, отображающие свойства логических серверов.

  1. Перейдите на портал Azure и убедитесь, что вы находитесь в подписке песочницы.

  2. Выберите "[имя группы ресурсов песочницы]"

  3. Убедитесь, что виртуальные сети развернуты в трех расположениях Azure.

    Снимок экрана: портал Azure со списком виртуальных сетей после развертывания.

  4. Выберите виртуальную сеть с именем teddybear-eastasia.

  5. В поле поиска введите Подсети. В разделе Параметры выберите Подсети.

    Снимок экрана: интерфейс портала Azure для виртуальной сети, показывающий поле поиска с введенным значением

  6. Убедитесь, что развернутые подсети имеют имена и IP-адреса, указанные в значении по умолчанию параметра subnets.

    Снимок экрана: портал Azure, отображающий две подсети виртуальной сети после развертывания.

  7. Проверьте выходные данные команды развертывания. Они должны включать имя и полное доменное имя всех трех развернутых логических серверов, как показано ниже:

    Снимок экрана: выходные данные развертывания, отображающие свойства логических серверов.