terraform 多值输出

terraform multiple value output

我通过 remote-exec provisioner 从 TF 公共资源创建了多个 Digital Ocean Droplet resource (VM) using Terraform(TF) and set every VM random string password

resource "digitalocean_droplet" "testvm" {
  count    = var.count_of_droplets
  image    = "ubuntu-20-04-x64"
  name     = "testvm-${count.index}"
  region   = "nyc3"
  size     = "s-1vcpu-1gb"
  ssh_keys = [data.digitalocean_ssh_keys.keys.ssh_keys[0].id]
  provisioner "remote-exec" {

    connection {
      type        = "ssh"
      user        = "root"
      private_key = file("${var.my_ssh_private_key}")
      host        = self.ipv4_address
    }
    inline = [
      "echo '${var.os_user}:${random_string.password[count.index].result}' | sudo chpasswd",
      "sed -i '/PermitRootLogin/c PermitRootLogin yes' /etc/ssh/sshd_config",
      "systemctl restart sshd"
    ]
  }
  tags = ["dev"]
}

和随机密码生成器:

resource "random_string" "password" {
  count            = var.count_of_droplets
  length           = 16
  special          = true
  override_special = "_%@"
}

我通过 Terraform 输出为每个创建的名称为 VM 的 VM 打印 public ip:

output "droplet_ip_addresses" {
  value =    {
      for droplet in digitalocean_droplet.testvm :
      droplet.name => droplet.ipv4_address
    }
}

输出:

droplet_ip_addresses = {
   - testvm-0 = "1.1.1.1"
   - testvm-1 = "2.2.2.2"
}

如何将生成的密码添加到上面的输出中?喜欢:

droplets_data = {
   - testvm-0 = "1.1.1.1" = "5j1dYBZzqDd30yhJ"
   - testvm-1 = "2.2.2.2" = "6R%wj4zebwd9FiAt"
}

由于通过 count 创建的资源会生成一个对象列表,您可以使用两个资源列表的索引将它们映射在一起。

类似

output "droplets_data" {
  value = {
    for index, droplet in digitalocean_droplet.testvm :
      droplet.name => "'${droplet.ipv4_address}' = '${random_string.password[index].result}'"
  }
}

将输出如下所示的内容:

droplets_data = {
  "testvm-0" = "'1.1.1.1' = 'KIUNOQ9YOtCk2aZQ'"
  "testvm-1" = "'2.2.2.2' = 'aTPOtb4%RCcfNo@R'"
}

不过,可能更简洁的方法是创建具有 ippassword 属性的对象。

类似于:

output "droplets_data" {
  value = {
    for index, droplet in digitalocean_droplet.testvm :
      droplet.name => {
        ip = droplet.ipv4_address
        password = random_string.password[index].result
      }
  }
}

这将产生:

droplets_data = {
  "testvm-0" = {
    "ip" = "1.1.1.1"
    "password" = "KIUNOQ9YOtCk2aZQ"
  }
  "testvm-1" = {
    "ip" = "2.2.2.2"
    "password" = "aTPOtb4%RCcfNo@R"
  }
}