Terraform模板遍历键值对及template_file传map报错解决方案
问题根因
报错核心原因是template_file属于已废弃的旧版数据源,归属独立的hashicorp/template provider,该数据源要求传入vars的所有值必须为字符串类型,不支持map、list这类复杂结构,因此传入原生map时会触发类型不匹配错误;若直接传入字符串,模板内的for循环需要遍历可迭代集合,字符串无法满足遍历要求,就会触发第二个报错。
解决方案
直接替换为Terraform内置的templatefile函数即可。该函数从Terraform 0.12版本开始内置支持,原生兼容map、list等任意复杂类型变量,和官方示例用法完全匹配,无需额外安装第三方provider。
修改后的Terraform配置代码:
terraform { required_version = "~> 1.2" backend "local" { path = "./terraform.tfstate" } } # 无需定义template_file数据源,直接调用内置函数渲染模板 output "rendered" { value = templatefile("${path.module}/example.yml.tftpl", { map_of_params = { "aaa_env" = "aaa_key" "bbb_env" = "bbb_key" } }) }
原有模板文件example.yml.tftpl不需要做任何调整,保留原有遍历逻辑即可正常渲染:
secrets: %{ for env, key in map_of_params } - name: "${env}" valueFrom: "${key}" %{ endfor ~}
其他说明
- 旧版
template_file数据源官方已停止维护,所有新编写的配置都应优先使用内置templatefile函数,二者模板语法完全一致,迁移无额外成本。 - 若因特殊历史原因必须使用
template_file数据源(不推荐),只能提前将map序列化为JSON字符串传入,再在模板内通过JSON解码函数转回map结构后遍历,该写法冗余且易出现格式兼容问题,无特殊约束不要采用。
内容的提问来源于stack exchange,提问作者rzlvmp
相关产品推荐
相关产品推荐

