【问题标题】:Cannot destroy one module using Terraform destroy无法使用 Terraform destroy 销毁一个模块
【发布时间】:2021-04-05 11:12:45
【问题描述】:

我使用 Terraform 模块创建了一些实例:

resource "google_compute_instance" "cluster" {
  count = var.num_instances
  name = "redis-${format("%03d", count.index)}"
  ...
  attached_disk {
    source = 
google_compute_disk.ssd[count.index].name
  }
}

resource "google_compute_disk" "ssd" {
  count   = var.num_instances
  name    = "redis-ssd-${format("%03d", count.index)}"
  ...
  zone    = data.google_compute_zones.available.names[count.index % length(data.google_compute_zones.available.names)]

}

resource "google_dns_record_set" "dns" {
  count   = var.num_instances
 name    = "${var.dns_name}-${format("%03d", 
count.index +)}.something.com"
  ...

  managed_zone = XXX

  rrdatas = [google_compute_instance.cluster[count.index].network_interface.0.network_ip]
}

module "test" {
  source = "/modules_folder"
  num_instances             = 2
    ...
}

如何销毁其中一个实例及其依赖项,例如 instance[1]+ssd[1]+dns[1]?我尝试使用

只销毁一个模块
terraform destroy -target module.test.google_compute_instance.cluster[1]

但它不会破坏 ssd[1] 并且它试图破坏两个 dns:

module.test.google_dns_record_set.dns[0] module.test.google_dns_record_set.dns[1]

如果我跑

terraform destroy -target module.test.google_compute_disk.ssd[1]

它试图破坏实例和 dns:

module.test.google_compute_instance.cluster[0] module.test.google_compute_instance.cluster[1]

module.test.google_dns_record_set.dns[0]

module.test.google_dns_record_set.dns[1]

也是。

如何只销毁instance[1]、ssd[1]和dns[1]?我觉得我的代码可能有一些错误,也许 count.index 有一些问题会触发一些意外的破坏?

我使用:Terraform v0.12.29

【问题讨论】:

  • 在尝试销毁之前terraform state list 的输出将是说明性的。
  • 如果要销毁模块的资源,为什么不针对模块呢?
  • @MattSchuchard:我确实瞄准了。在帖子中查看我的命令:terraform destroy -target module.test.google_compute_instance.cluster[1]

标签: terraform terraform0.12+


【解决方案1】:

我有点困惑你为什么要terraform destroy 你通常想做的是递减num_instances 然后terraform apply

如果您执行terraform destroy,则下一个terraform apply 将使您立即回到您在 terraform 源中配置的任何内容。

如果没有更多的源代码来查看发生了什么有点困难 - 但是在模块上设置 num_instances 并在模块的资源中使用它感觉很不稳定。

我建议您升级 terraform 并直接在模块上而不是在模块内使用 countfor_each。 (这是在 terraform 0.13.0 中引入的)见 https://www.hashicorp.com/blog/terraform-0-13-brings-powerful-meta-arguments-to-modular-workflows

【讨论】:

  • 用例是:假设我使用上述 terraform 创建的实例之一有问题,我想销毁它并重新启动一个新实例。我不认为我可以使用自动缩放来做到这一点,因为在启动实例后,我需要手动运行几个 redis-cli 命令来将新节点加入 redis 集群并使用 hash-slot 对其进行重新分片。这就是我想使用上述 terraform 手动销毁并重新启动它的方式,以便它在我的控制范围内。
【解决方案2】:

按资源删除资源:

terraform destroy -target RESOURCE_TYPE.NAME -target RESOURCE_TYPE2.NAME


resource "resource_type" "resource_name" {
   ...
}

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2017-09-06
    • 2021-06-07
    • 2019-06-16
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多