官方的《vSphere Web Services Programming Guide》确实是最好的学习资料,不论从概念介绍还是由浅入深的层次,所以以下内容的主要内容也是从这本书搬运而来,额外添加些自己的理解,方便不喜欢全英的同学看看。
client-server基础架构
下图是对架构的举例说明,其中看到的VirtualMachine managed object是managed object的一个例子,GuestInfo data object是data object的例子。
主要概念说明:
1、managed object(受管对象):就如同linux系统中把所有资源都当做文件一样,vsphere中所有的资源都可以叫做managed object,比如datacenter、virtualmachine、network等。受管对象也可以类比为编程中的class实例化后的对象,同样,受管对象主要包含属性和方法。
2、data objects(数据对象): 类似于C++中的结构(struct),就是复杂的数据类型集合,也可以理解为class实例化后的对象,只是,数据对象只有数据,没有方法。
3、managed object reference(MOR)(受管对象引用): 是存在于客户端的对服务端受管对象的引用。客户端通过对这个引用进行一些操作,从而实现对服务器端受管对象的动作。
架构说明:
1、vsphere server端天然存在(安装好ESXi或者vcenter就有)了很多managed object和data object,这些对象按照一定的目录树(在vsphere中叫inventory,ESXi和vcenter中的目录会稍有差异)组织。
2、client端通过创建server端受管对象的引用建立起对受管对象的关联。
3、client端的受管对象引用可以获取受管对象的属性,其中很多以data object的结构存在,client获取后会在本地保留副本,client如果想修改受管对象的属性,也是先修改本地副本,最后以task调用的方式,将本地副本传送给服务端,就能实现对服务端受管对象的修改。比如修改一个virtual machine新增一块disk。
4、查看所有的managed object、data object可以通过API文档进行检索。
managed object清单(inventory)目录
在vcenter架构中的虚拟化中,有很多资源类的定义,比如说物理主机(ComputeResource)、虚拟机(VirtualMachine)、磁盘存储(DataStore)、网络(Network)、数据中心逻辑概念(Datacenter)等。
这些资源类下的资源在sdk的世界中都是不同的managed object,这些资源在sdk的世界中的层次结构就是下面要说的清单目录----inventory,就如同linux中文件系统有/boot、/tmp、/home目录一样。
下图是vcenter架构下的目录结构组织图:
清单说明:
1、首先是ServiceInstance,这是开始访问vsphere服务端的起点,这个后续再详细说明。
2、Folder(目录)也属于一种受管对象类,属于逻辑分类范畴,比如把virtualMachine和VirtualApp放在同一个目录下。
3、这张图中Floder似乎是一样的,但打开对象查看,发现每个Floder都是有类别名称的,比如ServiceInstance下级的Folder叫rootFolder,ComputeResource上级的叫hostFolder,VM上层的叫vmFolder,Network上层的叫NetworkFolder,DataStore上层的叫datastoreFolder。
父子层级关系追溯方法:
1、每个受管对象都有一个parent属性,标识上层受管对象是谁。
2、在Folder受管对象下,有childEntity属性,为子对象组成的列表。
3、在某些对象类型下固定有几类Folder,比如ServiceInstance下有rootFolder,在datacenter下固定有hostFolder、vmFolder、networkFolder、datastoreFolder。
清单遍历的起点
从上面两张图可以看出,ServiceInstance是所有清单遍历操作的起点。
客户端通过sdk提供的connect方法,提供服务地址(IP)、服务端口(port)、用户名、密码等信息就可以连接到vsphere获取到serviceInstance。
ServiceInstance通过调用ServiceInstance.RetrieveContent方法可以获取到ServiceContent.
serviceContent就提供了所有的受管对象遍历。
清单遍历实例代码
下面是一段基于python3的演示代码,可以通过断点调试协助理解整个清单层次。
from pyVim import connect
from pyVmomi import vim
import atexit
# 获取service instance
service_instance = connect.SmartConnectNoSSL(host="127.0.0.1",
user="user",
pwd="password",
port=443)
# 退出执行销毁
atexit.register(connect.Disconnect, service_instance)
# 获取service content
content = service_instance.RetrieveContent()
# 获取指定类型的 managed object
objview = content.viewManager.CreateContainerView(content.rootFolder, [vim.Folder], True)
"""
总结的受管对象种类有:
VirtualMachine
Datacenter
Folder
Datastore
Network
HostSystem
ResourcePool
ComputeResource
"""
# 打印本级受管对象名和父级受管对象名
folder_info = {}
for vm in objview.view:
if vm.parent.name not in folder_info.keys():
folder_info[vm.parent.name] = [vm.name, ]
else:
folder_info[vm.parent.name].append(vm.name)
print (folder_info)
比如在以上代码content行打上断点,步进一步后,查看service content对象,级联查找如下:
rootFolder---->childEntity---->Datacneter---->datastoreFolder—>childEntity------>datastore受管对象。
最后
以上关于inventory的介绍都是基于vcenter架构的,如果你没有连vcenter,直接连ESXi,则目录结构会稍有不同,具体可以查看开发手册,但是基础概念都是一样的。