Digitalocean液滴供应:周期错误

发布于 2025-01-27 13:34:06 字数 786 浏览 3 评论 0原文

我想在使用远程供应商在每个软件上安装一些软件时创建多个液滴。我有以下代码:

resource "digitalocean_droplet" "server" {
  for_each = var.servers

  name   = each.key
  image  = each.value.image
  size   = each.value.size
  region = each.value.region
  ssh_keys = [
    data.digitalocean_ssh_key.terraform.id
  ]
  tags = each.value.tags

  provisioner "remote-exec" {
    inline = [
      "mkdir -p  /tmp/scripts/",
    ]

    connection {
      type        = "ssh"
      user        = "root"
      private_key = file("${var.ssh_key}")
      host        = digitalocean_droplet.server[each.key].ipv4_address
    }
  }

这始终会导致以下错误:

错误:循环:digitalocean_droplet.server [“ server2”],digitalocean_droplet.server [“ server1”]

我理解这是指循环依赖性,但如何在每个服务器上安装软件。

I want to create multiple droplets while installing some software onto each of them using a remote provisioner. I have the following code:

resource "digitalocean_droplet" "server" {
  for_each = var.servers

  name   = each.key
  image  = each.value.image
  size   = each.value.size
  region = each.value.region
  ssh_keys = [
    data.digitalocean_ssh_key.terraform.id
  ]
  tags = each.value.tags

  provisioner "remote-exec" {
    inline = [
      "mkdir -p  /tmp/scripts/",
    ]

    connection {
      type        = "ssh"
      user        = "root"
      private_key = file("${var.ssh_key}")
      host        = digitalocean_droplet.server[each.key].ipv4_address
    }
  }

This always results in the following error:

Error: Cycle: digitalocean_droplet.server["server2"], digitalocean_droplet.server["server1"]

I understand this refers to a circular dependency but how to install the software on each server.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世界和平 2025-02-03 13:34:06

如我的评论中所述,这里的问题是您正在创建一个环状依赖性,因为您在其自己的块中以其名称来引用资源。引用[1]:

引用创建依赖关系,并在其自己的块中逐个名称逐个名称会创建一个依赖性周期。

要解决此问题,您可以使用特殊关键字self来引用所创建的同一实例:

resource "digitalocean_droplet" "server" {
  for_each = var.servers

  provisioner "remote-exec" {
    inline = [
      "mkdir -p  /tmp/scripts/",
    ]

    connection {
      type        = "ssh"
      user        = "root"
      private_key = file("${var.ssh_key}")
      host        = self.ipv4_address # <---- here is where you would use the self keyword
    }
  }

[1] https://www.terraform.io/language/ranguage/resources/proviseers/proviseers/connection#the-self-object-self-object

As mentioned in my comment, the issue here is that you are creating a cyclic dependency because you are referring a resource by its name within its own block. To quote [1]:

References create dependencies, and referring to a resource by name within its own block would create a dependency cycle.

To fix this, you can use a special keyword self to reference the same instance that is getting created:

resource "digitalocean_droplet" "server" {
  for_each = var.servers

  provisioner "remote-exec" {
    inline = [
      "mkdir -p  /tmp/scripts/",
    ]

    connection {
      type        = "ssh"
      user        = "root"
      private_key = file("${var.ssh_key}")
      host        = self.ipv4_address # <---- here is where you would use the self keyword
    }
  }

[1] https://www.terraform.io/language/resources/provisioners/connection#the-self-object

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文