我想使用 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}'