Azure ARM templates – Example use of Outputs

2017, Nov 18    

The Outputs part of an ARM template allow data to be retrieved as part of that templates creation.

Given a simple example of creating an vNet, here’s what we get.
Defining 3 outputs of differing types,
– Virtual Network [Object]
– Virtual Network Addresses [Array]
– Virtual Network Address Prefix [String] (first string in the array)

"outputs" : {
	"vNet" : {
		"type" : "object",
		"value" : "[reference(resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName')))]"
	},
	"vNetAddresses" : {
		"type" : "array",
		"value": "[reference(resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))).addressSpace.addressPrefixes]"
	},
	"vNetAddressSpace" : {
		"type" : "string",
		"value": "[reference(resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))).addressSpace.addressPrefixes[0]]"
	}
}

We get this output.

Outputs                 : 
  Name             Type                       Value     
  ===============  =========================  ==========
  vNet             Object                     {
	"provisioningState": "Succeeded",
	"resourceGuid": "f8830a45-ee29-4932-889d-d6f34bb1817c",
	"addressSpace": {
	  "addressPrefixes": [
		"10.250.0.0/16"
	  ]
	},
	"subnets": [
	  {
		"name": "win-test-subnet",
		"id": "/subscriptions/2d5bb2c8-8be8-4539-b48f-fbfd86852fa9/resourceGroups/myTmpRg25/providers/Microsoft.Network/virtualNetwork
  s/apigw-test-vnet/subnets/apigw-test-subnet",
		"etag": "W/\"759461be-66a2-4268-b3b3-1a3201e00686\"",
		"properties": {
		  "provisioningState": "Succeeded",
		  "addressPrefix": "10.250.0.0/24"
		}
	  }
	]
  }
  vNetAddresses    Array                      [
                            "10.250.0.0/16"
                          ]
                          vNetAddressSpace  String                     10.250.0.0/16
  vNetAddressSpace  String                     10.250.0.0/16

Powershell script for deploying and retrieving values.

$vnet = New-AzureRmResourceGroupDeployment -Name vnetDeploy -ResourceGroupName $rgName -TemplateFile template.json -TemplateParameterFile parameters.json

[psobject]$vnetAddresses = $vnet.Outputs.item("vNet").value.ToString() | ConvertFrom-Json
[array]$vnetAddresses = $vnet.Outputs.item("vNetAddresses").value
[string]$vnetAddressSpace = $vnet.Outputs.item("vNetAddressSpace").value

Taking a more practical example, retrieving the StaticIP’s from APIM after creation;

Template

"outputs" : {
		"ApimStaticIps" : {
			"type" : "array",
			"value": "[reference(resourceId('Microsoft.ApiManagement/service', variables('apiManagementServiceName'))).staticIps]"
		}
	}
}

Powershell Output

Outputs                 : 
                          Name             Type                       Value     
                          ===============  =========================  ==========
                          apimStaticIps    Array                      [
                            "52.233.235.194",
                            "10.250.1.5"
                          ]