KVM桥接配置正常,使用Terraform部署后VM无法获取DHCP IP如何解决?
第一步:恢复原有正常配置
- 首先销毁Terraform创建的冲突资源,避免继续篡改配置:在你的Terraform工作目录执行
terraform destroy,如果执行失败,可以手动删除libvirt里的错误网络配置:- 先停止Terraform创建的gw虚拟机:
virsh destroy gw(如果虚拟机处于运行状态) - 停用冲突的test_network网络:
virsh net-destroy test_network - 删除test_network网络定义:
virsh net-undefine test_network
- 先停止Terraform创建的gw虚拟机:
- 恢复宿主机网桥配置:执行
brctl show确认br0网桥仍绑定eth0物理网卡,如果配置被篡改,直接重启宿主机网络服务恢复你之前手动保存的网桥配置即可(CentOS执行systemctl restart network,Ubuntu执行netplan apply) - 恢复原有手动部署虚拟机的网络配置:执行
virsh edit <原有虚拟机名称>打开虚拟机XML配置,找到网卡配置段,修改为直接绑定br0网桥的配置即可,示例如下:
修改后重启虚拟机即可恢复原有网络。<interface type='bridge'> <mac address='原有虚拟机的MAC地址,不需要修改'/> <source bridge='br0'/> <model type='virtio'/> </interface>
第二步:修正Terraform配置避免冲突
你的配置错误点是:已经手动在宿主机创建了br0网桥的场景下,不需要再用libvirt_network资源定义绑定br0的网络,该操作会让libvirt接管你已有的br0网桥,还会自动启动dnsmasq DHCP服务,和局域网原有DHCP服务冲突,导致虚拟机无法正常获取IP,还可能篡改原有网络配置。
删除libvirt_network资源段,直接在虚拟机网卡配置里指定桥接br0即可,修正后的完整配置如下:
terraform { required_providers { libvirt = { source = "dmacvicar/libvirt" } } } provider "libvirt" { uri = "qemu:///system" } resource "libvirt_volume" "centos7-qcow2" { name = "centos7.qcow2" pool = "default" source = "http://14.7.1.10_0.39637-disk1.qcow2" format = "qcow2" } data "template_file" "user_data" { template = file("${path.module}/cloud_init.cfg") } data "template_file" "cloudinit_network" { template = file("${path.module}/network.cfg") } resource "libvirt_cloudinit_disk" "cloud_init" { name = "commoninit.iso" user_data = data.template_file.user_data.rendered network_config = data.template_file.cloudinit_network.rendered } # Define KVM domain to create resource "libvirt_domain" "gw" { name = "gw" memory = "8192" vcpu = 4 cloudinit = libvirt_cloudinit_disk.cloud_init.id qemu_agent = true network_interface { # 直接指定桥接已有br0网桥,不需要关联libvirt网络ID bridge = "br0" model = "virtio" # 启用半虚拟化网卡驱动,提升网络性能 } disk { volume_id = "${libvirt_volume.centos7-qcow2.id}" } console { type = "pty" target_type = "serial" target_port = "0" } graphics { type = "spice" listen_type = "address" autoport = true } } output "ips" { value = libvirt_domain.gw.*.network_interface.0.addresses }
如果你的系统cloud-init版本较高,gateway4参数已废弃,可以将network.cfg修改为以下配置避免警告:
version: 2 ethernets: eth0: dhcp4: true routes: - to: default via: 10.100.86.254
第三步:验证配置
修改完成后重新执行terraform init、terraform apply创建虚拟机,即可正常通过DHCP获取IP,也不会再篡改你原有网桥和手动部署虚拟机的配置。
内容的提问来源于stack exchange,提问作者Orly Orly
相关产品推荐
相关产品推荐

