Terraform:通过模块和每个模块获取输出

Terraform:通过模块和每个模块获取输出,terraform,terraform0.12+,Terraform,Terraform0.12+,我正在使用以下版本的terraform: root@sflowc01:~/terraform_proj# terraform version Terraform v0.14.2 + provider registry.terraform.io/dmacvicar/libvirt v0.6.2 + provider registry.terraform.io/hashicorp/template v2.2.0 在我的模块(./modules/singlevm/main.tf)中,我将输出定义为:

我正在使用以下版本的terraform:

root@sflowc01:~/terraform_proj# terraform version
Terraform v0.14.2
+ provider registry.terraform.io/dmacvicar/libvirt v0.6.2
+ provider registry.terraform.io/hashicorp/template v2.2.0
在我的模块
(./modules/singlevm/main.tf)
中,我将输出定义为:

output "ips" {
  value = libvirt_domain.db1.network_interface.0.addresses
}
当我在独立模式下运行这个模块时,我得到的输出是一个列表,如下所示:(正如预期的那样)

我的TFVAR定义为:

myvms = {
  vm1 = {
    hostname  = "centos01"
    osdisk_gb = 20
    CPU_Count = 4
    RAM       = 256
    Image     = "CentOS-7-x86_64-GenericCloud.qcow2"
  }
  vm2 = {
    hostname  = "ubuntu01"
    osdisk_gb = 40
    CPU_Count = 8
    RAM       = 512
    Image     = "ubuntu-16.04-server-cloudimg-amd64-disk1.img"

  }
}
在我的根模块中,我使用为每个创建多个vm,并尝试从我的根模块
(./main.tf)

我犯了一个错误

Error: Unsupported attribute

  on main.tf line 23, in output "all_ips":
  23:   value = ["${module.kvm_instances.*.ips}"]
  This object does not have an attribute named "ips". 

那么,如何正确地从根模块提取所有虚拟机的IP地址呢?提前谢谢

从输出构建的最干净的对象可能是一个
映射(列表)
,其中vm作为键,ip列表作为值。可以使用类似以下的for表达式来构造此映射:

output "all_ips" {
  value = { for vm in keys(var.myvms) : vm => module.kvm_instances[vm].ips }
}

它将返回一个映射,其中每个VM都是一个键,并且它根据您的
输出的相关输出IP地址列表将是值。

谢谢@Matt,我能够使用您的方法使其工作。我正在处理嵌套映射,我已经更新了我的问题,以包括示例TFVAR。因此,我不得不将var.myvms修改为键(var.myvms)。为了他人的利益,也更新了您的答案。
Error: Unsupported attribute

  on main.tf line 23, in output "all_ips":
  23:   value = ["${module.kvm_instances.*.ips}"]
  This object does not have an attribute named "ips". 
output "all_ips" {
  value = { for vm in keys(var.myvms) : vm => module.kvm_instances[vm].ips }
}