0
votes

I have a module which has a variable defined using for_each, and its output is as below:

output "nic_ids" {
    value = [for x in azurerm_network_interface.nic : x.id]
}
nic_ids = [
  "/subscriptions/*****/resourceGroups/test-rg/providers/Microsoft.Network/networkInterfaces/test-nic-1",
  "/subscriptions/*****/resourceGroups/test-rg/providers/Microsoft.Network/networkInterfaces/test-nic-2",
]

My aim is to pass above NIC ids to the VM module and have 1:1 mapping between NIC id and VM (test-nic-1 should only be attached to vm-1, test-nic-2 to vm-2 etc.)

module "vm" {
  source  = "*****/vm/azurerm"
  version = "0.1.0"
  
   vms = var.vms
   nic_ids = module.nic[each.value.id].nic_ids 
} 

I am getting below error:

Error: each.value cannot be used in this context

  on main.tf line 58, in module "vm":
  58:    nic_ids = module.nic[each.value.id].nic_ids 

A reference to "each.value" has been used in a context in which it
unavailable, such as when the configuration no longer contains the value in
its "for_each" expression. Remove this reference to each.value in your
configuration to work around this error.

I used this similar question as reference. Can you please suggest?

1

1 Answers

2
votes

You could pass the above NIC id list to the VM modules with the count.

module "vm" {
  source              = "./modules/vms"
  vm_names            = ["aaa","bbb"]

  nic_ids = module.nic.network_interface_nics  
}

module "nic" {
  source = "./modules/nic"

  nic_names = ["nic1","nic2"]

}

the main.tf in the VM module:

resource "azurerm_virtual_machine" "vm-windows" {
  count                         = length(var.vm_names)
  name                          = var.vm_names[count.index]
  resource_group_name           = data.azurerm_resource_group.vm.name
  location                      = var.location
  vm_size                       = var.vm_size
  network_interface_ids         = [ var.nic_ids[count.index] ]
...

}

The output.tf in the NIC module:

output "network_interface_nics" {
  description = "ids of the vm nics provisoned."
  value       = [for x in azurerm_network_interface.nic : x.id]
}