如何在Terraform中通过子网名称获取对应ID以配置OCI节点池
实现方案
你当前写法的核心问题是无法直接用each.value["subnet_name"]作为资源索引名匹配子网资源,可按以下两种场景选择实现方式:
场景1:子网资源在当前Terraform代码中直接管理
- 先调整子网资源为批量创建模式,用子网配置作为for_each索引:
resource "oci_core_subnet" "worker_subnets" { for_each = var.subnets cidr_block = each.value.subnet_cidr compartment_id = var.compartment_id vcn_id = oci_core_virtual_network.base_vcn.id display_name = each.value.display_name dns_label = each.value.dns_label prohibit_public_ip_on_vnic = true security_list_ids = [oci_core_security_list.private_worker_nodes.id] route_table_id = oci_core_route_table.rt-nat.id }
- 新增本地变量构造子网名称到资源对象的映射:
locals { # key为子网display_name,value为对应子网资源对象 subnet_map = { for subnet in oci_core_subnet.worker_subnets : subnet.display_name => subnet } }
- 修改node_pool资源中subnet_id的取值逻辑:
placement_configs { availability_domain = var.availability_domain subnet_id = local.subnet_map[each.value.subnet_name].id }
如果要避免子网名称不存在时报错,可配合try函数做兜底:
subnet_id = try(local.subnet_map[each.value.subnet_name].id, var.default_subnet_id)
场景2:子网为OCI上已有的存量资源,不在当前代码中管理
用数据源批量拉取符合条件的子网,再构造映射即可:
- 定义子网数据源,拉取所有用到的worker子网:
data "oci_core_subnets" "target_workers" { compartment_id = var.compartment_id vcn_id = oci_core_virtual_network.base_vcn.id # 过滤只拉取nodepools中用到的子网 filter { name = "display_name" values = distinct([for np in var.nodepools : np.subnet_name]) } }
- 构造本地映射:
locals { subnet_map = { for subnet in data.oci_core_subnets.target_workers.subnets : subnet.display_name => subnet } }
- 后续subnet_id的取值逻辑和场景1完全一致。
内容的提问来源于stack exchange,提问作者cloudbud
相关产品推荐
相关产品推荐

