【发布时间】: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