我正在使用terraform创建一个Azure VNet,并在其中创建几个子网。稍后,我希望创建一个网络接口,并将其放入已经为VNet创建的子网中。我不知道如何引用该子网。
我在下面试过了,但现在起作用了:
subnet_id = "${azurerm_virtual_network.virtual-network.subnet.ServersSubnet.id}"
resource "azurerm_virtual_network" "virtual-network" {
name = "${var.ClientShortName}-az-network"
address_space = ["${local.AzureInfraNetwork}"]
location = "${var.resource-location}"
resource_group_name = "${azurerm_resource_group.test-resource-group.name}"
subnet {
name = "ServersSubnet"
address_prefix = "${local.ServersSubnet}"
}
subnet {
name = "GatewaySubnet"
address_prefix = "${local.GatewaySubnet}"
}
}错误:无法索引设置值
on main.tf line 120, in resource "azurerm_network_interface" "DCNIC":
120: subnet_id = "${azurerm_virtual_network.virtual-network.subnet.ServersSubnet.id}"
Block type "subnet" is represented by a set of objects, and set elements do
not have addressable keys. To find elements matching specific criteria, use a
"for" expression with an "if" clause.发布于 2020-09-25 00:54:30
以下是完整的解决方案。
如果子网是作为块创建的,则可以引用给定子网的资源ID,如下所示:
resource "azurerm_resource_group" "main" {
name = "vnet-rg"
location = "eastus"
}
resource "azurerm_virtual_network" "main" {
name = "my-vnet"
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
address_space = ["10.0.0.0/16"]
subnet {
name = "subnet1"
address_prefix = "10.0.1.0/24"
}
subnet {
name = "subnet2"
address_prefix = "10.0.2.0/24"
}
subnet {
name = "subnet3"
address_prefix = "10.0.3.0/24"
}
}
output "subnet1_id" {
value = azurerm_virtual_network.main.subnet.*.id[0]
}
output "subnet2_id" {
value = azurerm_virtual_network.main.subnet.*.id[1]
}
output "subnet3_id" {
value = azurerm_virtual_network.main.subnet.*.id[2]
}发布于 2019-07-03 01:01:14
当将子网创建为块时,必须使用列表语法引用它们,例如:
foo = azurerm_virtual_network.virtual-network.subnet[0].id
bar = azurerm_virtual_network.virtual-network.subnet[1].id如果子网形成了一个冗余资源池,并且您并不特别关心引用任何子网,那么这是非常有用的。
我不认为这是您的情况,所以您可以考虑将您的子网创建为独立的资源,例如:
resource "azurerm_virtual_network" "main" {
name = "${var.ClientShortName}-az-network"
address_space = [local.AzureInfraNetwork]
location = var.resource-location
resource_group_name = azurerm_resource_group.test-resource-group.name
}
resource "azurerm_subnet" "server" {
virtual_network_name = azurerm_virtual_network.main.name
name = "ServersSubnet"
address_prefix = local.ServersSubnet
}
resource "azurerm_subnet" "gateway" {
virtual_network_name = azurerm_virtual_network.main.name
name = "GatewaySubnet"
address_prefix = local.ServersSubnet
}然后可以使用常规对象属性语法引用子网之一:
foo = azurerm_subnet.server.id还请注意,我使用的是terraform => 0.12语法,因此在不需要字符串插值的情况下,我可以编写foo.bar而不是"${foo.bar}"。
发布于 2020-04-15 21:50:35
如果其他人需要答案,请使用以下方法:
"${element(azuread_application.events_backend.app_role[*].id,0)}"https://stackoverflow.com/questions/56861532
复制相似问题