Назад | Перейти на главную страницу

Terraform заставляет новые ресурсы при каждом применении

Я делаю небольшую виртуальную машину в Google Cloud, с одним базовым образом диска и хотите управлять моей инфраструктурой GCP с помощью HashiCorp's Terraform Вот базовый код 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?

Общее решение этого класса проблем - это ignore_changes настройка жизненного цикла, из-за которой Terraform игнорирует изменения определенных атрибутов при создании плана.

resource "google_compute_disk" "blog" {
  image = "ubuntu-1604-lts"

  lifecycle {
    ignore_changes = ["image"]
  }
}

При этом Terraform не будет автоматически планировать замену диска, когда image изменения. если ты делать хотите заменить диск на новый образ, необходимо вручную его испортить:

$ terraform taint google_compute_disk.blog

Это помечает экземпляр как «испорченный» в состоянии, что означает, что следующий план будет включать в себя шаг по уничтожению диска и созданию нового на его месте. Поскольку экземпляр затем использует этот диск, план также обновит или заменит его при необходимости.