Выходные значения в шаблонах ARM

Эта статья описывает, как объявлять выходные значения в шаблоне Azure Resource Manager (ARM). Выходные данные используются, когда нужно возвратить данные из развернутых ресурсов.

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

Совет

Мы рекомендуем использовать Bicep, так как он предоставляет те же возможности, что и шаблоны ARM, и имеет более простой синтаксис. Дополнительные сведения см. в разделе Выходные данные.

В шаблоне ограничено 64 выходных данных. Дополнительные сведения см. в разделе Ограничения шаблона.

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

В примере ниже показано, как вернуть свойство из развернутого ресурса.

Добавьте в шаблон раздел outputs. В выходное значение записывается полное доменное имя для общедоступного IP-адреса.

"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  },
}

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

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "user": {
      "user-name": "Test Person"
    }
  },
  "resources": [
  ],
  "outputs": {
    "nameResult": {
      "type": "string",
      "value": "[variables('user')['user-name']]"
    }
  }
}

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

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

"outputs": {
  "resourceID": {
    "condition": "[equals(parameters('publicIpNewOrExisting'), 'new')]",
    "type": "string",
    "value": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_name'))]"
  }
}

Простой пример условного вывода см. в статье Шаблон условного вывода.

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

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

"outputs": {
  "storageEndpoints": {
    "type": "array",
    "copy": {
      "count": "[parameters('storageCount')]",
      "input": "[reference(concat(copyIndex(), variables('baseName'))).primaryEndpoints.blob]"
    }
  }
}

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

Связанные шаблоны

Можно развертывать взаимосвязанные шаблоны с помощью связанных шаблонов. Чтобы получить выходное значение из связанного шаблона, используйте функцию reference (ссылка) в родительском шаблоне. В родительском шаблоне применяется следующий синтаксис:

"[reference('<deploymentName>').outputs.<propertyName>.value]"

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

"publicIPAddress": {
  "id": "[reference('linkedTemplate').outputs.resourceID.value]"
}

Если имя свойства содержит дефис, вместо нотации с точками заключите имя в квадратные скобки.

"publicIPAddress": {
  "id": "[reference('linkedTemplate').outputs['resource-ID'].value]"
}

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

Шаблон общедоступного IP-адреса создает общедоступный IP-адрес и выводит ИД ресурса. Шаблон подсистемы балансировки нагрузки ссылается на предыдущий шаблон. При создании подсистемы балансировки нагрузки он использует идентификатор ресурса в выходных данных.

Пример шаблона

Следующий шаблон не развертывает ресурсы. В нем показаны разные способы возврата выходных значений различных типов.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [],
  "outputs": {
    "stringOutput": {
      "type": "string",
      "value": "[deployment().name]"
    },
    "integerOutput": {
      "type": "int",
      "value": "[length(environment().authentication.audiences)]"
    },
    "booleanOutput": {
      "type": "bool",
      "value": "[contains(deployment().name, 'demo')]"
    },
    "arrayOutput": {
      "type": "array",
      "value": "[environment().authentication.audiences]"
    },
    "objectOutput": {
      "type": "object",
      "value": "[subscription()]"
    }
  }
}

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

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

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

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

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

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

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