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

Terraform生成文件后,如何通过同一份代码获取文件列表?

问题分析与解决方案

你的问题核心在于Terraform的函数执行时机和资源生命周期不匹配:

  • fileset是Terraform内置函数,所有函数都会在规划(plan)阶段执行,此时null_resource.generate_files还未运行(它要到应用(apply)阶段才会执行脚本生成文件),所以fileset找不到任何.txt文件,返回空数组。
  • terraform_data.files的input参数是在plan阶段确定的,apply阶段不会重新计算,哪怕后续文件生成了,input依然是空数组,这就是你访问output[0]时报错的原因。

可行解决方案

方案1:在文件生成脚本中直接输出列表,通过null_resource捕获

修改生成文件的null_resource,让脚本在生成文件后直接打印文件列表,然后通过null_resource的stdout属性获取结果:

locals {
  root_path = "./your-target-dir" # 替换为你的目标目录
}

resource "null_resource" "generate_files" {
  provisioner "local-exec" {
    command = <<EOF
# 替换成你的文件生成命令
touch ${local.root_path}/file1.txt ${local.root_path}/file2.txt
# 生成文件后,输出目录下的所有txt文件
ls -1 ${local.root_path}/*.txt
EOF
    interpreter = ["bash", "-c"]
  }
}

output "all_text_files" {
  value = split("\n", trimspace(null_resource.generate_files.stdout))
}

output "text_one" {
  # 用element函数避免数组为空时报错,可设置默认值
  value = element(split("\n", trimspace(null_resource.generate_files.stdout)), 0, "")
}

方案2:用terraform_data的local-exec在apply阶段获取文件列表

利用terraform_data的provisioner在apply阶段执行命令(此时文件已生成),通过triggers捕获输出结果:

locals {
  root_path = "./your-target-dir" # 替换为你的目标目录
}

resource "null_resource" "generate_files" {
  provisioner "local-exec" {
    command = "touch ${local.root_path}/file1.txt ${local.root_path}/file2.txt" # 替换为你的生成命令
  }
}

resource "terraform_data" "files" {
  depends_on = [null_resource.generate_files]

  provisioner "local-exec" {
    command = "ls -1 ${local.root_path}/*.txt"
    interpreter = ["bash", "-c"]
  }

  # 用triggers捕获stdout,triggers会在apply阶段更新
  triggers = {
    file_list = trimspace(self.stdout)
  }
}

output "all_text_files" {
  value = split("\n", terraform_data.files.triggers.file_list)
}

output "text_one" {
  value = element(split("\n", terraform_data.files.triggers.file_list), 0, "")
}

关键注意点

  • 别用Terraform内置函数(如fileset、fileexists)读取apply阶段才生成的文件,这类函数仅在plan阶段执行,无法感知apply阶段的文件变化。
  • 使用element函数时建议添加默认值(第三个参数),防止文件列表为空时出现索引越界错误,也可以用try函数容错:try(split("\n", ...)[0], "")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:47:46