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

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

Объявление выходных значений

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

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

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

В примере ниже показано, как возвратить свойство из развернутого ресурса. В примере 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']

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

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

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@2019-06-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@2020-06-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@2020-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() сортирует объекты в алфавитном порядке. В других местах можно сохранить исходное упорядочение. Из-за этой недетерминированности избегайте делать какие-либо предположения о порядке ключей объектов при создании кода, который взаимодействует с выходными данными параметров развертывания &.

Дальнейшие действия