使用 Terraform 检索 Azure VNET 子网 ID



我想使用 azurerm_virtual_network 数据源从 Azure 中的现有 VNET 检索/拉取子网 ID。 我下面的代码没有按预期工作。 任何帮助,不胜感激。

data "azurerm_virtual_network" "vnet" {
  name                 = "my-vnet"
  resource_group_name  = "my-resource-group"
}
output "my-subnets-ids" {
  value = "${data.azurerm_virtual_network.vnet.subnets.id}"
}

我在执行时收到以下错误。

output.my-subnets: Resource 'data.azurerm_virtual_network.vnet' 
does not have attribute 'subnets.id' for variable
'data.azurerm_virtual_network.vnet.subnets.id'

我会将其与子网数据资源结合使用,并使用它来获取您的所有 ID。这段代码很接近,我没有时间拉起它并制定完整的语法。

data "azurerm_subnet" "test" {
    name                 = "${data.azurerm_virtual_network.vnet.subnets[count.index]}"
    virtual_network_name = "${data.azurerm_virtual_network.vnet.name}"
    resource_group_name  = "${data.azurerm_virtual_network.vnet.resource_group_name}"
    count = "${count(data.azurerm_virtual_network.vnet.subnets)}"
}
 output "subnet_ids" {
     value = "${data.azurerm_subnet.test.*.id}"
 }

如果您希望能够使用子网名称而不是任意索引引用结果,则可以使用以下方法:

data "azurerm_virtual_network" "vnet_ski_01" {
  name                 = module.vnet_ski_01.name
  resource_group_name  = module.azurerm_resource_group_net_01.name
}
data "azurerm_subnet" "vnet_ski_01_subnets" {
  for_each            = toset(data.azurerm_virtual_network.vnet_ski_01.subnets)
  name                 = each.value
  virtual_network_name = "${data.azurerm_virtual_network.vnet_ski_01.name}"
  resource_group_name  = "${data.azurerm_virtual_network.vnet_ski_01.resource_group_name}"
}

然后,您可以按名称引用子网,例如(AzureBastionSubnet子网名称):

output "subnet_bastion_address_space" {
     value = data.azurerm_subnet.vnet_ski_01_subnets["AzureBastionSubnet"].address_prefix
 }

我使用此方法将所有子网传递到 NSG 模块,以便可以在 NSG 规则中引用子网地址空间

你可以通过以下方式获得它:

data.azurerm_virtual_network.vnet.subnet.*.id

这将是一个列表,要获取第一个成员,请使用:

data.azurerm_virtual_network.virtualNetwork1.subnet.*.id[0]

我已经根据 Jamies 提出的解决方案实现了这个,并且这段代码:)

data "azurerm_subnet" "virtualSubnets1" {
    name                 = data.azurerm_virtual_network.virtualNetwork1.subnets[count.index]
    virtual_network_name = data.azurerm_virtual_network.virtualNetwork1.name
    resource_group_name  = data.azurerm_virtual_network.virtualNetwork1.resource_group_name
    count                = length(data.azurerm_virtual_network.virtualNetwork1.subnets)
}

output "virtualnetwork_subnets_ids" {
  value = data.azurerm_subnet.virtualSubnets1.*.id
}

。然后你可以使用这样的东西检索子网

resource "azurerm_subnet_network_security_group_association" "nsg_mapping1" {
  subnet_id                 = data.terraform_remote_state.networking.outputs.virtualnetwork_subnets_ids[1]
  network_security_group_id = azurerm_network_security_group.nsg.id
}

根据此,它只包含子网名称的列表,而不是它们的 ID,因此您需要手动构造它们。 最简单的方法 - 获取 vnet.id 并添加'/subnets/${each subnet name goes here}'

最新更新