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
相关产品推荐
相关产品推荐

