如何从Terraform中的对象列表中获取对象?

vot*_*roe 6 terraform

我有以下对象变量列表:

variable "objects" {
  type = "list"
  description = "list of objects
  default = [
      {
        id = "name1"
        attribute = "a"
      },
      {
        id = "name2"
        attribute = "a,b"
      },
      {
        id = "name3"
        attribute = "d"
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如何获取id =“ name2”的元素?

JRo*_*ert 30

您可以使用以下表达式获得 id="name2" 的地图:

var.objects[index(var.objects.*.id, "name2")]
Run Code Online (Sandbox Code Playgroud)

要进行快速测试,请在 terraform 控制台中运行以下单行:

[{id = "name1", attribute = "a"}, {id = "name2", attribute = "a,b"}, {id = "name3", attribute = "d"}][index([{id = "name1", attribute = "a"}, {id = "name2", attribute = "a,b"}, {id = "name3", attribute = "d"}].*.id, "name2")]
Run Code Online (Sandbox Code Playgroud)

  • 我想这应该是答案;`var.objects.*.id` 中的 splat 很有用,谢谢! (2认同)

Row*_*obs 7

如果您想从 IP 和主机名列表中创建一组vsphere_virtual_machine 资源,我可能会尝试以下操作:

resource "vsphere_virtual_machine" "vm" {
  count = "${length(var.virtual_machine_ips)}"

  // the rest of your virtual machine config
  // such as template ID, CPUs, memory, disks...

  vapp {
    properties {
      // your vApp properties may vary based on what your template actually is.
      // these examples are for the CoreOS template.

      "guestinfo.hostname" = "${index(var.virtual_machine_hostnames, count.index)}"
      "guestinfo.interface.0.ip.0.address" = "${index(var.virtual_machine_ips, count.index)}"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

(这是假设您正在通过vApp config设置 IP 和主机名;如果不是,则它可能看起来相似,但将主机名和 IP 地址放在vsphere_virtual_machine.vapp.properties块之外的某处。)

terraform.tfvars文件可能是这样的:

virtual_machine_ips = ["10.0.2.2", "10.0.2.3", "10.0.2.4"]
virtual_machine_hostnames = ["banana", "pineapple", "coconut"]
Run Code Online (Sandbox Code Playgroud)

这是完成您尝试执行的操作的一种更简单、更惯用的方法,因为在 Terraform 插值语法中处理复杂对象并不容易。


Oll*_*tch 6

您不能嵌套多个级别的方括号以在数据结构中获取n个级别。但是,您可以使用插值功能来检索此类值。在这种情况下,您将要使用查找功能从地图上检索值,该值本身已使用方括号进行了访问,看起来像这样...

${lookup(var.objects[1], "id")}
Run Code Online (Sandbox Code Playgroud)

Rowan是正确的,在当前版本的Terraform中很难使用复杂的数据结构。但是,看起来可以很快就可以在这一领域获得更好的支持。即将发布的0.12版将包含丰富的类型,从而增加了列表和地图的功能。

  • 谢谢,所以在0.12中我们应该能够做类似`var.objects [1] .id`的事情? (3认同)