Azure 地形:用于每个模块中的_

Azure 地形:用于每个模块中的_,azure,terraform,terraform-provider-azure,Azure,Terraform,Terraform Provider Azure,我使用的是terraform版本0.14.3。 我有一个用于创建Azure网络接口卡的模块,如下所示: resource "azurerm_network_interface" "nic" { name = var.nic_name location = var.location resource_group_name = var.rg_name ip_configuration {

我使用的是terraform版本0.14.3。 我有一个用于创建Azure网络接口卡的模块,如下所示:

resource "azurerm_network_interface" "nic" {

  name                = var.nic_name
  location            = var.location
  resource_group_name = var.rg_name

  ip_configuration {
    name                          = var.ipconfig_name
    subnet_id                     = var.subnet_id
    private_ip_address_allocation = "Dynamic"
  }
}
nics = {
  nic1 = {
    nic_name      = "abc-nic-1"
    ipconfig_name = "nic-1-ipconfig"
  }
}
其输出定义为:

output "nic_id" {
     value = azurerm_network_interface.nic.id 
}
我正在调用此父模块中的此模块:

module "NIC" {
  source = "./NIC"
  for_each = var.nics

  nic_name      = each.value.nic_name
  location      = "eastus2"
  rg_name       = "abc-test-rg"
  ipconfig_name = each.value.ipconfig_name
  subnet_id     = <subnet_id>
}

output "nic_ids" {
  value = [for k in module.NIC.nic_id : k.id]
} 
我想在NIC输出ID周围循环,并希望显示它们。 当我运行上述代码时,我在地形平面图中得到以下错误:

如何绕过它?

您的
模块“NIC”
块为每个
集合设置了
,因此模块中其他地方的
模块.NIC
符号是从实例键到输出对象的映射,而不是单例模块中的单个输出对象

Terraform的错误消息试图通过以下消息引起注意:

  • module.NIC是具有1个属性“nic1”的对象
请注意,
nic1
这里是
var.nics
中的一个键,而不是模块中定义的一个输出值

假设此处显示的
nic\u id
输出是该模块中定义的唯一输出,
module.nic
值的形状如下:

{
  nic1 = {
    nic_id = "eni-e5aa89a3"
  }
}
{
  nic1 = "eni-e5aa89a3"
}
output "nic_ids" {
  value = toset([for nic in module.NIC : nic.nic_id])
} 
听起来您希望生成一个如下形状的值:

{
  nic1 = {
    nic_id = "eni-e5aa89a3"
  }
}
{
  nic1 = "eni-e5aa89a3"
}
output "nic_ids" {
  value = toset([for nic in module.NIC : nic.nic_id])
} 
如果是这样,获得该结果的合适表达式如下:

output "nic_ids" {
  value = { for k, nic in module.NIC : k => nic.nic_id }
} 
上述方法:为
NIC
模块的每个实例生成一个元素映射,其键为模块实例键,其值为
NIC_id
输出值

或者,如果哪个id属于哪个实例并不重要,那么您可以生成一组无序的id,如下所示:

{
  nic1 = {
    nic_id = "eni-e5aa89a3"
  }
}
{
  nic1 = "eni-e5aa89a3"
}
output "nic_ids" {
  value = toset([for nic in module.NIC : nic.nic_id])
} 

在这种情况下,for
表达式只定义一个本地符号
nic
,它表示模块实例对象,因为它与实例键无关。这里的
toset
表示ID没有任何特定的顺序:这不是严格必要的,但我认为这是一个很好的实践,以确保依赖于该值的任何其他地形代码不会无意中依赖于ID的当前任意顺序,如果您在
var.nics

中添加或删除元素,将来可能会发生变化。谢谢Martin,让我试试。