【问题标题】:Terraform cycle when altering a count更改计数时的 Terraform 循环
【发布时间】:2019-10-26 04:13:06
【问题描述】:

我有一些资源,其count 由变量参数化。这用于创建 VM 资源以及 null_resources,例如在它们上运行部署脚本。当我将计数值从 2 减少到 1 并应用时,出现错误。

Terraform 执行plan 没有任何投诉。但是当我apply时,它告诉我有一个循环:

错误:循环:null_resource.network_connection_configuration[7](销毁)、null_resource.network_connection_configuration[8](销毁)、null_resource.network_connection_configuration[3](销毁)、null_resource.network_connection_configuration[4](销毁)、null_resource.network_connection_configuration [0](销毁),null_resource.network_connection_configuration[6](销毁),null_resource.network_connection_configuration[1](销毁),null_resource.network_connection_configuration[9](销毁),null_resource.network_connection_configuration[2](销毁),null_resource.network_connection_configuration [10](销毁)、hcloud_server.kafka[2](销毁)、local.all_machine_ips、null_resource.network_connection_configuration(准备状态)、null_resource.network_connection_configuration[5](销毁)

这是文件的相关部分:

variable kafka_count {
  default = 3
}

resource "hcloud_server" "kafka" {
  count       = "${var.kafka_count}"
  name        = "kafka-${count.index}"
  image       = "ubuntu-18.04"
  server_type = "cx21"
}

locals {
  all_machine_ips = "${hcloud_server.kafka.*.ipv4_address)}"
}

resource "null_resource" "network_connection_configuration" {
  count = "${length(local.all_machine_ips)}"

  triggers = {
    ips = "${join(",", local.all_machine_ips)}"
  }

  depends_on = [
    "hcloud_server.kafka"
  ]

  connection {
    type        = "ssh"
    user        = "deploy"
    host        = "${element(local.all_machine_ips, count.index)}"
    port        = 22
  }

// ... some file provisioners
}

当我尝试使用可视化找到循环时:

terraform graph -verbose -draw-cycles

没有可见的循环。

当我使用TF_LOG=1 时,调试日志不显示任何错误

所以问题是我可以增加计数但不能减少它。我不想手动破解文件,因为这意味着我将来无法缩小!我正在使用 Terraform v0.12.1。

有什么策略可以调试这种情况吗?

【问题讨论】:

  • 请注意,即使您没有明确指定depends_on,当您将一个资源或数据的输出映射为另一个资源的输入时,您仍然可以获取隐式依赖关系。您也可以为此发布 MCVE,因为错误消息仅引用两个资源。
  • 谢谢。我正要提到这一点,但不想让这个问题太长。我可以添加它,但如果我添加这些项目的所有依赖项,我最终会得到基本相同的文件。我会看看我能做什么。
  • 有了这个级别的信息null_resource.files_sync 看起来像是罪魁祸首。
  • 谢谢。我同意。问题是它是如此耦合,以至于删除它需要删除许多其他 null_resources。那时已经发生了很大的变化,以至于我需要使用真实的 VM 建立一个全新的项目来测试 MVCE 是否仍然适用。如果在plan 中检测到错误,这将容易得多!
  • 恐怕我采取了懦弱的方式并注释掉了null_resources 让他们被摧毁(这是安全的,因为他们并不真正存在)。对于那些不存在的,我可以安全地更改计数以缩减“真实”资源。不满意,但我怀疑它可以连接到github.com/hashicorp/terraform/issues/21662/stackoverflow.com/questions/56514719/…

标签: terraform


【解决方案1】:

我在 0.12.x 中遇到了类似的问题 - 我在 aws_instance 资源中调用了一个配置程序,这与增加资源计数时出现的错误相同。

我通过使用 self 对象 (self.private_ip) 来引用资源,而不是使用 count.index 或 element()。

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多