如何在govmomi中无需额外vCenter API查询获取VM所属集群?
获取虚拟机所属集群无需额外API调用的实现方法
完全可以不用为每个VM单独调用vCenter API,只需要在初始的Retrieve请求中扩展属性列表,直接关联获取集群信息即可,具体步骤如下:
修改Retrieve请求的属性参数:
在你当前的属性列表中,添加与集群关联的属性路径。虚拟机的运行主机(runtime.host)的父级对象就是它所在的集群,因此可以通过属性路径一次性拉取集群信息。修改后的属性列表可以是:[]string{"summary", "name", "network", "guest", "config", "resourcePool", "runtime.host.parent.name", "runtime.host.parent"}其中
runtime.host.parent.name直接获取集群名称,runtime.host.parent则获取集群的完整ManagedObjectReference,方便后续如果需要集群的其他属性时使用。遍历VM时直接获取集群信息:
修改完属性后,遍历vcenterResponse时就能直接从VM对象中读取集群数据,示例代码如下:for i, vm := range vcenterResponse { // 获取集群名称 var clusterName string if vm.Runtime != nil && vm.Runtime.Host != nil && vm.Runtime.Host.Parent != nil { clusterName = vm.Runtime.Host.Parent.Name } // 后续使用clusterName或集群对象... }特殊情况处理:
如果虚拟机所在的主机并非隶属于集群(比如直接部署在数据中心下的独立主机),此时runtime.host.parent的类型会是Datacenter而非ClusterComputeResource,可以通过判断对象类型来区分:if vm.Runtime.Host.Parent.Type == "ClusterComputeResource" { // 这是集群中的VM clusterName = vm.Runtime.Host.Parent.Name } else { // 处理独立主机的情况 }
这种方式通过一次Retrieve请求就拉取到所有需要的关联数据,避免了多次API调用带来的性能开销。
内容的提问来源于stack exchange,提问作者Rygo
相关产品推荐
相关产品推荐

