Terraform强制每个应用程序都有新的资源

我正在Google Cloud中制作一个小型虚拟机,只有一个磁盘基础映像,并希望通过HashiCorp的Terraform来pipe理我的GCP。下面是我正在运行的基本TF代码:

resource "google_compute_disk" "blog" { image = "ubuntu-1604-lts" } resource "google_compute_instance" "blog-vm" { disk { disk = "${google_compute_disk.blog.id}" auto_delete = false } } 

当我tf apply ,它第一次正常工作。 但随后的计划要重build磁盘,从而虚拟机本身。

 -/+ google_compute_disk.blog image: "ubuntu-1604-xenial-v20170619a" => "ubuntu-1604-lts" (forces new resource) 

我的目标是在图像创build时select最新的ubuntu-lts模板,但是如果创build则保留磁盘。 这在Terraform中可能吗?

这类问题的一般解决scheme是ignore_changes生命周期设置,这会导致Terraform在创build计划时忽略对特定属性的更改。

 resource "google_compute_disk" "blog" { image = "ubuntu-1604-lts" lifecycle { ignore_changes = ["image"] } } 

有了这个,Terraform将不会自动计划更换镜像时更换磁盘。 如果您想要replace新镜像的磁盘,则需要手动清除它:

 $ terraform taint google_compute_disk.blog 

这标志着该州的“污染”,这意味着下一个计划将包括一个步骤,摧毁磁盘,并创造一个新的地方。 由于实例会使用该磁盘,因此该计划也将根据需要进行更新或replace。