使用 BICEP 从数组中输出资源 ID

问题描述 投票:0回答:1

我有一个非常简单的 BICEP 模板,它创建一个虚拟网络和几个子网。子网是使用数组创建的。

我正在尝试单独输出子网 ID,以便稍后使用它们。然而,我正在努力实现这一目标,而且我不确定我哪里出错了。请有人帮我了解如何输出子网 ID?

以下是模板和参数文件。

模板

//PARAMETERS
@description('Enter the virtual network name.')
param vnetName string
@description('Enter the deployment region.')
param location string
@description('Enter the virtual network address space.')
param addressPrefixes array
@description('Enter the subnet names and address spaces.')
param subnets array

//RESOURCE
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2019-11-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: addressPrefixes
    }
    subnets: subnets
  }
}

//OUTPUTS
output subnetId array = [for (name, i) in subnets: {
  resourceId: virtualNetwork.properties.subnets[i].id
}]

参数文件

using './virtualNetwork.bicep'

param vnetName = 'vnet-hub-uks-01'

param location = 'uksouth'

param addressPrefixes = [
  '10.0.0.0/16'
]

param subnets = [
  {
    name: 'subnet-1'
    properties: {
      addressPrefix: '10.0.0.0/24'
    }
  }
  {
    name: 'subnet-2'
    properties: {
      addressPrefix: '10.0.1.0/24'
    }
  }
  {
    name: 'subnet-3'
    properties: {
      addressPrefix: '10.0.2.0/24'
    }
  }
]

输出 下面的输出在单个输出中显示了所有三个资源 ID,但我希望它们单独显示。

[{"resourceId":"/subscriptions/d5f2dcf8-ab3f-47aa-9ec3-9c5aba4b909f/resourceGroups/rg-vnet/providers/Microsoft.Network/virtualNetworks/vnet-hub-uks-01/subnets/subnet-1"},{"resourceId":"/subscriptions/d5f2dcf8-ab3f-47aa-9ec3-9c5aba4b909f/resourceGroups/rg-vnet/providers/Microsoft.Network/virtualNetworks/vnet-hub-uks-01/subnets/subnet-2"},{"resourceId":"/subscriptions/d5f2dcf8-ab3f-47aa-9ec3-9c5aba4b909f/resourceGroups/rg-vnet/providers/Microsoft.Network/virtualNetworks/vnet-hub-uks-01/subnets/subnet-3"}]
azure infrastructure-as-code bicep
1个回答
0
投票

使用 BICEP 从数组中输出资源 ID

Bicep 模板中的问题在于您如何尝试访问输出部分中的子网 ID。参数文件中的

subnets
数组是一个对象数组,因此当您尝试访问
virtualNetwork.properties.subnets[i].id
时,它期望
i
是整数索引,但您传递的是一个对象。

要解决此问题,您需要修改访问子网 ID 的方式。您可以使用

outputs
部分来提取子网 ID,如下所示:

testvnet.bicep:

param vnetName string = 'vkVnet'
param addressPrefixes array = ['10.0.0.0/16']
param location string = 'east us'
param subnets array = [
  {
    name: 'subnet-1'
    properties: {
      addressPrefix: '10.0.0.0/24'
    }
  }
  {
    name: 'subnet-2'
    properties: {
      addressPrefix: '10.0.1.0/24'
    }
  }
]

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: vnetName
  location: location 
  properties: {
    addressSpace: {
      addressPrefixes: addressPrefixes
    }
    subnets: subnets
  }
}

output subnet1Id string = concat(
  '/subscriptions/',
  subscription().subscriptionId,
  '/resourceGroups/',
  resourceGroup().name,
  '/providers/Microsoft.Network/virtualNetworks/',
  vnetName,
  '/subnets/subnet-1'
)

output subnet2Id string = concat(
  '/subscriptions/',
  subscription().subscriptionId,
  '/resourceGroups/',
  resourceGroup().name,
  '/providers/Microsoft.Network/virtualNetworks/',
  vnetName,
  '/subnets/subnet-2'
)

现在运行命令

az deployment group create --resource-group VINAY-RG --template-file testvnet.bicep

部署成功:

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.