Поделиться через


Выходные данные в Bicep

В этой статье описывается, как определять выходные значения в файле Bicep. Когда вам нужно вернуть значения из развернутых ресурсов, вы используете выходные данные. В Bicep-файле можно задать не более 64 выходных данных. Дополнительные сведения см. в разделе Ограничения шаблона.

Определение выходных данных

Для определения выходного значения используется следующий синтаксис:

output <name> <data-type or type-expression> = <value>

Выходные данные могут иметь то же имя, что и параметр, переменная, модуль или ресурс. Каждое выходное значение должно соответствовать одному из типов данных или пользовательских типов данных в Bicep.

Следующий пример показывает, как извлечь свойство из развернутого ресурса. В этом примере publicIP — символьное имя общедоступного IP-адреса, развернутого в Bicep-файле. Выходное значение возвращает полное доменное имя для общедоступного IP-адреса.

output hostname string = publicIP.properties.dnsSettings.fqdn

В следующем примере показано, как возвращать выходные данные различных типов:

output stringOutput string = deployment().name
output integerOutput int = length(environment().authentication.audiences)
output booleanOutput bool = contains(deployment().name, 'demo')
output arrayOutput array = environment().authentication.audiences
output objectOutput object = subscription()

Если необходимо вывести свойство с дефисом в имени, вместо нотации с точками заключите имя в квадратные скобки. Например, используйте функцию ['property-name'] вместо .property-name.

var user = {
  'user-name': 'Test Person'
}

output stringOutput string = user['user-name']

В следующем примере показано, как использовать выражение типа:

param foo 'a' | 'b' = 'a'

output out 'a' | 'b' = foo

Использование декораторов

Декораторы записываются в формате @expression и помещаются над объявлениями выходных данных. В следующей таблице показаны доступные декораторы для выходных данных:

Декоратор Применить к Аргумент Описание
описание все строка Это содержит описания выходных данных.
дискриминатор объект строка Используйте этот декоратор, чтобы убедиться, что правильный подкласс определен и управляется. Дополнительные сведения см. в разделе "Тип данных с пользовательским тегом объединения".
maxLength Массив, строка INT Это обеспечивает максимальную длину выходных данных строк и массивов, а значение — включительно.
maxValue INT INT Это обеспечивает максимальное значение для целочисленных выходных данных, и это значение включено.
metadata все объект Это предоставляет настраиваемые свойства для применения к выходным данным и может включать свойство описания, эквивалентное декоратору описания.
minLength Массив, строка INT Это определяет минимальную длину для выводов строки и массива, и это значение учитывается.
minValue INT INT Это обеспечивает минимальное значение для целочисленных выходных данных, а значение — включительно.
запечатанный объект ничего Повышение уровня BCP089 от предупреждения до ошибки, когда имя свойства определяемого пользователем типа данных, скорее всего, является опечаткой. Дополнительные сведения см. в разделе "Повышение уровня ошибок".

Декораторы находятся в sys пространстве имен. Если вам важно, чтобы декоратор не путался с другими элементами с таким же именем, добавьте к нему префикс sys. Например, если файл Bicep содержит параметр с именем description, необходимо добавить sys пространство имен при применении декоратора описания.

@sys.description('The name of the instance.')
param name string
@sys.description('The description of the instance to display.')
param description string

Описание

Чтобы добавить объяснение, добавьте описание в объявления о выводе данных. Например:

@description('Conditionally output the endpoint.')
output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

Текст в формате Markdown можно использовать для текста описания.

Дискриминатор

См. тип данных с пользовательским тегом объединения.

Ограничения для целочисленных параметров

Можно задать минимальные и максимальные значения для целых выходных данных и одного или обоих ограничений.

var thisMonth = 3

@minValue(1)
@maxValue(12)
output month int = thisMonth

Ограничения длины

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

В следующем примере объявляются два выхода. Один из выходных данных — это имя учетной записи хранения, которое должно содержать 3–24 символов. Другие выходные данные — это массив, который должен содержать из 1–5 элементов:

var accountName = uniqueString(resourceGroup().id)
var appNames = [
  'SyncSphere'
  'DataWhiz'
  'FlowMatrix'
]

@minLength(3)
@maxLength(24)
output storageAccountName string = accountName

@minLength(1)
@maxLength(5)
output applicationNames array = appNames

Метаданные

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

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

var obj = {}
@description('Configuration values that are applied when the application starts.')
@metadata({
  source: 'database'
  contact: 'Web team'
})
output settings object = obj

Когда вы предоставляете декоратор с свойством @metadata() , который конфликтует с другим декоратором, этот декоратор всегда имеет приоритет над всем в декораторе @metadata() . В свою очередь конфликтующее свойство в @metadata() значении является избыточным и будет заменено. Дополнительные сведения см. в правиле Linter — не конфликтующие метаданные.

Запечатанный

См. повышенный уровень ошибок.

Условный вывод

Если возвращаемое значение зависит от условия развертывания, используйте ? оператор.

output <name> <data-type> = <condition> ? <true-value> : <false-value>

Обычно условный вывод используется при условном развертывании ресурса. В примере ниже показано, как условно возвратить идентификатор ресурса для общедоступного IP-адреса в зависимости от того, был ли развернут новый адрес.

Чтобы задать в Bicep условный вывод, используйте оператор ?. В следующем примере возвращается URL-адрес конечной точки или пустая строка, которая зависит от условия:

param deployStorage bool = true
param storageName string
param location string = resourceGroup().location

resource myStorageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = if (deployStorage) {
  name: storageName
  location: location
  kind: 'StorageV2'
  sku:{
    name:'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    accessTier: 'Hot'
  }
}

output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

Динамическое число выходов

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

output <name> <data-type> = [for <item> in <collection>: {
  ...
}]

В следующем примере выполняется итерация в массиве.

param nsgLocation string = resourceGroup().location
param orgNames array = [
  'Contoso'
  'Fabrikam'
  'Coho'
]

resource nsg 'Microsoft.Network/networkSecurityGroups@2023-11-01' = [for name in orgNames: {
  name: 'nsg-${name}'
  location: nsgLocation
}]

output deployedNSGs array = [for (name, i) in orgNames: {
  orgName: name
  nsgName: nsg[i].name
  resourceId: nsg[i].id
}]

Дополнительные сведения о циклах см. в статье Интерактивные циклы в Bicep.

Выходные значения модулей

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

<module-name>.outputs.<property-name>

В следующем примере показано, как получить значение из модуля, чтобы задать IP-адрес в подсистеме балансировки нагрузки:

module publicIP 'modules/public-ip-address.bicep' = {
  name: 'public-ip-address-module'
}

resource loadBalancer 'Microsoft.Network/loadBalancers@2023-11-01' = {
  name: loadBalancerName
  location: location
  properties: {
    frontendIPConfigurations: [
      {
        name: 'name'
        properties: {
          publicIPAddress: {
            id: publicIP.outputs.resourceId
          }
        }
      }
    ]
    // ...
  }
}

Получение выходных значений

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

Вы можете использовать скрипт Azure CLI или Azure PowerShell для получения выходных значений из журнала развертывания.

(Get-AzResourceGroupDeployment `
  -ResourceGroupName <resource-group-name> `
  -Name <deployment-name>).Outputs.resourceID.value

Сортировка объектов в выходных данных

В ФОРМАТЕ JSON объект является неупорядоченной коллекцией нулевых или более пар ключей или значений. Порядок может отличаться в зависимости от реализаций. Например, функция Bicep items() сортирует объекты в алфавитном порядке. В других местах можно сохранить исходное упорядочение. Из-за этого недетерминированного, избегайте принятия каких-либо предположений о упорядочении ключей объектов при написании кода, который взаимодействует с параметрами развертывания и выходными данными.

Следующие шаги

Сведения о свойствах, доступных для выходных данных, см. в разделе "Структура файлов Bicep" и синтаксис.