Vegas588
Vegas588

Reputation: 329

Terraform - Output Index along with item

Is there a way to modify this output code to include the index number with the name? The current code below creates one output with Index '0', but each name should ideally be in its own Index (0, 1, 2, etc.)

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.1.0"
    }
  }
}

provider "azurerm" {
  features {

  }
}

variable "private_link_scopes" {
  description = "A list of Azure private link scopes."
  type = list(object({
    name                = string
    resource_group_name = string
  }))
}
locals {
  rgs_map = {
    for n in var.private_link_scopes : n.resource_group_name => {
      name = n.resource_group_name
    }
  }
}

data "azurerm_resource_group" "rg" {
  for_each = local.rgs_map
  name     = each.value.name
}

output "list" {
  value = { for index, item in [var.private_link_scopes] : index => item[*].name }
}

Upvotes: 0

Views: 623

Answers (1)

theherk
theherk

Reputation: 7556

It seems like there is a lot of structure change going on here. That may be due to other baggage or reasons that depend on it, but I think this could be simplified. I use locals in lieu of the variable, but I hope is help.

I'm not sure the splat operator there is what you want. That is the same as getting a list of all items' name attributes in that item value, but there would only be one per item so that seems strange.

locals {
  scopes = [
    {
      name    = "name_a"
      rg_name = "rg_a"
    },
    {
      name    = "name_b"
      rg_name = "rg_b"
    }
  ]
}

data "azurerm_resource_group" "rg" {
  # I don't see a reason to generate the intermediary map
  # or to build another object in each map value. This is more
  # simple. for_each with an object by name: rg_name
  value = { for scope in local.scopes : scope.name => scope.rg_name }
  name  = each.value
}

output "list" {
  # I don't see a need to use a splat expression here.
  # You can just build a map with the index and the name
  # here directly.
  value = { for i, v in local.scopes : i => v.name }
}

In fact, if you don't need the resource group resources to be keyed by name, that can be simplified further to:

data "azurerm_resource_group" "rg" {
  for_each = toset([for scope in local.scopes : scope.rg_name])
  name     = each.value
}

Upvotes: 1

Related Questions