【问题标题】:Tell Terraform not to destroy and create when updating a null_resource告诉 Terraform 在更新 null_resource 时不要销毁和创建
【发布时间】:2021-11-01 02:46:14
【问题描述】:

我有一个null_resource,用于安装/卸载 Kubernetes YAML 清单,如下所示:

resource "null_resource" "manifest_provisioner" {
  count = var.enabled ? 1 : 0

  triggers = {
    manifest_file = <actual_content_of_the_yaml_manifest>
  }

  # Create-time provisioner
  provisioner "local-exec" {
    command = "kubectl apply -f -<<EOF\n${self.triggers.manifest_file}\nEOF"
  }

  # Destroy-time provisioner
  provisioner "local-exec" {
    when = destroy
    command = "kubectl delete -f -<<EOF\n${self.triggers.manifest_file}\nEOF"
  }
}

添加新清单或要求删除清单时,资源按预期工作。

但是,每当我想更新现有清单时,Terraform 会先销毁然后创建资源,这意味着更新总是会导致完全删除 Kubernetes 对象,这是有问题的。

如何指示此资源仅在更新现有资源时运行创建时配置程序?

【问题讨论】:

  • 您的 kubectl apply 命令应该已经是幂等的,那么为什么不让 Terraform 在每个 terraform apply 命令上运行它呢?您可以通过将触发器设置为使用uuid()timestamp() 来做到这一点,因此它在每次应用时都会更改。或者,您可能对 this alternate Kubernetes provider 感兴趣,它允许您使用原始清单文件,而不是在 HCL 中重写它们,如果这是您试图避免但仍希望 Terraform 用于其他事情的情况。

标签: kubernetes terraform


【解决方案1】:

正如@ydaetskcoR 在评论中所建议的那样,您可以使用uuid()timestamp() 来始终应用更改。

如果不选择terraform kubernetes provider 的原因不是您正在部署的资源无法获得支持,您可以使用kubectl provider,这应该很容易为您提供帮助。

【讨论】:

    【解决方案2】:

    when = create 添加到您的kubectl apply.. 供应商

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2021-11-28
      • 2015-07-15
      • 1970-01-01
      相关资源
      最近更新 更多