Terraform:使用模块和 for_each 获取输出
Terraform: get outputs with modules and for_each
我正在使用以下版本的 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 创建多个虚拟机,并且我正在尝试从我的根模块 (./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 }
}
这将 return 一个映射,其中每个 VM 都是一个键,其根据您的 output
输出 IP 地址的关联列表将是值。
我正在使用以下版本的 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 创建多个虚拟机,并且我正在尝试从我的根模块 (./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 }
}
这将 return 一个映射,其中每个 VM 都是一个键,其根据您的 output
输出 IP 地址的关联列表将是值。