You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform 1.1.9 dynamic块for_each传对象列表报错修复

报错根因
  • Terraform 1.1.9版本有个已知bug:如果传给dynamic块for_each参数的集合被标记为sensitive敏感值,Terraform就识别不出这是可迭代集合,直接抛出类型不兼容报错。
  • 你配置里的rke_nodes是对象列表,上游输出时因为包含ssh私钥这类敏感字段设置了sensitive = true,整个列表被标记为敏感值后,刚好触发了这个bug。
修复方案

直接调整rke_cluster资源里dynamic nodes块的for_each写法,将列表转换为以节点唯一标识(EC2实例ID,即你配置里的hostname字段)为键的映射集合,即可绕过版本缺陷正常迭代,同时不会泄露敏感信息:

# Provision RKE cluster on provided infrastructure
resource "rke_cluster" "rancher_cluster" {
  cluster_name = var.rke.cluster_name

  dynamic nodes {
    # 转换为map类型,用实例hostname(EC2 ID)作为唯一键
    for_each = { for node in var.rke_nodes : node.hostname => node }
    content {
      address           = nodes.value.public_ip
      internal_address  = nodes.value.private_ip
      hostname_override = nodes.value.hostname
      user              = nodes.value.user
      role              = nodes.value.roles
      ssh_key           = nodes.value.ssh_key
    }
  }
  upgrade_strategy {
    drain                        = false
    max_unavailable_controlplane = "1"
    max_unavailable_worker       = "10%"
  }

  kubernetes_version = var.rke.kubernetes_version
}
验证说明
  • 改完直接跑terraform plan或者terraform apply就能正常生成RKE节点配置,不会再出for_each相关的报错。
  • 配置里的ssh_key、user这类敏感字段还是会被Terraform自动隐藏,不会在执行日志里明文打印,不会泄露敏感信息。
  • 选hostname字段(也就是EC2实例ID)当map的键是因为这个值全局唯一,不会出现键冲突导致的迭代报错。
  • 如果后续可以升级Terraform版本到1.2.x及以上,这个敏感集合迭代的bug已经被官方修复,哪怕直接传列表类型的敏感值也能正常处理。

内容的提问来源于stack exchange,提问作者sethu ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:51:19