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

Terraform读取文件特定模式及文件变更感知问题求助

解决Terraform感知input.txt变更并重新执行脚本的问题

你不需要自定义Provider,用Terraform自带的功能就能解决这个问题,下面是两种可行方案:

方案一:给null_resource添加触发器(triggers)

null_resource默认不会自动重新执行,除非通过triggers参数指定依赖的资源或文件内容变化。你可以基于input.txt的哈希值创建触发器,当文件内容改变时,哈希值变化,Terraform就会重新执行这个null_resource。

修改后的main.tf:

resource "null_resource" "demo_null_res" {
  triggers = {
    input_file_hash = filemd5("${path.module}/input.txt")
  }

  provisioner "local-exec" {
    command = "./test.sh"
  }
}
  • filemd5函数会计算input.txt的MD5哈希,文件内容任何变化都会导致哈希值改变,触发null_resource重新运行。
  • 也可以用filesha256代替filemd5,安全性更高,效果一致。

方案二:使用external数据源(更符合Terraform声明式风格)

如果你的目标是处理文件内容并提取结果供Terraform后续使用,external数据源比local-exec更合适,它能执行脚本并返回结构化数据,同时自动跟踪输入的变化。

步骤1:修改test.sh为返回JSON格式

external要求脚本输出必须是合法的JSON,调整脚本如下:

#!/bin/bash
output=""
while read -r line; do
  if [[ $line == *"ERROR"* ]]; then
    rr=$(echo "$line" | cut -d ':' -f 4)
    first=$(echo "$rr" | cut -d ' ' -f 1)
    cleaned_first=${first/[a-z]*/''}
    output+="$cleaned_first"$'\n'
  fi
done < input.txt

# 将结果转为JSON输出
echo "{\"extracted_values\": \"$output\"}"

步骤2:配置external数据源

在main.tf中添加:

data "external" "process_input" {
  program = ["./test.sh"]

  # 跟踪input.txt的变化,文件变更时重新执行脚本
  depends_on = [
    filemd5("${path.module}/input.txt")
  ]
}

# 可以在后续资源中使用提取出的结果
output "extracted_errors" {
  value = data.external.process_input.result["extracted_values"]
}
  • depends_on关联input.txt的哈希,确保文件变化时重新执行脚本。
  • 脚本返回的JSON会被Terraform解析,你可以通过data.external.process_input.result访问提取出的值,方便后续使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:40:35