Terraform 动态循环列表中的元素并根据值进行扩展

use*_*104 3 terraform

这有点难以描述。为了清楚起见,我简化了它之后,我得到了一张看起来像这样的地图:

server_ip_configs = {
mgmt        = {
    ct      = "1"
    }
applicationgateway    = {
    ct      = "1"
    }
monitor     = {
    ct      = "1"
    }
app      = {
    ct      = "3"
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是迭代地图以创建一个平面列表,其中元素乘以 ct 属性的数量成为一个新的平面列表。所以我们最终得到一个看起来有点像这样的列表:

server_ip_configs_mapped = [
       {
        name      = "mgmt-1"
        }
       {
        name      = "applicationgateway-1"
        }
       {
        name      = "monitor-1"
        }
       {
        name      = "app-1"
        }
       {
        name      = "app-2"
        }
       {
        name      = "app-3"
        }

    ]
Run Code Online (Sandbox Code Playgroud)

通过设置变量显式为每行创建元素列表很简单:

data "null_data_source" "server_list_ip_configs" {
  count = lookup(var.server_ip_configs[var.server_role], "ct", 0)

  inputs = {
    name    =   "${var.server_role}-${count.index +1}"
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以将其放入模块中并调用该模块的多个实例并连接结果。但这不是一个好方法,而且一点也不干。我的想法是否正确,在 Terraform 中没有其他方法可以做到这一点?是否因为 terraform 本质上是声明性的,也许我应该声明一个包含多个实例的列表,而不是尝试生成一个?使用 for 循环不起作用,因为从我所看到的来看,您无法使用整数来显式迭代。所以不行:

for i in 5 
Run Code Online (Sandbox Code Playgroud)

欢迎对此的任何答案。谢谢。

Tyl*_*ler 5

@Helder 很接近,但我对请求的解释略有不同。您的意图是根据 ct 值构建列表,该值看起来像一个计数。这应该就是您正在寻找的。请注意使用 来range()执行您在该语句中查找的操作for i in 5。

variable "server_ip_configs" {
  default = {
    mgmt               = { ct = "1" }
    applicationgateway = { ct = "1" }
    monitor            = { ct = "1" }
    app                = { ct = "3" }
  }
}

locals {
  server_ip_configs_mapped = flatten([
    for server, count in var.server_ip_configs : [
      for i in range(count.ct) : {
        "name" = join("-", [server, i+1])
      }
    ]
  ])
}

output server_ip_configs_mapped { value = local.server_ip_configs_mapped }
Run Code Online (Sandbox Code Playgroud)

输出:

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

server_ip_configs_mapped = [
  {
    "name" = "app-1"
  },
  {
    "name" = "app-2"
  },
  {
    "name" = "app-3"
  },
  {
    "name" = "applicationgateway-1"
  },
  {
    "name" = "mgmt-1"
  },
  {
    "name" = "monitor-1"
  },
]
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

6075 次

最近记录:

6 年,3 月 前