需求介绍:
之前已经使用pyvmomi库实现了虚拟机的自动备份,不过由于备份的虚拟机都是较为重要的系统,磁盘都是厚置备模式,终于有一天,备份目标的空间不够了,导致几个虚拟机无法备份。在不想增加磁盘的情况下,想着能不能把磁盘的厚置备模式改成thin精简模式,是不是就可以节省空间了呢?
过程介绍:
pyvmomi的示例程序比较简单,这个看起来不是很高级的需求竟然没有,看了下手动操作克隆时是可以修改的,就想着肯定是可以实现的。
从网上包括问了ChatGPT4.0 和文心都不太好使,折腾了一天,都有些气馁了。还是去翻官网文档,说实话有些费劲,vsphere的功能确实强,但文档也确实复杂,至少pyvmomi的是这样。
总结下:
虚拟机克隆时的参数很简单,主要配置参数都在CloenSpec这个对象中指定,包括目标主机、存储、资源池等。在这个对象中,主要有RelocateSpec 和 configSpec两个对象,在这两个对象中都有deviceChange这个子对象,是网上找到的资料主要修改的目标。
1. 首先,官网说clonespec 的config 已经不用了。改用location下的deviechange。
2. RelocateSpec中的devicechange说明只有极少数配置可以改,其他的都会被忽略。网上的大部分文章都是修改这个devicechange的,所以都没有效果。
3. 上图中RelocateSpec中的disk 表明可以指定磁盘参数的。进去看下:
RelocateSpec的disk参数是一个vim.vm.RelocateSpec.DiskLocator的列表,而DiskLocator对象包含有diskID、diskBackingINfo等信息,diskbakcingInfo对象中的VirtualDiskFlatVer2BackingInfo中有thinProvisioned参数来指定磁盘格式。 感觉就像是俄罗斯套娃,一个对象包含着另外的对象,一层层的,你不知道需要的参数在那一层的口袋里。
4. 这里还遇到一个难题,就是DiskLocator对象中的diskId参数怎么指定? 问了ChatGPT4.0 和文心一言,给出的例子是将设备出现的顺序当成diskId,系统一直报错说diskId指定不对。
还是ChatGPT4 好一些:
直接提示了diskId是virtualdisk设备的key属性,不是排序和索引。
把事情搞清楚了,问题就简单了:
1. 通过源VM的设备信息获取到有多少个磁盘,并获取对应的key值作为diskLocator的diskId参数。
for device in source_vm_inst.config.hardware.device:
if isinstance(device, vim.vm.device.VirtualDisk):
diskId = device.key
2. 对每个磁盘,组装一个diskLocator对象:
disk_locator = vim.vm.RelocateSpec.DiskLocator()
disk_locator.datastore= datestore #这个也是必选参数,就是目标VM的存储对象
disk_locator.diskId = device.key
disk_locator.diskBackingInfo = vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
disk_locator.diskBackingInfo.thinProvisioned = True
disk_change.append(disk_locator)
3. 定义cloneSpec和relocateSPec对象,将参数注入进去
clone_spec = vim.vm.CloneSpec()
relocate_spec = vim.vm.RelocateSpec()
relocate_spec.disk = disk_change # 将磁盘的配置信息注入到relocatespec的disk参数中
clone_spec.location = relocate_spec # 将relocatespec配置信息注入clonespec中。
4. 剩下的事情就是交给Clone Task去完成克隆任务,然后查看克隆后的虚拟机磁盘是否已经是精简模式。
最后: chatGPT 4.0 真的很强,可以看到给的代码大部分直接可用,下一个10年就是AI的时代,错过了互联网,错过了移动互联网,不要错过AI。