Terraform:使用模块和 for_each 获取输出

标签 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) 中,我将输出定义为:

output "ips" {
  value = libvirt_domain.db1.network_interface.0.addresses
}

当我在独立模式下运行这个模块时,我得到的输出是一个列表,如下所示:(这是预期的)

ips = tolist([
  "192.168.122.167",
])

我的 tfvars 定义为:

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"

  }
}

在我的根模块中,我正在使用 for_each 创建多个 VM,并且我试图从我的根模块 (./main.tf) 捕获相同的输出

module "kvm_instances" {
  source = "./modules/singlevm"
  for_each = var.myvms
  ...
}

output "all_ips" {
  value = ["${module.kvm_instances.*.ips}"]
 }

我得到一个错误

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 地址呢?提前致谢!

最佳答案

从输出中构造的最干净的对象可能是一个 map(list),其中 VM 作为键,它们的 IP 列表作为值。您可以使用如下所示的 for 表达式来构造此映射:

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

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

关于Terraform:使用模块和 for_each 获取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65399374/

相关文章:

amazon-web-services - 使用 Terraform 缩小 AWS 上的 Redis 缓存集群

地形错误 : Error: creating Subnet: Original Error: Code ="NetcfgInvalidSubnet" Message ="Subnet ' internal' is not valid in virtual network

linux - 在 PATH terraform 中设置路径

python - terraform 可以为多个基础设施/工作空间并行运行 "apply"吗?

当不存在循环时,terraform destroy 会产生循环错误

amazon-ec2 - Terraform:AWS 目标组无法添加多个目标

terraform - Local-exec destroy 触发器 - 忽略对 google 访问 token 的更改

terraform - Terraform可以用于配置本地服务器吗?

postgresql - 从具有私有(private) IP 和公共(public) IP 的 VM 连接到私有(private) IP 上的 Google Cloud SQL 实例失败

azure - 如何在 Terraform 的 virtual_machine 资源中使用共享镜像计划数据,例如发布者、报价和 sku