itlux
itlux

Reputation: 121

Is there possibility to dynamicly pass user-defined variable (key = value) to terraform module?

There is resource:

resource "resource_name" "foo" {
  name        = "test"
  
  config {
    version = 14

    resources {
      disk_type_id       = "network-ssd"
    }

    postgresql_config = {
      enable_parallel_hash              = true
    }
  }
}

I need a module which accepts optional user variables in "postgresql_config". There can be many such variables.

I tried next:

variables.tf

variable "postgresql_config" {
  description = "User defined for postgresql_config"
  type = list(object({
  # key1 = value1
  # ...
  # key50 = value50
  }))
}

variable "config" {
  description = "for dynamic block 'config' "
  type = list(object({
    version                   = number
  }))
  default = [{
    version                   = 14
  }]
}

variable "resources" {
  description = "for dynamic block 'resources' "
  type = list(object({
    disk_type_id       = string
  }))
  default = [{
    disk_type_id       = "network-hdd"
  }]
}

module/postgresql/main.tf

resource "resource_name" "foo" {
  name        = "test"
  
  dynamic "config" {
    for_each = var.config
    content {
      version                   = config.value["version"]

      dynamic "resources" {
        for_each = var.resources
        content {
          disk_type_id       = resources.value["disk_type_id"]
        }
      }
      
      # problem is here
      postgresql_config = {
        for_each = var.postgresql_config
        each.key = each.value
      }

    }
}

example/main.tf

module "postgresql" {
  source = "../module/postgresql"

  postgresql_config = [{
    auto_explain_log_buffers = true
    log_error_verbosity = "LOG_ERROR_VERBOSITY_UNSPECIFIED"
    max_connections                   = 395
    vacuum_cleanup_index_scale_factor = 0.2
  }]

That is, I understand that I need to use "dynamic", but it can only be applied to the block "config" and the nested block "resource_name".

How can I pass values for "postgresql_config" from main.tf to module? Of course, my example with for_each = var.postgresql_config doesn't work, but I hope this way to give an idea of what I need.

Or does terraform have no such option to use custom variables dynamically at all, and all of them must be specified explicitly?

Any help would be appreciated, thank you

Upvotes: 0

Views: 521

Answers (1)

Darren
Darren

Reputation: 598

from what I understand , you are trying to create a map dynamically for your resource postgres_config.

I would recommend using a for expression to solve that problem.

However, I think your problem lies in how you have defined variables for your module . You might run into a problem if your postgress_config list has multiple configs in it because that config can only take a map by the looks of it.

have a look at the following documentation:

this one is for how to define your variables

https://www.terraform.io/language/expressions/dynamic-blocks#multi-level-nested-block-structures

for expressions

https://www.terraform.io/language/expressions/for

my solution for your config problem ,would be something like this assuming that the postgres_config list has one element all the time:

      # problem is here
      postgresql_config = var.postgresql_config[0]

Upvotes: 1

Related Questions