我想查看 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)
但这只返回一个数据中心中的主机(即将主机名),并且只返回位于文件夹层次结构顶层的主机。无论身在何处,我都需要它们。
几乎在那里 - 我遇到了完全相同的问题 - 您的循环正在跳过子文件夹。若要获取所有 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
这显然是从数据中心的顶级文件夹开始的,而不是 DC 本身。我的设置中实际上没有多个数据中心 - 但似乎find_datacenter不支持 .each 之类的东西 - 所以你可能想把它包装在一个循环中,比如:
dcs = ['firstdc', 'seconddc', 'thirddc']
dcs.each do |dc|
vms(vim1.serviceInstance.find_datacenter(dc).vmFolder)
end
您也可以在没有手动递归的情况下执行此操作(ab?使用 CreateContainerView 函数:
vim.serviceContent.viewManager.CreateContainerView({
container: dc.vmFolder,
type: ['VirtualMachine'],
recursive: true
}).view
我使用 dc.vmFolder
作为根,因为这是问题中给出的内容,但您也可以交换vim.rootFolder
以获取所有 DC 中的 VM 列表。
,它不会递归于儿童及其姐妹的所有子项。我使用 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
还可以查看一般的树遍历