如何批量获取Terraform创建的VMware虚拟机UUID?
解决Terraform中for_each创建VMware虚拟机后的UUID获取问题
当你使用for_each批量创建资源时,Terraform会生成**键值对映射(Map)**而非列表,因此传统的splat表达式(*.uuid)无法生效,这是你遇到问题的核心原因。以下是针对两种场景的正确解决方案:
1. 获取所有虚拟机的UUID集合
如果你需要收集所有虚拟机的UUID到一个列表或映射中,可以使用values()函数配合splat表达式,或者用for表达式构建映射:
生成UUID列表
locals { # 将所有虚拟机的UUID提取为列表 vm_uuids = values(vsphere_virtual_machine.vm)[*].uuid }
生成带键的UUID映射(保留虚拟机标识关联)
如果你需要保留UUID与原虚拟机的对应关系(比如和var.vms中的键关联),可以用for表达式:
locals { # 键为var.vms中的标识,值为对应虚拟机的UUID vm_uuid_map = { for vm_key, vm_instance in vsphere_virtual_machine.vm : vm_key => vm_instance.uuid } }
2. 在abc模块中传递对应虚拟机的UUID
由于你的abc模块同样使用了for_each = var.vms,每个模块实例需要对应到同一键的虚拟机UUID,而非传递所有UUID的列表。修改模块调用代码如下:
module "abc" { source = "../../abc" for_each = var.vms # 通过each.key关联到对应虚拟机的UUID re = vsphere_virtual_machine.vm[each.key].uuid }
这样每个abc模块实例都会拿到与自身each.key匹配的虚拟机UUID,避免了参数类型不匹配的问题。
内容的提问来源于stack exchange,提问作者user312307
相关产品推荐
相关产品推荐

