Terraform如何正确引用for_each创建资源的导出属性?
问题解决方法
核心错误是cloudstack_disk资源块中误用了不存在的变量$name做索引,两个使用相同for_each规则的资源可以通过each.key做关联匹配,具体修正方式如下:
直接修正写法
将cloudstack_disk资源中的virtual_machine_id参数替换为以下内容即可生效:
virtual_machine_id = cloudstack_instance.worker[each.key].id
优化后完整代码(推荐)
为了避免重复编写相同的for_each过滤逻辑,可以直接复用cloudstack_instance.worker的实例集合作为disk资源的遍历源,同时Terraform会自动推导依赖关系,无需手动声明depends_on:
resource "cloudstack_instance" "worker" { for_each = { for name, machine in var.machines : name => machine if machine.node_type == "worker" } name = "${var.prefix}-${each.key}" service_offering = "K8S-RBD" network_id = var.network_id template = var.template_id zone = var.zone project = var.project_id expunge = true group = var.prefix keypair = var.keypair tags = { name = "Terraform-VM" } } resource "cloudstack_disk" "worker" { # 直接复用instance的for_each集合,无需重复过滤 for_each = cloudstack_instance.worker name = "${var.prefix}-${each.key}" attach = "true" disk_offering = "Custom-RBD" size = 50 virtual_machine_id = each.value.id zone = var.zone project = var.project_id }
原理解释
- 使用
for_each创建的资源会以键值对的形式存在,你可以通过资源名[键名]的方式访问对应实例的导出属性 - 两个资源的
for_each规则完全一致,键名是一一对应的,所以用当前disk实例的each.key索引instance资源就能拿到对应虚拟机的ID - 直接复用
cloudstack_instance.worker作为disk的for_each源时,each.value就直接对应了同键名的instance实例对象,可以直接取它的id属性,写法更简洁
内容的提问来源于stack exchange,提问作者Agryppa
相关产品推荐
相关产品推荐

