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

