Terraform遍历JSON文件键生成指定文件的实现问题
使用Terraform遍历JSON生成指定命名文件的问题解决
问题概述
需要遍历固定格式的JSON文件,生成file1a、file2a、file2b三个文件。当前通过locals处理JSON时,仅能获取子对象内容而非键名,无法生成正确命名的文件,需构建包含file名称(如file1、file2)和对应字母标识(如a、b)的结构。
相关文件与代码示例
JSON源文件(files.json)
{ "file1": { "a": "content for file1a" }, "file2": { "a": "content for file2a", "b": "content for file2b" } }
现有Terraform代码(存在问题)
locals { file_data = jsondecode(file("files.json")) flattened_files = flatten([ for file in local.file_data : [ for content in file : { filename = "???" # 无法正确拼接file名称与字母标识 content = content } ] ]) } resource "local_file" "generated_files" { for_each = { for f in local.flattened_files : f.filename => f } filename = each.value.filename content = each.value.content }
当前错误表现
无法生成file1a这类符合预期的文件名,仅能获取子对象的内容值,无法关联file名称与字母标识。
预期输出
成功生成三个文件:
file1a:内容为content for file1afile2a:内容为content for file2afile2b:内容为content for file2b
解决方案
调整locals中的嵌套遍历逻辑,同时捕获父键名(file名称)和子键名(字母标识),具体代码如下:
locals { file_data = jsondecode(file("files.json")) flattened_files = flatten([ # 第一层遍历:捕获file名称(如file1)及其对应的子对象 for file_name, file_contents in local.file_data : [ # 第二层遍历:捕获字母标识(如a)及其对应的内容 for letter, content in file_contents : { filename = "${file_name}${letter}" content = content } ] ]) } resource "local_file" "generated_files" { for_each = { for f in local.flattened_files : f.filename => f } filename = each.value.filename content = each.value.content }
代码说明
- 第一层遍历通过
for file_name, file_contents in local.file_data,同时获取file的键名(如file1)和对应的子对象; - 第二层遍历通过
for letter, content in file_contents,获取子对象的字母标识(如a)和内容; - 使用
"${file_name}${letter}"拼接出目标文件名; - 通过
flatten将嵌套列表展开为一维结构,适配for_each的使用要求。
执行上述代码后,即可生成符合预期命名和内容的三个文件。
内容的提问来源于stack exchange,提问作者Ben Dyson
相关产品推荐
相关产品推荐

