我要输出创建的每个VM及其UUID,例如
data "vsphere_virtual_machine" "vms" {
count = "${length(var.vm_names)}"
name = "${var.vm_names[count.index]}"
datacenter_id = "12345"
}
output "vm_to_uuid" {
# value = "${data.vsphere_virtual_machine.newvms[count.index].name}"
value = "${data.vsphere_virtual_machine.newvms[count.index].id}"
}
我正在寻找的示例输出:
"vm_to_uuids":[
{
"name":"node1",
"id":"123456",
},
{
"name":"node2",
"id":"987654",
}
]
答案 0 :(得分:3)
在为输出 value 给出的表达式中使用通配符属性,以获取创建的VM的ID列表。 例如
output "vm_to_uuids" {
value = "${data.vsphere_virtual_machine.*.id}"
}
问题中提供的必需语法是一种豁免,在该豁免中,功能而不是形式。 编写提供该功能的terraform配置并不简单。 也许,我建议采用其他更简单的方法来输出相同的信息。
可以输出映射到ID的名称:
output "vm_to_uuids" {
value = "${zipmap(
data.vsphere_virtual_machine.*.name,
data.vsphere_virtual_machine.*.id)}"
}
名称和ID的映射可以按列方式输出:
output "vm_to_uuids" {
value = "${map("name",
data.vsphere_virtual_machine.*.name,
"id",
data.vsphere_virtual_machine.*.id)}"
}
可以按列方式输出名称和ID列表:
output "vm_to_uuids" {
value = "${list(
data.vsphere_virtual_machine.*.name,
data.vsphere_virtual_machine.*.id)}"
}
答案 1 :(得分:1)
您可以做的一件事(如果您确实想要该输出),请使用formatlist(format, args, ...)
data "vsphere_virtual_machine" "vms" {
count = "${length(var.vm_names)}"
name = "${var.vm_names[count.index]}"
datacenter_id = "12345"
}
output "vm_to_uuid" {
value = "${join(",", formatlist("{\"name\": \"%s\", \"id\": \"%s\"}", data.vsphere_virtual_machine.newvms.*.name, data.vsphere_virtual_machine.newvms.*.id))}"
}
还没有测试代码,但是您知道了。尤其是引号转义只是一个猜测,但是很容易从这里弄清楚。
会发生什么情况,您需要获取两个列表(名称和ID)并格式化每个条目中的字典字符串,然后使用逗号分隔将它们连接在一起。