Terraform升级至1.1.19后vsphere_virtual_machine部署报设备0无效错误
Terraform升级后vsphere_virtual_machine报设备0无效操作问题
问题描述
- 服务器Terraform版本从0.13.7升级至1.1.19后,原有同时适配Windows、Linux系统的
vsphere_virtual_machine资源配置在旧版本可正常运行,新版本执行完全相同代码时抛出如下错误:
error reconfiguring virtual machine: error reconfiguring virtual machine: Invalid operation for device '0'
- 已多次核查代码、调整少量参数,报错仍存在,需确认新版本是否要求额外传入参数,或是相关数据源、资源定义存在变更。
原配置代码片段
data "vsphere_datacenter" "dc" { name = var.dc } data "vsphere_datastore" "datastore" { name = var.datastore datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_compute_cluster" "compute_cluster" { name = var.cluster datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_network" "network" { name = var.networks datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_content_library" "library" { name = var.content_library } data "vsphere_content_library_item" "item" { type = var.type name = lookup(var.content_lib[var.content_library_env],var.os_type) library_id = data.vsphere_content_library.library.id } data "vsphere_virtual_machine" "template" { name = lookup(var.content_lib[var.content_library_env],var.os_type) datacenter_id = data.vsphere_datacenter.dc.id } resource "vsphere_virtual_machine" "vm" { name = var.vmname resource_pool_id = data.vsphere_compute_cluster.compute_cluster.resource_pool_id datastore_id = data.vsphere_datastore.datastore.id num_cpus = var.num_cpu memory = var.memory folder = var.folder cpu_hot_add_enabled = "true" cpu_hot_remove_enabled = "true" memory_hot_add_enabled = "true" hardware_version = "15" enable_disk_uuid = "true" network_interface { network_id = data.vsphere_network.network.id } disk { label = "disk0" size = var.disk_size } clone { template_uuid = data.vsphere_content_library_item.item.id customize { windows_options { computer_name = var.vmname admin_password = var.admin_password workgroup = var.workgroup full_name = var.full_name organization_name = var.organization_name auto_logon = var.auto_logon auto_logon_count = var.auto_logon_count time_zone = var.time_zone run_once_command_list = var.run_once_command_list product_key = var.product_key_details[var.os_type] } network_interface { ipv4_address = var.ip_address != "" ? var.ip_address : null ipv4_netmask = var.ip_address != "" ? var.netmask : null } dns_server_list = var.dnslist ipv4_gateway = var.gateway } } }
故障原因
该报错和Terraform核心版本无直接关联,是升级Terraform时同步升级的vSphere Provider版本逻辑变更导致:适配Terraform 0.13的vSphere Provider多为1.x版本,对内容库克隆虚拟机的设备校验宽松,顶层手动定义的disk、network_interface块会自动和模板继承的设备合并,不会触发冲突;适配Terraform 1.1的vSphere Provider普遍为2.x及以上版本,严格校验设备唯一性,克隆场景下如果顶层重复定义磁盘、网卡块,会被识别为对序号为0的默认系统磁盘/网卡做无效重配置,直接抛出对应错误。
原配置另外存在两个隐藏问题:一是定义了从未引用的data.vsphere_virtual_machine.template冗余数据源;二是customize块固定传入windows_options,部署Linux系统时会因定制参数不匹配触发配置错误。
修复方案
按以下要求调整配置即可解决问题:
- 删除资源顶层冗余的
disk { label = "disk0" ... }块。克隆场景会自动继承模板的系统盘,如需调整系统盘大小,可在虚拟机创建完成后通过匹配磁盘unit_number的方式扩容,不要在创建阶段重复声明disk0设备 - 调整网卡配置逻辑:删除顶层无特殊参数的
network_interface块,将网络关联配置移到clone.customize块对应的网卡配置段中,保证网卡设备只声明一次 - 删除未使用的
data "vsphere_virtual_machine" "template"冗余数据源 - 用动态块适配多OS定制逻辑:仅当OS类型为Windows时传入
windows_options配置,Linux系统使用对应的linux_options配置,避免跨OS传参触发配置错误
内容的提问来源于stack exchange,提问作者Nitesh Berwal
相关产品推荐
相关产品推荐

