Terraform vsphere提供程序:无法收缩虚拟磁盘

Terraform vsphere提供程序:无法收缩虚拟磁盘,terraform,vsphere,terraform-provider-vsphere,Terraform,Vsphere,Terraform Provider Vsphere,我可以从以下地形资源创建虚拟机(省略一些细节,因为它与问题无关,我希望保持简洁): 因此,vm_instances变量在terraform.tfvars文件中定义如下: vm_instances = [ {name="small_1", disk = 16}, {name="small_2", disk = 16}, {name="small_3", disk = 16}

我可以从以下地形资源创建虚拟机(省略一些细节,因为它与问题无关,我希望保持简洁):

因此,vm_instances变量在terraform.tfvars文件中定义如下:

vm_instances = [
           {name="small_1", disk = 16},
           {name="small_2", disk = 16},
           {name="small_3", disk = 16},
           {name="medium_1", disk = 32},
           {name="medium_2", disk = 32},
           {name="medium_3", disk = 32},
           {name="large_1", disk = 64},
           {name="large_2", disk = 64}
]
如果我在这个配置上运行apply,所有的东西都会被部署并工作。但是,如果随后更改列表变量(例如,在
small\u 3
medium\u 1
之间插入
small\u 4
),则会出现两个相关错误:

错误:磁盘。0:虚拟磁盘“disk0”:无法收缩虚拟磁盘(旧:64新:32)

错误:磁盘。0:虚拟磁盘“disk0”:无法收缩虚拟磁盘(旧:32新:16)

所以我理解为什么会抛出这个错误,但是有没有办法强迫Terraform摧毁这样的机器然后重建呢?这就是克隆变量的行为为什么不调整磁盘大小

解决这个问题的唯一方法是为每个磁盘大小定义单独的资源(有点麻烦,对我的问题来说并不理想),或者销毁所有的机器,然后构建新的机器(这有点否定了使用Terraform的意义)

提前感谢您的回复

编辑

我尝试了马特·舒查德(Matt Schuchard)的评论建议(谢谢马特!),但没有成功,因为我认为我无法使用“vsphere\u虚拟磁盘”资源中的
count
功能。它抱怨找不到“Disk-#.vmdk”磁盘

此外,我似乎仍然需要一个带有此外部附件的disk0作为第二个磁盘(这实际上可以解决我的问题,但首选一个磁盘)

以下是失败尝试的代码

resource "vsphere_virtual_disk" "my_disk" {
     count = length(var.vm_instances)
     vmdk_path = "Disk-${ count.index }.vmdk"
     datastore = "myds"
     size = var.vm_instances[count.index].disk
     datacenter = "mydc"
}
在我的虚拟机资源中:

resource "vsphere_virtual_machine" "vm-instance" {
  ...
  disk {
     label = "disk0"
     size = 16
     ...
  }
  disk {
     attach = true
     path = "Disk-${ count.index }.vmdk"
     label = "disk1"
     unit_number = 1
  }

}

您需要在列表中追加磁盘,而不是插入磁盘。这是由于VSphere API在磁盘上强制执行单元号一致性。
resource "vsphere_virtual_machine" "vm-instance" {
  ...
  disk {
     label = "disk0"
     size = 16
     ...
  }
  disk {
     attach = true
     path = "Disk-${ count.index }.vmdk"
     label = "disk1"
     unit_number = 1
  }

}