概述

之前接触过ansible的vmware_guest module,并且通过调用这个模块实现了批量从模板克隆虚拟机(包括Linux和Windows),后来萌生了能否用Python重构这个功能的想法,于是2021年2月中旬着手开始,到2021年3月中旬历时一个月,已经完成从文件读取虚拟机配置,并克隆虚拟机的功能,同样包括了Linux和Windows。主要参考文档如下:
VMware Python SDK api文档,版本为vCenter6.7
Parallelism in One Line with Python,国外大神针对Python并发编程的一篇文章
pyvmomi on github
pyvmomi on pypi.org
atexit模块文档,用来做程序退出时的处理,在这个case中是做vcenter账号注销退出的

VMware vSphere Python SDK心得体会

  • VMware vSphere Python SDK可以通过pip install pyvmomi安装,如果无法直连公网,可以通过github或者python官网下载并离线安装,进行api调用开发需要import pyVmomi和pyVim两个包。
  • 对vmware进行任何操作之前,都需要进行调用登录连接到vcetner,调用pyVim.connect内SmartConnectNoSSL方法,返回一个SmartConnect方法,SmartConnect再返回一个Connect方法,Connect方法最后返回一个service instance对象(si)。si.content直接获得属性值 和 content = si.RetrieveContent()通过RetrieveContent()方法获得的值是相同的。
  • 得到content后,通过一系列的api method拿到克隆机器的所需参数,最后CloneVM_Task方法实现克隆机器。

实现并发

在api文档上花了一段时间后,对api文档渐渐熟悉起来,于是顺利完成了克隆虚机的功能。但是ansible装机默认并发是5,即可以支持同时5台虚机的安装,但是自己的python脚本通过for循环实现的克隆没有并发,由于添加了wait_for_task函数,函数会等到安装任务结束后返回任务执行结果,因此for循环的实现效果就是单次安装一台虚拟机,等到安装结束后才能开始下一台的安装。于是决定实现和ansible同样效果的想法。
据我目前所知,python中有三个包可以实现并发功能,分别是multiprocessing.Pool, multiprocessing.ThreadPool, threading,先尝试了一下multiprocessing.ThreadPool,实现方式很简单
pool = ThreadPool()
pool.map(function, iterable_var)
pool.close()
pool.join()
先定义一个线程池,随后调用map方法,第一个变量是线程需要执行的函数方法,第二个变量是一个可迭代的变量。map方法会将iterable_var中的每个值丢进function中执行。这种方法我只写了个demo,并没有实际运用到克隆机器的案例中。
ThreadPool方法实现很简单,符合python代码简洁的初衷,threading有点繁琐,不仅需要写一个线程类,还需要维护queue队列(你需要把虚拟机的参数从txt文件维护到queue中,再让线程从queue读取数据来克隆虚拟机),出于没有写过并发编程,最后还是采用了threading模块实现并发。threading模块实现并发功能的核心是这样的,从Thread类继承,子类中重写run方法,run方法内就是线程需要干的活。
class sub_class(threading.Thread) #声明子类
worker = sub_class(args) #实例化子类,即线程
worker.start() #线程运行,具体工作定义在run方法中