我正在制作一个小型虚拟机谷歌云,使用一个磁盘基础映像,并希望使用 HashiCorp 的地形这是我正在运行的基本 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
,它第一次运行良好。但后续计划希望重建磁盘,从而重建虚拟机本身。
-/+ google_compute_disk.blog
image: "ubuntu-1604-xenial-v20170619a" =>
"ubuntu-1604-lts" (forces new resource)
我的目标是在创建映像时选择最新的 ubuntu-lts 模板,但如果创建了磁盘则保留原样。这在 Terraform 中可行吗?
答案1
这类问题的一般解决办法是ignore_changes
生命周期设置,使得 Terraform 在创建计划时忽略特定属性的改变。
resource "google_compute_disk" "blog" {
image = "ubuntu-1604-lts"
lifecycle {
ignore_changes = ["image"]
}
}
有了这个,Terraform 将不会在image
发生更改时自动计划更换磁盘。如果您做想要用新映像替换磁盘,就需要手动对其进行污染:
$ terraform taint google_compute_disk.blog
这会将实例标记为“已污染”状态,这意味着下一个计划将包括销毁磁盘并在其位置创建新磁盘的步骤。由于实例随后会使用该磁盘,因此该计划还将根据需要更新或替换该磁盘。