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
相关产品推荐
相关产品推荐

