如何配置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资源中的两处网卡配置:
- 虚拟机硬件层面的网卡定义
- 克隆自定义配置中的网卡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
相关产品推荐
相关产品推荐

