Devopsnoob
Devopsnoob

Reputation: 57

Tricky conversion of variable using locals in terraform

looking for possible solution/approach for the below req.

I have a var as below

nodes= {
  "type1" = { 
     max_size = 4
     tags = { "key1" = "value1" 
               "key2" = "value2"   }  # structure of tags can be changed as needed
}

and then I have a locals that will ref this tag to use in an asg

locals {
    for nodetype, nodeconfig in var.nodes
    ..
    ..
      node_tags = nodeconfig.tags
}

local.node_tags must take the final form as below

{
  "key" = "key1"
  "value" = "value1"
  "propagate_at_launch" = "true"
},
{
 "key" = "key2"
  ...
  ...
}

I need to use these in an asg

resource "aws_autoscaling_group" "nodes" {
  for_each = { for i in local.nodes ....
...
...
tags = each.value.node_tags

 }

Similar use case - https://github.com/terraform-aws-modules/terraform-aws-autoscaling#tags

I tried something below.. looks ugly and doesn't work.

locals {
    for nodetype, nodeconfig in var.nodes
    ..
    ..
      node_tags = {for i in nodeconfig.tags : "{i}" => { 
          "key" = keys(i),
          "value" = values(i),
          "propagate_at_launch" = "true"
           } 
     }
}

Upvotes: 1

Views: 222

Answers (1)

Marcin
Marcin

Reputation: 238081

What about this one:

variable "nodes" {

    default = {
        "type1" = { 
           max_size = 4
           tags = { "key1" = "value1" 
                     "key2" = "value2"
                  } 
       },
       
        "type2" = { 
           max_size = 4
           tags = { "key11" = "value11" 
                    "key22" = "value22"
                  } 
       },       
    }
}


locals {

  node_tags = values(merge([for nodetype, nodeconfig in var.nodes: 
                 {for tag_key , tag_value in nodeconfig.tags:
                    "${nodetype}-${tag_key}-${tag_value}" => 
                                {key = tag_key
                                 value = tag_value
                                "propagate_at_launch" = "true"}
                 }                          
              ]...))

}




output "test" {

  value = local.node_tags

}

which gives:

test = [
  {
    "key" = "key1"
    "propagate_at_launch" = "true"
    "value" = "value1"
  },
  {
    "key" = "key2"
    "propagate_at_launch" = "true"
    "value" = "value2"
  },
  {
    "key" = "key11"
    "propagate_at_launch" = "true"
    "value" = "value11"
  },
  {
    "key" = "key22"
    "propagate_at_launch" = "true"
    "value" = "value22"
  },
]

Upvotes: 1

Related Questions