Terraform 在没有任何变化时检测到变化

MrK*_*tts 0 terraform

我正在使用 terraform v1.1.3,每当我运行terraform plan它时,它都会声明我已进行更改,即使本地或远程没有任何更改。例如,如果我立即运行terraform applythen terraform plan,它会声明对象已在 Terraform 之外发生更改,并强制替换我的实例。

  # module.database.oci_core_instance.instance[0] has changed
  ~ resource "oci_core_instance" "minstance" {
      + extended_metadata                   = {}
        id                                  = "ocid1.instance.oc1.me-jeddah-1.anvgkljrnghkmsacizo3ubuejydotfi7qz45if32x2e3b55mhirvrvpiw7nq"
Run Code Online (Sandbox Code Playgroud)

为什么?

resource "oci_core_instance" "instance" {
  availability_domain                = random_shuffle.compute_ad.result[count.index % length(random_shuffle.compute_ad.result)]
  compartment_id                      = var.compartment_id
  shape                               = var.instance_shape
  freeform_tags                       = var.freeform_tags 
  shape_config {
        memory_in_gbs = 16 
        ocpus         = 1  
    }
  source_details {
    source_type = "image"
    source_id   = lookup(data.oci_core_images.compute_images.images[0], "id") 
   
  }
  metadata = { 
      ssh_authorized_keys = file(var.ssh_public_key) 
      user_data           = data.template_cloudinit_config.nodes.rendered
  }
  count = var.num_nodes

  depends_on = [
    oci_core_volume.volume_1
  ]
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*kke 5

这可能是因为数据资源块在应用之前不会被评估,在计划期间它不知道里面有什么

 data.template_cloudinit_config.nodes.rendered
Run Code Online (Sandbox Code Playgroud)

为了安全起见,它将其标记为更改

如果您 1000% 确定这不会改变,您可以添加

lifecycle {
    ignore_changes = [
        extended_metadata
    ]
  }
Run Code Online (Sandbox Code Playgroud)

但要非常小心,如果元数据将来确实发生变化,它将根本不适用。