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

如何配置Terraform实现VMware虚拟机第二块NFS网卡的可选创建

Terraform配置调整方案(VMware虚拟机NFS网卡可选)

核心实现思路

通过给NFS网卡关联参数设置默认空值,结合Terraform dynamic 动态块实现条件渲染:仅当三个NFS相关参数全部在tfvars中配置时,才自动创建第二块NFS网卡,否则仅保留默认业务网卡。

具体调整步骤

第一步:修改变量定义,添加默认空值

将3个NFS关联参数和NFS网络ID变量设置默认值为null,未配置时自动为空:

# 原有变量保留,仅修改以下NFS相关变量
variable "vsphere_vm_nfs_network" {
  type    = string
  default = null
}
variable "vsphere_vm_nfs_network_address" {
  type    = string
  default = null
}
variable "vsphere_vm_nfs_ip_address_start" {
  type    = number
  default = null
}
variable "vsphere_nfs_vm_network_id" {
  type    = string
  default = null
}

如果你的NFS网络ID是通过数据源动态获取的,还需要给数据源添加条件判断:

data "vsphere_network" "nfs" {
  count         = var.vsphere_vm_nfs_network != null ? 1 : 0
  name          = var.vsphere_vm_nfs_network
  datacenter_id = data.vsphere_datacenter.dc.id # 替换为你实际的datacenter数据源ID
}
# 赋值给vsphere_nfs_vm_network_id的地方调整为:
# vsphere_nfs_vm_network_id = var.vsphere_vm_nfs_network != null ? data.vsphere_network.nfs[0].id : null

第二步:替换固定网卡配置为动态块

修改vsphere_virtual_machine资源中的两处网卡配置:

  1. 虚拟机硬件层面的网卡定义
  2. 克隆自定义配置中的网卡IP定义
    都替换为动态渲染的dynamic块,判断条件为三个NFS参数全部非空。

第三步:完整修改后的资源代码

resource "vsphere_virtual_machine" "vm" {
  count                      = var.vsphere_vm_count
  name                       = "${var.vsphere_vm_name}${count.index + 1}"
  firmware                   = var.vsphere_vm_firmware
  resource_pool_id           = var.vsphere_vm_resource_pool_id
  datastore_id               = var.vsphere_vm_datastore_id
  folder                     = var.vsphere_folder
  num_cpus                   = var.vsphere_vm_num_cpus
  memory                     = var.vsphere_vm_memory
  guest_id                   = var.vsphere_guest_id
  wait_for_guest_net_timeout = var.vsphere_wait_for_guest_net_timeout

  # 固定默认业务网卡
  network_interface {
    network_id      = var.vsphere_vm_network_id
    adapter_type    = var.vsphere_adapter_type
  }

  # 动态NFS网卡:仅NFS参数全配置时创建
  dynamic "network_interface" {
    for_each = var.vsphere_vm_nfs_network != null && var.vsphere_vm_nfs_network_address != null && var.vsphere_vm_nfs_ip_address_start != null ? [1] : []
    content {
      network_id   = var.vsphere_nfs_vm_network_id
      adapter_type = var.vsphere_adapter_type
    }
  }

  disk {
    label           = "${var.vsphere_vm_name}${count.index + 1}"
    size            = var.vsphere_disk_size
  }

  clone {
    template_uuid    = var.vsphere_template_uuid

    customize {
      timeout        = 0
      
      linux_options {
        host_name    = "${var.vsphere_vm_name}${count.index + 1}"
        domain       = var.vsphere_domain
      }

      # 固定默认业务网卡IP配置
      network_interface {
        ipv4_address = "${cidrhost(var.vsphere_vm_network_address, var.vsphere_vm_ip_address_start + count.index)}"
        ipv4_netmask = 24
      }

      # 动态NFS网卡IP配置:仅NFS参数全配置时生成
      dynamic "network_interface" {
        for_each = var.vsphere_vm_nfs_network != null && var.vsphere_vm_nfs_network_address != null && var.vsphere_vm_nfs_ip_address_start != null ? [1] : []
        content {
          ipv4_address = "${cidrhost(var.vsphere_vm_nfs_network_address, var.vsphere_vm_nfs_ip_address_start + count.index)}"
          ipv4_netmask = 24
        }
      }

      ipv4_gateway    = var.vsphere_vm_ipv4_gateway
      dns_server_list = var.vsphere_dns_server_list
    }
  }

  provisioner "remote-exec" {
    inline = [
      "systemctl stop firewalld",
      "systemctl disable firewalld",
      "sed -i 's/net.ipv4.ip_forward=0/net.ipv4.ip_forward=1/g' /etc/sysctl.conf",
    ]
    connection {
      script_path     = "/script.sh"
      type            = "ssh"
      user            = "root"
      password        = var.centos_root_password
      host            = "${cidrhost(var.vsphere_vm_network_address, var.vsphere_vm_ip_address_start + count.index)}"
    }
  }

}

output "vsphere_vm_ip_addresses" {
 value = vsphere_virtual_machine.vm.*.clone.0.customize.0.network_interface.0.ipv4_address
}

使用方法

  • 需要创建NFS网卡:直接保留tfvars中的三个NFS相关参数配置即可,和原来的使用方式一致
  • 不需要创建NFS网卡:将tfvars中vsphere_vm_nfs_network、vsphere_vm_nfs_network_address、vsphere_vm_nfs_ip_address_start三个参数删除或注释即可,自动跳过NFS网卡创建

小优化建议:可以将vsphere_vm_count、vsphere_vm_num_cpus、vsphere_vm_memory等数值类型变量的类型明确声明为number,避免字符串转数字的潜在报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:06:02