Terraform 改变计数时的地形周期

Terraform 改变计数时的地形周期,terraform,Terraform,我有一些资源的count由一个变量参数化。这用于创建VM资源以及null\u资源s,例如在其上运行部署脚本。当我将计数的值从2减少到1并应用时,我得到一个错误 Terraform执行计划,无任何投诉。但当我应用时,它告诉我有一个循环: 错误:周期:空\u资源。网络\u连接\u配置[7](销毁),空\u资源。网络\u连接\u配置[8](销毁),空\u资源。网络\u连接\u配置[3](销毁),空\u资源。网络\u连接\u配置[4](销毁),空\u资源。网络\u连接\u配置[0](销毁),空资源。网络

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

Terraform执行
计划
,无任何投诉。但当我应用时,它告诉我有一个循环:

错误:周期:空\u资源。网络\u连接\u配置[7](销毁),空\u资源。网络\u连接\u配置[8](销毁),空\u资源。网络\u连接\u配置[3](销毁),空\u资源。网络\u连接\u配置[4](销毁),空\u资源。网络\u连接\u配置[0](销毁),空资源。网络连接配置[6](销毁),空资源。网络连接配置[1](销毁),空资源。网络连接配置[9](销毁),空资源。网络连接配置[2](销毁),空资源。网络连接配置[10](销毁),hcloud\u服务器。卡夫卡[2](销毁),local.all_machine_ips,null_resource.network_connection_配置(准备状态),null_resource.network_connection_配置[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
时,调试日志不会显示任何错误

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


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

我在0.12.x中遇到了类似的问题-我在
aws_实例
资源中调用了一个provisioner,它给出了与增加资源计数时相同的错误


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

注意,即使您没有明确指定一个
依赖于,当您将一个资源或数据的输出映射为另一个资源的输入时,仍然可以提取隐式依赖项。您也可以为此发布MCVE,因为错误消息只引用了两个资源。谢谢。我本来想提的,但不想把问题提得太长。我可以添加它,但是如果我添加这些项目的所有依赖项,我将得到基本相同的文件。我看看我能做些什么。有了这个级别的信息
null\u资源。文件\u sync
看起来像是罪魁祸首。谢谢。我同意。问题是,这一切都是如此耦合,以至于删除它需要删除大量其他空_资源。在这一点上,发生了巨大的变化,我需要用真实的虚拟机建立一个全新的项目,以测试MVCE是否仍然适用。如果在
计划中检测到错误
这将是一个很大的错误!恐怕我采取了怯懦的方式,注释掉了
null\u资源
,让它们被销毁(这是安全的,因为它们实际上并不存在)。对于那些不存在的资源,我可以安全地更改计数以缩小“真实”资源的规模。不令人满意,但我怀疑它可能与/