我有以下对象变量列表:
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)
如果您想从 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 插值语法中处理复杂对象并不容易。
您不能嵌套多个级别的方括号以在数据结构中获取n个级别。但是,您可以使用插值功能来检索此类值。在这种情况下,您将要使用查找功能从地图上检索值,该值本身已使用方括号进行了访问,看起来像这样...
${lookup(var.objects[1], "id")}
Run Code Online (Sandbox Code Playgroud)
Rowan是正确的,在当前版本的Terraform中很难使用复杂的数据结构。但是,看起来可以很快就可以在这一领域获得更好的支持。即将发布的0.12版将包含丰富的类型,从而增加了列表和地图的功能。
| 归档时间: |
|
| 查看次数: |
7333 次 |
| 最近记录: |