pyvmomi - 所有虚拟机的列表
pyvmomi - Listing of all VMs
我有很多虚拟机(调度了 2 个主机),我想列出所有虚拟机。
为了做到这一点,我使用了这个:
atexit.register(connect.Disconnect, self.si)
content = self.si.RetrieveContent()
children = content.rootFolder.childEntity
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
self._getInfosVms(vm)
对于我用这个方法的主要方法:
def _getInfosVms(self, vm, depth = 1, i = 0):
maxdepth = 10
if hasattr(vm, 'childEntity'):
if depth > maxdepth:
return
vmList = vm.childEntity
for c in vmList:
self._getInfosVms(c, depth+1)
return
print(vm.summary)
此代码列出了有关虚拟机的所有基本信息,但对于某些虚拟机我有一个错误。
我无法显示 vm.summry 但我可以打印 vm.
错误:
文件“/python_project/packages/pyVmomi/VmomiSupport.py”,第 560 行,
在调用
return self.f(*args, **kwargs)
文件“/python_project/packages/pyVmomi/VmomiSupport.py”,第 383 行,
在 _InvokeAccessor
return self._stub.InvokeAccessor(self, info)
文件“/python_project/packages/pyVmomi/StubAdapterAccessorImpl.py”,
第 42 行,在 InvokeAccessor
options=self._pcType.RetrieveOptions(maxObjects=1))
文件“/python_project/packages/pyVmomi/VmomiSupport.py”,第 566 行,
在
self.f(*(self.args + (obj,) + args), **kwargs)
文件“/python_project/packages/pyVmomi/VmomiSupport.py”,第 375 行,
在 _InvokeMethod
return self._stub.InvokeMethod(self, info, args)
文件“/python_project/packages/pyVmomi/SoapAdapter.py”,第 1291 行,
在 InvokeMethod
raise exc
pyVmomi.SoapAdapter.ParserError: 'xml document:
\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xedZ[o\xe3\xba\x11~\xdf_A\xf8\xa9\x05"\xcb\xb2|I\x0c\xae\x0e\x12\xc7\xd9\x04\x8d\xb3\x86\x9d\r\x82S\x14\x05-\xd11\x1b\x89\xd4!);>\xbf\xbeCJ\xf2J\xbe\x9d\x05Z\xbf\xe5\xc9\xe2\xcc7\x17\x0e\x87\xd4\x0ce\xfc\xdbG\x12\xa3\x15\x95\x8a\t\xfe\xb5\xe15[\rDy("\xc6\xdf\xbe6~<\xdf9\x97\x8d\xdf\x82/X\t\x92R\xbe\x1a\x8c\xf8\x8a\xc6"\xa5\x08\xc4\xb8\x1a\xe4\xe4\xf0kc\xa9u:p]\x15.iBT\x13\xb8\x86\xd5\x14\xf2\xcd5\x0fn\xa9\xd3m|\xa9\x89\xae~E47\xf9S\xf4CE[\xb1\xf5z\xdd\\xfb\x16\xddn\xb5<\xf7u\xfc8\xb3\x9a*h\xf6\xd7h\x87q\xa5\t\x0fi\xa32\xd9\x1b\x11m`8\xa5Z2\xba\xa2\x13\t^H\xcd\xa8\x1a}L\xa9J\x05WE\x1c\xbe62\xc9\x07+\x96\xb4\xbb\x8d\x00K\xaaa\xb8"q\x80\xc5\xfc?4\xd4\xca>
\xbdI\xe9\xd7\xc6\x0b\x93:#\xf1\x98\x84K\xc6\xc1\xdc*q<\xaf\x83]@\x048\x05\x133\xaa\x03\xccIB\x03\x95%\t\x91\x1b\xec\xda\x11\x06\x8d\x08&38\xa4g\x96C\xc1\xfa*\xf9\x0bC\xab\x04\\xcc\xb8fFgDW,\xa4[\xc2L\x13M\x8f\x1a\xb9\xb5\xe0i\x0e}\xe0\x0bQ\xb0GzI%\xa7zHd4\xad(\xb2\xde\xdc2\t!\x98\x10\xbd\xfcFy\xfb:\xd4lE\x83\x05\x89\x155\xae\x1c\xe4\xeeI=pb9SJ\x94\xe0/\t\xcc\xe5)\xd5\x0f\x90SIJ4\x9b\xc7\xf4:"\xa9\xa6\xf2\x19\xbc\xdeW\xbb\'\x8e\xdd\xea|\x03\xfcN7A\xa7\xd5ja\xd7<a\xb7\x8c\xcagt*\xd1\xf1>\xa3s":\xed\xcf\xe8\x9c\x88\x8e\xff\x19\x9d\x13\xd1\xe9|F\xe7Dt\xba\x9f\xd19\x11\x9d\xdegtND\xa7\xff\x19\x9d\x13\xd1\xb9\xfc\x8c\xce\x89\xe8\\xedFg)\x94.j\xeb{x\x9cm\x94\xa6I#0d\xa7\xe3\xb5\xe1\x147\x8f\x01\x0e\x05\xe7`\x0f\x1a\xaa\a1\xa6\x11vwY8\x15k*\xf3g\xfbH\xa3\xef\x1c\xbb\x15*^\x90,\xd6\xcf"\xa6\xd2\xb4\'9\x91\x0b=\x14|\xc1\xde2i\xb4\x1e\x82\xe0\x88\xa8\x97\x04Z\x16\x9d\xdb\xb3\x84bH\xa3@\xcb\x0cBS#\xd9a]D\x0b\x11\xab\x07\xd3\x19\xc5\xa0|,
L\x00,\x96\xeb0\x13\xcf\x85\xd0\xcf\xa6\xb7h\xb7\xbc\xae\xd3\xf2\x1c\xaf\xfd\xec\xf9\x83\x967\xe8\xf8\xcd^\xbf\xdf\xefv~\xc7\xee\x16\x85U\xa6\xa0\xd9\x8a\x1e@Z\x9a\x9e\t\x8a\xf0]\x12Nh"\xe4\xe6;\xb4\xa9KJ\xa2\xa0\xd3\xf1\xfd\xaeg^\x9b;\x0c\x9c\x90\x8fa\x9a\xfdP\xe4\r\xec_]\xc1\x12V)\x86=\xb6\x12\xf9\xd8k\x99E\xdb!b\x9e%\xe3w5\xdc\xae\x942.\xed\x13\xa1\xcd\x0b\x05d8Mc\xb2\xc9c\xce\x8a\xcc\x82\x84\xda\xe3a\xc1c\xd3\xa7A\x93\x19\xcd7e\x0c\xebD\x9c0>\xa5\x7fd\x90\xae\xd1\xe8e8\x16\x11\xfd\x07d
I"\xe7M\xd2\xcd\x12B\x1c9\\xf8\x11\x17k\xf0\xfb
\xd8d\x9f\x121\x8b\x88q\xf3\x89\xd2\xe8\xe7\x8a\x1dba\xb1X\x18\x1f\xee(\x81\xae\x95\x16\x1a\x13\xcau\xbe\x11\xc24cQ3N\x8a\xcd\xb0\xc8aO\xa6!\xfd\xc9\xaaRM\x9b\x9a\xd1\xe0\x06\xb2c0f|\x00mCN\x81\xd9\x1e7\xb58i\xde\xbf}\x9aLGw\xa3\xe7\xe1\xfdQ?j\x98_t\xe8\x90\xd5\xd3\x9e\\xdf\x8c\x8fz`y\xe7\xb3<\xbe=n\xd9\xf0\xcefy8\x9e\xbc\x0e\xef\xbfy\xbd\x9b\xa3\x0eT!g\xf3c\xf4\xfa|=y\x18\xce&\xc3\xa3~T!g\xf3\xe3\xee\xeeu6=\xeaB\xc1=\x9b\xf5\xc7\xeb\xfb\xbb^\xe7\xa8\xf9\x92}>\xfb\xc77\xc0\xe39\xf3\x7f\xfc0\xbb~|\xf8\xf64\xba\xfd\xf7l6:\xea\xc3.\xec|\xfe\x8c_!\xdb\x8e\xfbQ\xb0\xcff\xff\xe9\xf5\xa8m\xc3:\x9b\xdd\xc9\xf7\xc9\xf0\xe9\xf8\xbcK\xf6\xd9\xecOo\x9fg\xc3\xc9Q\xfb%\xfbl\xf6!\xab\xfc\xa3\xd6s\xe69mw\xaeO\x197\xdc\xff\xc1zY\x08\x07\xf8-\xa3\xa6\x94\xb5?\x0fP@HJ\xe7*\xeau\xbe\x19\x02vKz\x0e\xb8\xcb\xe2\xd8\x9a\xbb\x03\xd8\xcd\xec\x16\xfd\xad\xd7q\xe6L\xff\xbd\x00n\xf9yAi\n\xa2L\x05\xf6\xf9\xfb{QH\x16\xc4\x1c\xf1\x92\x7f\x8f(hV\xc7\xb3\xa1\xff\xe0\t\xe1P\xa4E\x85P\x1dw@\xb6\xfd\xab\xc2\xedB\x1a\
x1a\x16\xce\xf8\xdb\x9e\xe5\x82^\x88\xd6Q\xb61\xb0\xf3K\x17\x8arE\x9b+f4\xaf\xe9\xdc\xc9\x0b\xbc\xe6B\xe6\xcdA\x1e\x05\x96^G\x91\xa4J\x05~\xbf\xd9\xbdjz\xf0\xe3\xb5\xa1X\xfd\xc9("g\xcb9\xa8\xf3\x8b\x0f\x02\xe9bf\xf4\x97\x1f\x04\xa0\xfd\x80\x02So\x1b\xa8\xed\x18Z&\xd3\xedXk\xffL\xc3\xd0i\xb5|\xbf\xd3\xfb\x17*\x1ct\xb7\x8e&\x1f\xa6A\xda\x82\x8bJ{\xc6\xfe\xa4\xe3\x9b\xb2>\xae\x920\xa4\xda\x94*S\x97\xdb\x16\x01J\xe3\x1dJ\xa1b\x07\xb4O4u6T\xe6\x81g\x8bk\xf3d(\xd5\xe6Q\x81\x03\x96Y\'\x1aX\xd1j\xde2\xf5\xae\n\r5\x12\xce`C\x04\x9d\xb6\xef\xf7=\xdfs\x16~\xe49\xddE\x7f\xee\xf4[\xbd\x85\xe3\xfbW\xd0\xaf\xf5.I\xe8A\x0bl\xa1\xb8\xfc\xfe\xf3\xc3\x8c\xba\x10.o\xde%N\xbf\xd7\xf6\x9d\x88\xb4\xe7\x0e\xed\xcdC\xe7\xaa\xdd\x9e\xcf\xfdE\xbf\xe3G
X\x13\xf9\xbfo\x15\xc2\xa1\xcb\xcbCU,;b\n\x11d\xf4_
\x01\r\x12R"\x93!Ea\xa6\xb4H`}"\x141\xa5%\x9bgF\x0c\x89\x05*\xadh\xc2b\x01\x8d\x02Z\x08\x892PE\xac*\xd8\xf8k\xe8\xde\x10\xb4\x1fH\x8a\x0c\xda\xad&z\xe0\x88D\x11\xb3\x1a\xb4@s\n\x89\x0eX\xdb\x92.\xb2\xf8\x02-b\xfaa\x9a\xec\xad\xb8\x05\x14\x1a\xcc\xb3\xc9A\xb0\x93\
\xa6\x11\xe3a\x9cE\xd4\x98\x8b\x050c\xf0\xd0x&\xa9\xc9Tp(?\x86\x94\xd5\x00fH\xf8\x0e{\x14)\xdb\#\xd0.\xd6F\xe7"\x93&\t\x10\xfdH\x01H\xe6,fz\x83\xd6LCS\xa4\xad\xc3\x00\x9a\xc7\x82h\xab(\x85\x1e\x16N2\x12#E\xc3L\x1a\xec*\x8b94\xc8V\x92\x81=\x98\x1bhDs\x02\xd1\xa8\x86\xad\x89j\xe1NE\x9a\xc5D\xa2T\n\xf3)\xcf\x9aD\x90\xcb\x14\xa4\tG\x1eJ\x18D\x00b\x15\x895\x07\xfb\x91B\n\xe6\x0c\xd2Z\x99\xc9\xd3\xd4(\xbd\xc8\xbd\x92b\x05\xcb\xc68\nM\xb7\x1c\xc3FG,o\xa0\xedB+\x04\r\xfc\x9b\x9d\xae\x14\tR\x89Y\x9b\xa5H(\x82\xe4_\x0b\xf9\xae\x8c\n\xdb\x9d\xdb5\x99\x0c\xf3\xa8q\xf4:\x17\x1ffF\xe0)\x04\x0fz\xcfT\xc8\\xe5\x05\xca8\xb3\xdfw\xed\xac\r^\xd8H\n\xf9F8\xfb\xb30\\xd1kB\xaa\x00\xa7\xcc2\x15\x86Q~\x07\xa2\x9a\xd8\xad\xe4\xa5\xf9\\x19ea\xf1\x8a*\xbf\x9e\x851Q\xca$\xbc\xbb}*w\x8a\xa5V\x07\x87N5\x08Q$d`\xd2vB%\xbc\x8d
-/\xd0\xe3#\x94\xf4\x05\x0b\x17\xdf\xab\x83v\xb3\xd5\xf4\x9d\xe9\xe8qtmj\xbd\x92\x8c!O\xe3\x97r\xe0\xd6F\xb9\x8a\x1f2\x0e*\x9f\x84\xcb\xe3\x10bR\x1a1\x88r~\xa7\xd0\x15\x08&ij\x7f\xdd\xed\xc36@\xc52\xc3\x8bX\x97M{yj\x1fb\xd9^\xdd\x9e\xfb\xb0\xb5\xa5\xbd\x96\x08E\x920m\xaeXz\xdd\xaew\xd9o\xb5\xdb\x06U\x12q\xc6\x7f\x0e\xbc\x96\xd7\xbf\xea\xf8W\xf6\x8e\xa4\xca\x00\x94Z\x12YW\xb2\xa5a\xf3\xee\x07g\x92\xb4\xb8\xbc\xe9:\xed\xde\xb3\xd7\x1at/\x07\xad^\xb3\xd7\xed\xb7\xbb\x97\xbf\xc3{f\x0b\xc3\xee\xd6?\xf0<|7oD\xf3\xb5\x1bV\x02\xa6\xb4\xbdx\xf1/\xe1\xe5\xb6K\xac\xa0n)\xbc\x9a\xa3]XA\xcd\x0f\xce\xea\x15M\xdf+N\xcb\xda\xbd\x8dy\xbfV\t\x9d^q#WCY\xb9{J\xa4\x9e\xc3\xc9S\xbe\xe7\xe1\x98\xe4\x85\xce]\x1e\xde\x1e\x0e4\x02\xa7Fp\xac\xc0\xce\xb5\xf5\x92\xdf\x05\x7f\x8f\xb3\xab\x92\xb9\x0f5\xe1\xab^Mx\x1f\x01k\x0f\xfb,\xdc\xd1\xda\xed\xf4M\xd4\x0fp\n\xfc\xbe"\xcf\xeb\xb5J\x99\x03fR\xc9\xe0\x9dLs\x0e\x94$\x9e\xc9\xdb*\t\xe7\xf9Q\x8cz](qk\x14\xac\xd6\x90\xf1\xdb\xa1\xb1U#\xe0\xb99\xc7\x05\xaf"vI\xf6\xde*
KhT^\xe6\x95\xeet\xf3{\xab\x03,\xbc\xd0\x8f\xe2\xed\x06rd\xcd"\xbd\x0c\x1cp|\x87\x04\x90\x19\x05\xf1\x88\xc8\xcd#L\x88\x87\x9b\x02\xb6G6\xda\xf2\xc7mR\x90\x8dUX\xa3\x9a}\x98\x9a\x12\xad:\x99=\x1a\xceR{\xa1l\x8d@\x85\xe2\x99\xadc\xbeF\xd4\xe9X\xa9h\xb6\x17\xbb]\x1av\x0f\xec\xadz\xe6\xd6\x89\xb6\xc8\xcfO\x9f\xfc\xdf$\xee\xf6\x7f(n\xe5\xcf)\xee\xa9?\xb6\x04_\xb0\xbb\xf3?\x18w\xf7O@\xc1\x7f\x01\xf4\x96\x1dv>$\x00\x00
parse error at: line:1, col:0'
感谢您的帮助。
看来您选择了示例代码,我怀疑它对于多主机配置有点天真,而且我觉得很困惑。无论如何,恕我直言,这种 hasattr(XX, 'vmFolder') 方法有点不确定,我更愿意明确说明类型。我注意到,即使您可以 repr() 对象,并且它们会打印出它们的内容,但我发现无法执行以下操作:
if type(object) == type(vim.Folder):
因为我无法在该比较的 RHS 上找到相关的 类,因为正在进行一些惰性类型评估。
您可以使用 _wsdlName 属性,它似乎可以工作,然后您可以用它做正确的事情,例如,让您的所有机器执行如下操作:
def Walk(root):
if root._wsdlName == "Folder":
for child in root.childEntity:
Walk(child)
elif root._wsdlName == "Datacenter":
for child in root.vmFolder.childEntity:
Walk(child)
elif root._wsdlName == "VirtualMachine":
print root.name
elif root._wsdlName == "VirtualApp":
pass
else:
raise VSError("Unable to recognise node type '%s'" % root._wsdlName)
然后:
Walk(content.rootFolder)
但是,您可能会通过以下方式更快地完成枚举:
container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
for c in container.view:
print c.name
如果您只查找一种类型,我发现第二种方法可以在大约一半的时间内枚举它们。 YMMV.
我想在特定文件夹中制作一种虚拟机的分层树视图,所以这就是我写的(我还必须禁用 ssl 证书验证)。
#!/usr/bin/env python
import atexit
import ssl
import tools.cli as cli
from pyVim import connect
from pyVmomi import vmodl
from pyVmomi import vim
def main():
"""
Simple command-line program for listing the virtual machines on a system.
"""
args = cli.get_args()
try:
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_NONE
service_instance = connect.SmartConnect(host=args.host,
user=args.user,
pwd=args.password,
port=int(args.port),
sslContext=context)
atexit.register(connect.Disconnect, service_instance)
for datacenter in service_instance.content.rootFolder.childEntity:
print("datacenter: ", datacenter.name)
if (datacenter.name == "Cambridge"):
print ("Found Cambridge datacenter")
folders1 = datacenter.vmFolder.childEntity
for folder1 in folders1:
print("{}/".format(folder1.name))
if folder1.name != "Engineering":
print(" -Ignored")
if folder1.name == "Engineering":
folders2 = folder1.childEntity
for folder2 in folders2:
print(" {}/{}/".format(folder1.name, folder2.name))
folders3 = folder2.childEntity
for folder3 in folders3:
print(" {}/{}/{}".format(folder1.name, folder2.name, folder3.name))
connect.Disconnect
except vmodl.MethodFault as error:
print("Caught vmodl fault : " + error.msg)
return -1
return 0
# Start program
if __name__ == "__main__":
main()
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
对于脚本的 hacky 性质表示歉意,它不是通用的,只是我需要快速开始工作的东西,但我希望它有用。
我有很多虚拟机(调度了 2 个主机),我想列出所有虚拟机。
为了做到这一点,我使用了这个:
atexit.register(connect.Disconnect, self.si)
content = self.si.RetrieveContent()
children = content.rootFolder.childEntity
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
self._getInfosVms(vm)
对于我用这个方法的主要方法:
def _getInfosVms(self, vm, depth = 1, i = 0):
maxdepth = 10
if hasattr(vm, 'childEntity'):
if depth > maxdepth:
return
vmList = vm.childEntity
for c in vmList:
self._getInfosVms(c, depth+1)
return
print(vm.summary)
此代码列出了有关虚拟机的所有基本信息,但对于某些虚拟机我有一个错误。 我无法显示 vm.summry 但我可以打印 vm.
错误:
文件“/python_project/packages/pyVmomi/VmomiSupport.py”,第 560 行, 在调用
return self.f(*args, **kwargs)
文件“/python_project/packages/pyVmomi/VmomiSupport.py”,第 383 行, 在 _InvokeAccessor
return self._stub.InvokeAccessor(self, info)
文件“/python_project/packages/pyVmomi/StubAdapterAccessorImpl.py”, 第 42 行,在 InvokeAccessor
options=self._pcType.RetrieveOptions(maxObjects=1))
文件“/python_project/packages/pyVmomi/VmomiSupport.py”,第 566 行, 在
self.f(*(self.args + (obj,) + args), **kwargs)
文件“/python_project/packages/pyVmomi/VmomiSupport.py”,第 375 行, 在 _InvokeMethod
return self._stub.InvokeMethod(self, info, args)
文件“/python_project/packages/pyVmomi/SoapAdapter.py”,第 1291 行, 在 InvokeMethod
raise exc
pyVmomi.SoapAdapter.ParserError: 'xml document:
\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xedZ[o\xe3\xba\x11~\xdf_A\xf8\xa9\x05"\xcb\xb2|I\x0c\xae\x0e\x12\xc7\xd9\x04\x8d\xb3\x86\x9d\r\x82S\x14\x05-\xd11\x1b\x89\xd4!);>\xbf\xbeCJ\xf2J\xbe\x9d\x05Z\xbf\xe5\xc9\xe2\xcc7\x17\x0e\x87\xd4\x0ce\xfc\xdbG\x12\xa3\x15\x95\x8a\t\xfe\xb5\xe15[\rDy("\xc6\xdf\xbe6~<\xdf9\x97\x8d\xdf\x82/X\t\x92R\xbe\x1a\x8c\xf8\x8a\xc6"\xa5\x08\xc4\xb8\x1a\xe4\xe4\xf0kc\xa9u:p]\x15.iBT\x13\xb8\x86\xd5\x14\xf2\xcd5\x0fn\xa9\xd3m|\xa9\x89\xae~E47\xf9S\xf4CE[\xb1\xf5z\xdd\\xfb\x16\xddn\xb5<\xf7u\xfc8\xb3\x9a*h\xf6\xd7h\x87q\xa5\t\x0fi\xa32\xd9\x1b\x11m`8\xa5Z2\xba\xa2\x13\t^H\xcd\xa8\x1a}L\xa9J\x05WE\x1c\xbe62\xc9\x07+\x96\xb4\xbb\x8d\x00K\xaaa\xb8"q\x80\xc5\xfc?4\xd4\xca>
\xbdI\xe9\xd7\xc6\x0b\x93:#\xf1\x98\x84K\xc6\xc1\xdc*q<\xaf\x83]@\x048\x05\x133\xaa\x03\xccIB\x03\x95%\t\x91\x1b\xec\xda\x11\x06\x8d\x08&38\xa4g\x96C\xc1\xfa*\xf9\x0bC\xab\x04\\xcc\xb8fFgDW,\xa4[\xc2L\x13M\x8f\x1a\xb9\xb5\xe0i\x0e}\xe0\x0bQ\xb0GzI%\xa7zHd4\xad(\xb2\xde\xdc2\t!\x98\x10\xbd\xfcFy\xfb:\xd4lE\x83\x05\x89\x155\xae\x1c\xe4\xeeI=pb9SJ\x94\xe0/\t\xcc\xe5)\xd5\x0f\x90SIJ4\x9b\xc7\xf4:"\xa9\xa6\xf2\x19\xbc\xdeW\xbb\'\x8e\xdd\xea|\x03\xfcN7A\xa7\xd5ja\xd7<a\xb7\x8c\xcagt*\xd1\xf1>\xa3s":\xed\xcf\xe8\x9c\x88\x8e\xff\x19\x9d\x13\xd1\xe9|F\xe7Dt\xba\x9f\xd19\x11\x9d\xdegtND\xa7\xff\x19\x9d\x13\xd1\xb9\xfc\x8c\xce\x89\xe8\\xedFg)\x94.j\xeb{x\x9cm\x94\xa6I#0d\xa7\xe3\xb5\xe1\x147\x8f\x01\x0e\x05\xe7`\x0f\x1a\xaa\a1\xa6\x11vwY8\x15k*\xf3g\xfbH\xa3\xef\x1c\xbb\x15*^\x90,\xd6\xcf"\xa6\xd2\xb4\'9\x91\x0b=\x14|\xc1\xde2i\xb4\x1e\x82\xe0\x88\xa8\x97\x04Z\x16\x9d\xdb\xb3\x84bH\xa3@\xcb\x0cBS#\xd9a]D\x0b\x11\xab\x07\xd3\x19\xc5\xa0|,
L\x00,\x96\xeb0\x13\xcf\x85\xd0\xcf\xa6\xb7h\xb7\xbc\xae\xd3\xf2\x1c\xaf\xfd\xec\xf9\x83\x967\xe8\xf8\xcd^\xbf\xdf\xefv~\xc7\xee\x16\x85U\xa6\xa0\xd9\x8a\x1e@Z\x9a\x9e\t\x8a\xf0]\x12Nh"\xe4\xe6;\xb4\xa9KJ\xa2\xa0\xd3\xf1\xfd\xaeg^\x9b;\x0c\x9c\x90\x8fa\x9a\xfdP\xe4\r\xec_]\xc1\x12V)\x86=\xb6\x12\xf9\xd8k\x99E\xdb!b\x9e%\xe3w5\xdc\xae\x942.\xed\x13\xa1\xcd\x0b\x05d8Mc\xb2\xc9c\xce\x8a\xcc\x82\x84\xda\xe3a\xc1c\xd3\xa7A\x93\x19\xcd7e\x0c\xebD\x9c0>\xa5\x7fd\x90\xae\xd1\xe8e8\x16\x11\xfd\x07d
I"\xe7M\xd2\xcd\x12B\x1c9\\xf8\x11\x17k\xf0\xfb
\xd8d\x9f\x121\x8b\x88q\xf3\x89\xd2\xe8\xe7\x8a\x1dba\xb1X\x18\x1f\xee(\x81\xae\x95\x16\x1a\x13\xcau\xbe\x11\xc24cQ3N\x8a\xcd\xb0\xc8aO\xa6!\xfd\xc9\xaaRM\x9b\x9a\xd1\xe0\x06\xb2c0f|\x00mCN\x81\xd9\x1e7\xb58i\xde\xbf}\x9aLGw\xa3\xe7\xe1\xfdQ?j\x98_t\xe8\x90\xd5\xd3\x9e\\xdf\x8c\x8fz`y\xe7\xb3<\xbe=n\xd9\xf0\xcefy8\x9e\xbc\x0e\xef\xbfy\xbd\x9b\xa3\x0eT!g\xf3c\xf4\xfa|=y\x18\xce&\xc3\xa3~T!g\xf3\xe3\xee\xeeu6=\xeaB\xc1=\x9b\xf5\xc7\xeb\xfb\xbb^\xe7\xa8\xf9\x92}>\xfb\xc77\xc0\xe39\xf3\x7f\xfc0\xbb~|\xf8\xf64\xba\xfd\xf7l6:\xea\xc3.\xec|\xfe\x8c_!\xdb\x8e\xfbQ\xb0\xcff\xff\xe9\xf5\xa8m\xc3:\x9b\xdd\xc9\xf7\xc9\xf0\xe9\xf8\xbcK\xf6\xd9\xecOo\x9fg\xc3\xc9Q\xfb%\xfbl\xf6!\xab\xfc\xa3\xd6s\xe69mw\xaeO\x197\xdc\xff\xc1zY\x08\x07\xf8-\xa3\xa6\x94\xb5?\x0fP@HJ\xe7*\xeau\xbe\x19\x02vKz\x0e\xb8\xcb\xe2\xd8\x9a\xbb\x03\xd8\xcd\xec\x16\xfd\xad\xd7q\xe6L\xff\xbd\x00n\xf9yAi\n\xa2L\x05\xf6\xf9\xfb{QH\x16\xc4\x1c\xf1\x92\x7f\x8f(hV\xc7\xb3\xa1\xff\xe0\t\xe1P\xa4E\x85P\x1dw@\xb6\xfd\xab\xc2\xedB\x1a\
x1a\x16\xce\xf8\xdb\x9e\xe5\x82^\x88\xd6Q\xb61\xb0\xf3K\x17\x8arE\x9b+f4\xaf\xe9\xdc\xc9\x0b\xbc\xe6B\xe6\xcdA\x1e\x05\x96^G\x91\xa4J\x05~\xbf\xd9\xbdjz\xf0\xe3\xb5\xa1X\xfd\xc9("g\xcb9\xa8\xf3\x8b\x0f\x02\xe9bf\xf4\x97\x1f\x04\xa0\xfd\x80\x02So\x1b\xa8\xed\x18Z&\xd3\xedXk\xffL\xc3\xd0i\xb5|\xbf\xd3\xfb\x17*\x1ct\xb7\x8e&\x1f\xa6A\xda\x82\x8bJ{\xc6\xfe\xa4\xe3\x9b\xb2>\xae\x920\xa4\xda\x94*S\x97\xdb\x16\x01J\xe3\x1dJ\xa1b\x07\xb4O4u6T\xe6\x81g\x8bk\xf3d(\xd5\xe6Q\x81\x03\x96Y\'\x1aX\xd1j\xde2\xf5\xae\n\r5\x12\xce`C\x04\x9d\xb6\xef\xf7=\xdfs\x16~\xe49\xddE\x7f\xee\xf4[\xbd\x85\xe3\xfbW\xd0\xaf\xf5.I\xe8A\x0bl\xa1\xb8\xfc\xfe\xf3\xc3\x8c\xba\x10.o\xde%N\xbf\xd7\xf6\x9d\x88\xb4\xe7\x0e\xed\xcdC\xe7\xaa\xdd\x9e\xcf\xfdE\xbf\xe3G
X\x13\xf9\xbfo\x15\xc2\xa1\xcb\xcbCU,;b\n\x11d\xf4_
\x01\r\x12R"\x93!Ea\xa6\xb4H`}"\x141\xa5%\x9bgF\x0c\x89\x05*\xadh\xc2b\x01\x8d\x02Z\x08\x892PE\xac*\xd8\xf8k\xe8\xde\x10\xb4\x1fH\x8a\x0c\xda\xad&z\xe0\x88D\x11\xb3\x1a\xb4@s\n\x89\x0eX\xdb\x92.\xb2\xf8\x02-b\xfaa\x9a\xec\xad\xb8\x05\x14\x1a\xcc\xb3\xc9A\xb0\x93\
\xa6\x11\xe3a\x9cE\xd4\x98\x8b\x050c\xf0\xd0x&\xa9\xc9Tp(?\x86\x94\xd5\x00fH\xf8\x0e{\x14)\xdb\#\xd0.\xd6F\xe7"\x93&\t\x10\xfdH\x01H\xe6,fz\x83\xd6LCS\xa4\xad\xc3\x00\x9a\xc7\x82h\xab(\x85\x1e\x16N2\x12#E\xc3L\x1a\xec*\x8b94\xc8V\x92\x81=\x98\x1bhDs\x02\xd1\xa8\x86\xad\x89j\xe1NE\x9a\xc5D\xa2T\n\xf3)\xcf\x9aD\x90\xcb\x14\xa4\tG\x1eJ\x18D\x00b\x15\x895\x07\xfb\x91B\n\xe6\x0c\xd2Z\x99\xc9\xd3\xd4(\xbd\xc8\xbd\x92b\x05\xcb\xc68\nM\xb7\x1c\xc3FG,o\xa0\xedB+\x04\r\xfc\x9b\x9d\xae\x14\tR\x89Y\x9b\xa5H(\x82\xe4_\x0b\xf9\xae\x8c\n\xdb\x9d\xdb5\x99\x0c\xf3\xa8q\xf4:\x17\x1ffF\xe0)\x04\x0fz\xcfT\xc8\\xe5\x05\xca8\xb3\xdfw\xed\xac\r^\xd8H\n\xf9F8\xfb\xb30\\xd1kB\xaa\x00\xa7\xcc2\x15\x86Q~\x07\xa2\x9a\xd8\xad\xe4\xa5\xf9\\x19ea\xf1\x8a*\xbf\x9e\x851Q\xca$\xbc\xbb}*w\x8a\xa5V\x07\x87N5\x08Q$d`\xd2vB%\xbc\x8d
-/\xd0\xe3#\x94\xf4\x05\x0b\x17\xdf\xab\x83v\xb3\xd5\xf4\x9d\xe9\xe8qtmj\xbd\x92\x8c!O\xe3\x97r\xe0\xd6F\xb9\x8a\x1f2\x0e*\x9f\x84\xcb\xe3\x10bR\x1a1\x88r~\xa7\xd0\x15\x08&ij\x7f\xdd\xed\xc36@\xc52\xc3\x8bX\x97M{yj\x1fb\xd9^\xdd\x9e\xfb\xb0\xb5\xa5\xbd\x96\x08E\x920m\xaeXz\xdd\xaew\xd9o\xb5\xdb\x06U\x12q\xc6\x7f\x0e\xbc\x96\xd7\xbf\xea\xf8W\xf6\x8e\xa4\xca\x00\x94Z\x12YW\xb2\xa5a\xf3\xee\x07g\x92\xb4\xb8\xbc\xe9:\xed\xde\xb3\xd7\x1at/\x07\xad^\xb3\xd7\xed\xb7\xbb\x97\xbf\xc3{f\x0b\xc3\xee\xd6?\xf0<|7oD\xf3\xb5\x1bV\x02\xa6\xb4\xbdx\xf1/\xe1\xe5\xb6K\xac\xa0n)\xbc\x9a\xa3]XA\xcd\x0f\xce\xea\x15M\xdf+N\xcb\xda\xbd\x8dy\xbfV\t\x9d^q#WCY\xb9{J\xa4\x9e\xc3\xc9S\xbe\xe7\xe1\x98\xe4\x85\xce]\x1e\xde\x1e\x0e4\x02\xa7Fp\xac\xc0\xce\xb5\xf5\x92\xdf\x05\x7f\x8f\xb3\xab\x92\xb9\x0f5\xe1\xab^Mx\x1f\x01k\x0f\xfb,\xdc\xd1\xda\xed\xf4M\xd4\x0fp\n\xfc\xbe"\xcf\xeb\xb5J\x99\x03fR\xc9\xe0\x9dLs\x0e\x94$\x9e\xc9\xdb*\t\xe7\xf9Q\x8cz](qk\x14\xac\xd6\x90\xf1\xdb\xa1\xb1U#\xe0\xb99\xc7\x05\xaf"vI\xf6\xde*
KhT^\xe6\x95\xeet\xf3{\xab\x03,\xbc\xd0\x8f\xe2\xed\x06rd\xcd"\xbd\x0c\x1cp|\x87\x04\x90\x19\x05\xf1\x88\xc8\xcd#L\x88\x87\x9b\x02\xb6G6\xda\xf2\xc7mR\x90\x8dUX\xa3\x9a}\x98\x9a\x12\xad:\x99=\x1a\xceR{\xa1l\x8d@\x85\xe2\x99\xadc\xbeF\xd4\xe9X\xa9h\xb6\x17\xbb]\x1av\x0f\xec\xadz\xe6\xd6\x89\xb6\xc8\xcfO\x9f\xfc\xdf$\xee\xf6\x7f(n\xe5\xcf)\xee\xa9?\xb6\x04_\xb0\xbb\xf3?\x18w\xf7O@\xc1\x7f\x01\xf4\x96\x1dv>$\x00\x00
parse error at: line:1, col:0'
感谢您的帮助。
看来您选择了示例代码,我怀疑它对于多主机配置有点天真,而且我觉得很困惑。无论如何,恕我直言,这种 hasattr(XX, 'vmFolder') 方法有点不确定,我更愿意明确说明类型。我注意到,即使您可以 repr() 对象,并且它们会打印出它们的内容,但我发现无法执行以下操作:
if type(object) == type(vim.Folder):
因为我无法在该比较的 RHS 上找到相关的 类,因为正在进行一些惰性类型评估。
您可以使用 _wsdlName 属性,它似乎可以工作,然后您可以用它做正确的事情,例如,让您的所有机器执行如下操作:
def Walk(root):
if root._wsdlName == "Folder":
for child in root.childEntity:
Walk(child)
elif root._wsdlName == "Datacenter":
for child in root.vmFolder.childEntity:
Walk(child)
elif root._wsdlName == "VirtualMachine":
print root.name
elif root._wsdlName == "VirtualApp":
pass
else:
raise VSError("Unable to recognise node type '%s'" % root._wsdlName)
然后:
Walk(content.rootFolder)
但是,您可能会通过以下方式更快地完成枚举:
container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
for c in container.view:
print c.name
如果您只查找一种类型,我发现第二种方法可以在大约一半的时间内枚举它们。 YMMV.
我想在特定文件夹中制作一种虚拟机的分层树视图,所以这就是我写的(我还必须禁用 ssl 证书验证)。
#!/usr/bin/env python
import atexit
import ssl
import tools.cli as cli
from pyVim import connect
from pyVmomi import vmodl
from pyVmomi import vim
def main():
"""
Simple command-line program for listing the virtual machines on a system.
"""
args = cli.get_args()
try:
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_NONE
service_instance = connect.SmartConnect(host=args.host,
user=args.user,
pwd=args.password,
port=int(args.port),
sslContext=context)
atexit.register(connect.Disconnect, service_instance)
for datacenter in service_instance.content.rootFolder.childEntity:
print("datacenter: ", datacenter.name)
if (datacenter.name == "Cambridge"):
print ("Found Cambridge datacenter")
folders1 = datacenter.vmFolder.childEntity
for folder1 in folders1:
print("{}/".format(folder1.name))
if folder1.name != "Engineering":
print(" -Ignored")
if folder1.name == "Engineering":
folders2 = folder1.childEntity
for folder2 in folders2:
print(" {}/{}/".format(folder1.name, folder2.name))
folders3 = folder2.childEntity
for folder3 in folders3:
print(" {}/{}/{}".format(folder1.name, folder2.name, folder3.name))
connect.Disconnect
except vmodl.MethodFault as error:
print("Caught vmodl fault : " + error.msg)
return -1
return 0
# Start program
if __name__ == "__main__":
main()
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
对于脚本的 hacky 性质表示歉意,它不是通用的,只是我需要快速开始工作的东西,但我希望它有用。