使用 for_each 从实例中检索 IP 地址

Retrieve IP address from instances using for_each

我有这个脚本,效果很好。它使用 sepcified 标签创建了 3 个实例,以便轻松识别它们。但问题是我想在代码中添加一个远程执行供应商(目前已评论)以安装一些软件包。如果我使用的是计数,我可以遍历它以对所有实例执行远程执行。我不能使用计数,因为我必须使用 for_each 来遍历本地列表。由于计数和 for_each 不能一起使用,我如何遍历实例以检索它们的 IP 地址以用于远程执行配置程序。

在数字海洋和 AWS 上,我能够使用 host = "${self.public_ip}" 让它工作 但它不适用于 vultr 并给出 Unsupported attribute error

instance.tf

resource "vultr_ssh_key" "kubernetes" {
  name       = "kubernetes"
  ssh_key = file("kubernetes.pub")
}

resource "vultr_instance" "kubernetes_instance" {
    for_each = toset(local.expanded_names)
    plan = "vc2-1c-2gb"
    region = "sgp"
    os_id = "387"
    label = each.value
    tag = each.value
    hostname = each.value
    enable_ipv6 = true
    backups = "disabled"
    ddos_protection = false
    activation_email = false
    ssh_key_ids = [vultr_ssh_key.kubernetes.id]

  /* connection {
    type        = "ssh"
    user        = "root"
    private_key = file("kubernetes")
    timeout     = "2m"
    host        = vultr_instance.kubernetes_instance[each.key].ipv4_address
  }

  provisioner "remote-exec" {
    inline = "sudo hostnamectl set-hostname ${each.value}"
  } */
}

locals {
  expanded_names = flatten([
    for name, count in var.host_name : [
      for i in range(count) : format("%s-%02d", name, i + 1)
    ]
  ])
}

provider.tf

terraform {
  required_providers {
    vultr = {
      source = "vultr/vultr"
      version = "2.3.1"
    }
  }
}
provider "vultr" {
  api_key = "***************************"
  rate_limit = 700
  retry_limit = 3
}

variables.tf

variable "host_name" {
  type = map(number)
  default = {
    "Manager" = 1
    "Worker"  = 2
  }
}

您要查找的 属性 称为 main_ip 而不是 ip4_address 或类似名称。具体可通过 connection 区块中的 self.main_ip 访问。