You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中OpenStack实例动态绑定多网络的问题修复

问题原因

你的代码中,openstack_compute_instance_v2.compute_instance资源使用了count = length(var.net_type),这会让Terraform为每一个网络创建一个独立实例,而非在单个实例上绑定多个网络。

修复方案

修改instances/main.tf中的实例资源定义,将实例数量固定为1,并通过动态network块绑定所有创建的网络端口:

resource "openstack_compute_instance_v2" "compute_instance" {
  # 每个server对应1个实例,不再按网络数量创建
  count             = 1
  name              = "${var.hostname}.mydomain.com"
  availability_zone = "nova"
  image_id          = data.openstack_images_image_v2.image_type.id
  flavor_id         = data.openstack_compute_flavor_v2.compute_flavor.id
  
  scheduler_hints {
    group = openstack_compute_servergroup_v2.servergroup.id
  }

  # 动态遍历所有网络端口,绑定到当前实例
  dynamic "network" {
    for_each = openstack_networking_port_v2.networks
    content {
      port = network.value.id
    }
  }
}

resource "openstack_compute_servergroup_v2" "servergroup" {
  name     = var.hostname
  policies = ["anti-affinity"]
}

resource "openstack_networking_port_v2" "networks" {
  count              = length(var.net_type)
  name               = "${var.net_type[count.index]}0.${var.hostname}.mydomain.com"
  network_id         = data.openstack_networking_network_v2.network[count.index].id
  security_group_ids = [data.openstack_networking_secgroup_v2.secgroup.id]
  mac_address        = var.net_mac[count.index]

  fixed_ip {
    subnet_id  = data.openstack_networking_subnet_v2.subnet[count.index].id
    ip_address = var.net_ip[count.index]
  }
}
关键修改说明
  • 将实例的count从length(var.net_type)改为1,确保每个server只创建一个虚拟机实例。
  • 使用dynamic "network"块遍历openstack_networking_port_v2.networks资源集合,把所有创建的网络端口都绑定到同一个实例上,实现单实例多网卡。
  • 保留原有的openstack_networking_port_v2.networks资源定义,它会根据网络数量创建对应端口,这部分逻辑无需改动。

执行terraform plan即可验证:test-jammy2只会创建一个实例,同时关联两个网络端口,不再生成两个独立实例。

内容的提问来源于stack exchange,提问作者Marco Ferrara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:35:11