首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在地形中引用对象

如何在地形中引用对象
EN

Stack Overflow用户
提问于 2019-07-03 00:38:41
回答 4查看 4.3K关注 0票数 3

我正在使用terraform创建一个Azure VNet,并在其中创建几个子网。稍后,我希望创建一个网络接口,并将其放入已经为VNet创建的子网中。我不知道如何引用该子网。

我在下面试过了,但现在起作用了:

代码语言:javascript
复制
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}"
} 
}

错误:无法索引设置值

代码语言:javascript
复制
  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.
EN

回答 4

Stack Overflow用户

发布于 2020-09-25 00:54:30

以下是完整的解决方案。

如果子网是作为块创建的,则可以引用给定子网的资源ID,如下所示:

代码语言:javascript
复制
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]
}
票数 3
EN

Stack Overflow用户

发布于 2019-07-03 01:01:14

当将子网创建为块时,必须使用列表语法引用它们,例如:

代码语言:javascript
复制
foo = azurerm_virtual_network.virtual-network.subnet[0].id
bar = azurerm_virtual_network.virtual-network.subnet[1].id

如果子网形成了一个冗余资源池,并且您并不特别关心引用任何子网,那么这是非常有用的。

我不认为这是您的情况,所以您可以考虑将您的子网创建为独立的资源,例如:

代码语言:javascript
复制
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
}

然后可以使用常规对象属性语法引用子网之一:

代码语言:javascript
复制
foo = azurerm_subnet.server.id

还请注意,我使用的是terraform => 0.12语法,因此在不需要字符串插值的情况下,我可以编写foo.bar而不是"${foo.bar}"

票数 2
EN

Stack Overflow用户

发布于 2020-04-15 21:50:35

如果其他人需要答案,请使用以下方法:

代码语言:javascript
复制
"${element(azuread_application.events_backend.app_role[*].id,0)}"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56861532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档