Ruby 使用API获取所有虚拟机(rbvmomi)

Ruby 使用API获取所有虚拟机(rbvmomi),ruby,vsphere,vmware-server,rbvmomi,Ruby,Vsphere,Vmware Server,Rbvmomi,我想查看vcenter中所有虚拟机的一些信息,目前我有: require 'rbvmomi' vim1 = RbVmomi::VIM.connect host: 'vcenter.foo.tld', ssl: true, insecure: true, user: 'keith', password: 'NSABACKDOOR' dc1 = vim1.serviceInstance.find_datacenter("Datacenter Name") or fail "datacenter

我想查看vcenter中所有虚拟机的一些信息,目前我有:

require 'rbvmomi'

vim1 = RbVmomi::VIM.connect host: 'vcenter.foo.tld', ssl: true, insecure: true, user: 'keith', password: 'NSABACKDOOR' 
dc1 = vim1.serviceInstance.find_datacenter("Datacenter Name") or fail "datacenter not found"

def list_vms(dc,vim)
  dc.vmFolder.children.each do |vm| 
    if vm.is_a? RbVmomi::VIM::VirtualMachine
      puts vm.name
    end
  end
end

list_vms(dc1,vim1)

但这只返回一个数据中心中的主机(即放置主机名),并且只返回文件夹层次结构中顶层的主机。无论在哪里,我都需要它们。

几乎在那里-我遇到了完全相同的问题-您的循环正在跳过子文件夹。要获取所有虚拟机,需要通过它们进行递归。尝试类似的方法(摘自我自己的工作代码):

这显然是从数据中心的顶级文件夹开始的,而不是DC本身。实际上,我的设置中没有多个数据中心,但find_数据中心似乎不支持.each这样的功能,所以您可能希望将其封装在一个循环中,如:

 dcs = ['firstdc', 'seconddc', 'thirddc']
 dcs.each do |dc|
    vms(vim1.serviceInstance.find_datacenter(dc).vmFolder)
 end

但是,它不会在儿童及其姐妹的所有子项中重现。 我使用pyvmomi编写了类似的东西,它访问对象树的每个节点

像这样: 堆栈是最顶层的节点列表

def TreeSpider(stack)
    while stack

        for node in stack:
            remove node from stack
            do custom-stuff

            if node (has child):
                stack.append(child) #or a for loop for each child

另外,还可以检查树遍历(一般情况下)

也可以使用CreateContainerView函数(ab?)执行此操作,而无需手动递归:

vim.serviceContent.viewManager.CreateContainerView({
  container: dc.vmFolder,
  type:      ['VirtualMachine'],
  recursive: true
}).view

我使用了
dc.vmFolder
作为根,这是问题中给出的,但是您也可以在
vim.rootFolder
中交换,以获得所有dc中的VM列表。

一个很好的示例,但是使用真实的类名作为引用来检测对象类型比拆分字符串要好。例如:case x.class.name
vim.serviceContent.viewManager.CreateContainerView({
  container: dc.vmFolder,
  type:      ['VirtualMachine'],
  recursive: true
}).view