Terraform 0.14.8 null_resource无理由频繁触发资源替换问题求助
问题原因
- 配置引用错误:你定义的模板数据源为
data.template_file.app_crds,但local-execprovisioner中实际引用的是未在配置中声明的data.template_file.aws_ingress_controller_crds,两者不一致会导致Terraform无法正确关联依赖关系,计划阶段无法确定triggers的最终值,进而每次都判定需要重建资源。 - 老旧数据源的兼容性问题:
template_file是Terraform 0.12版本就已标记弃用的数据源,在0.14版本中存在已知的渲染一致性问题,处理文件换行符、特殊字符时容易出现渲染结果和预期不符的情况,导致哈希计算值和状态文件中存储的不一致。 - 模板依赖动态值:如果你的
app_crds.yaml模板中引用了其他需要在apply阶段才能确定值的资源属性(比如其他资源的id、端点等),那么plan阶段无法提前计算出渲染后的内容哈希,会显示known after apply,触发强制重建。
可行解决方案
- 修正配置引用错误:将
local-exec中引用的模板数据源改为实际定义的data.template_file.app_crds.rendered,保证triggers监听的模板和实际部署的模板一致。 - 替换弃用的
template_file数据源:直接使用官方推荐的templatefile内置函数计算渲染后内容的哈希,不需要额外定义数据源,示例配置如下:
resource "null_resource" "app_crds_deploy" { triggers = { manifest_sha1 = sha1(templatefile("${path.module}/templates/app_crds.yaml", {})) } provisioner "local-exec" { command = <<EOT kubectl apply -f - <<EOF ${templatefile("${path.module}/templates/app_crds.yaml", {})} EOF EOT } }
如果模板需要传入变量,直接填充templatefile第二个参数的对象即可。
- 统一文件换行符规范:在仓库的
.gitattributes文件中添加*.yaml text eol=lf规则,避免跨操作系统编辑、CI/CD拉取代码时自动转换换行符导致哈希值变化。 - 改用原生Kubernetes资源部署:替换
null_resource+local-exec的方案,直接使用Kubernetes Provider的kubernetes_manifest资源部署YAML manifest,该方案是官方原生支持的,不需要依赖本地kubectl工具,生命周期管理更规范,也不会出现无意义的强制重建问题。
内容的提问来源于stack exchange,提问作者sebastian
相关产品推荐
相关产品推荐

