【问题标题】:Getting all VirtualMachines using API (rbvmomi)使用 API (rbvmomi) 获取所有虚拟机
【发布时间】:2013-11-17 17:40:35
【问题描述】:

我想查看我的 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)

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

【问题讨论】:

    标签: ruby vsphere vmware-server rbvmomi


    【解决方案1】:

    差不多了 - 我遇到了完全相同的问题 - 您的循环正在跳过子文件夹。要获取所有虚拟机,您需要通过它们进行递归。尝试这样的事情(从我自己的工作代码中提取):

    def vms(folder) # recursively go thru a folder, dumping vm info
       folder.childEntity.each do |x|
          name, junk = x.to_s.split('(')
          case name
          when "Folder"
             vms(x)
          when "VirtualMachine"
             puts x.name
          else
             puts "# Unrecognized Entity " + x.to_s
          end
       end
    end
    

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

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

    【讨论】:

    • 一个很好的例子,但是使用真正的类名作为引用来检测对象类型会比拆分字符串更好。例如:case x.class.name
    【解决方案2】:

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

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

    我已使用 dc.vmFolder 作为根,因为这是问题中给出的,但您也可以换入 vim.rootFolder 以获取所有 DC 中的 VM 列表。

    【讨论】:

      【解决方案3】:

      然而,它不会在 children 及其姐妹的所有子项中递归。 我使用 pyvmomi 编写了类似的东西,它访问对象树的每个节点。

      像这样的伪: stack 是最顶层的节点列表

      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
      

      还检查了一般的树遍历

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        相关资源
        最近更新 更多