使用API​​获取所有VirtualMachines(rbvmomi)

Fel*_*xHJ 2 ruby vmware-server vsphere 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 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)
Run Code Online (Sandbox Code Playgroud)

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

小智 6

几乎在那里 - 我有完全相同的问题 - 你的循环正在跳过子文件夹.要获取所有VM,您需要通过它们进行递归.尝试这样的事情(从我自己的工作代码中撕掉):

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
Run Code Online (Sandbox Code Playgroud)

这显然是从数据中心的顶级文件夹开始,而不是DC本身.我的设置实际上并没有多个数据中心 - 但似乎find_datacenter似乎不支持像.each这样的东西 - 所以你可能想把它包装成一个循环,如:

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