如何使用 pyvmomi 将 ESXi 主机置于维护模式?
How do I put a ESXi host into maintenance mode using pyvmomi?
我被要求编写一些 python 代码,使 VMWare ESXi 主机进入维护模式。我获得了虚拟中心的名称 test-vc
和 ESXi 主机的主机名 test-esxi-host
以及此 link ...
https://github.com/vmware/pyvmomi/blob/master/docs/vim/HostSystem.rst
... 它提供了一些关于我应该使用的方法的文档,EnterMaintenanceMode(timeout, evacuatePoweredOffVms, maintenanceSpec)
。
我真的完全不知道该怎么做,需要一些帮助。我试过从 python 控制台这样做:
from pyVmomi import vim
vim.HostSystem.EnterMaintenanceMode(timeout=0)
导致此错误跟踪的结果:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/apps/cpm/red/env/lib/python2.7/site-packages/pyVmomi/VmomiSupport.py", line 574, in __call__
return self.f(*args, **kwargs)
TypeError: _InvokeMethod() takes at least 2 arguments (1 given)
此外,我有点困惑 EnterMaintenanaceMode
例程如何知道我想将主机 test-esxi-host
放在虚拟中心 test-vc
?
更新:我想我已经弄明白了。这是我认为我需要做的:
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
import atexit
si = SmartConnectNoSSL(host=vc_host, user=user, pwd=pwd)
cont = si.RetrieveContent()
atexit.register(Disconnect, si) # maybe. I am not really sure what this does
objview = si.content.viewManager.CreateContainerView(si.content.rootFolder, [vim.HostSystem], True)
objview.view[0].EnterMaintenanceMode(0)
当然行
objview.view[0].EnterMaintenanceMode(0)
肯定会造成严重破坏,因为我不知道那是不是主机,'test-esxi-host',我想进入维护模式。我想我可以做到这一点
for h in objview.view:
if h.name == 'test-esxi-host'
h.EnterMaintenanceMode(0)
我希望有更好的方法来完成上述操作。像
get_host(objview.view, 'test-esxi-host').EnterMaintenanceMode(0)
看看Getting started with VMwares ESXi/vSphere API in Python。
To get a VM object or a list of objects you can use the searchIndex
class. The class had methods to search for VMs by UUID, DNS name, IP
address or datastore path.
希望有两种方法可以在 vCenter 中查找对象:
- FindByUuid(虚拟机|主机)
- FindByDatastorePath(虚拟机)
- FindByDnsName(虚拟机|主机)
- FindByIp(虚拟机|主机)
- FindByInventoryPath(托管实体:VM|主机|资源池|..)
- FindChild(托管实体)
其中许多还具有 FindAll..
允许更广泛查找的方法。
对于这种特殊情况,您可以使用 FindByDnsName
来查找您的主机。
searcher = si.content.searchIndex
host = searcher.FindByDnsName(dnsName='test-esxi-host', vmSearch=False)
host.EnterMaintenanceMode(0)
此代码要求您使用具有 Host.Config.Maintenance
权限的用户向 vCenter (@SmartConnectNoSSL
) 进行身份验证。
最后你可以让你的主机退出维护模式:host.ExitMaintenanceMode(0)
我被要求编写一些 python 代码,使 VMWare ESXi 主机进入维护模式。我获得了虚拟中心的名称 test-vc
和 ESXi 主机的主机名 test-esxi-host
以及此 link ...
https://github.com/vmware/pyvmomi/blob/master/docs/vim/HostSystem.rst
... 它提供了一些关于我应该使用的方法的文档,EnterMaintenanceMode(timeout, evacuatePoweredOffVms, maintenanceSpec)
。
我真的完全不知道该怎么做,需要一些帮助。我试过从 python 控制台这样做:
from pyVmomi import vim
vim.HostSystem.EnterMaintenanceMode(timeout=0)
导致此错误跟踪的结果:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/apps/cpm/red/env/lib/python2.7/site-packages/pyVmomi/VmomiSupport.py", line 574, in __call__
return self.f(*args, **kwargs)
TypeError: _InvokeMethod() takes at least 2 arguments (1 given)
此外,我有点困惑 EnterMaintenanaceMode
例程如何知道我想将主机 test-esxi-host
放在虚拟中心 test-vc
?
更新:我想我已经弄明白了。这是我认为我需要做的:
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
import atexit
si = SmartConnectNoSSL(host=vc_host, user=user, pwd=pwd)
cont = si.RetrieveContent()
atexit.register(Disconnect, si) # maybe. I am not really sure what this does
objview = si.content.viewManager.CreateContainerView(si.content.rootFolder, [vim.HostSystem], True)
objview.view[0].EnterMaintenanceMode(0)
当然行
objview.view[0].EnterMaintenanceMode(0)
肯定会造成严重破坏,因为我不知道那是不是主机,'test-esxi-host',我想进入维护模式。我想我可以做到这一点
for h in objview.view:
if h.name == 'test-esxi-host'
h.EnterMaintenanceMode(0)
我希望有更好的方法来完成上述操作。像
get_host(objview.view, 'test-esxi-host').EnterMaintenanceMode(0)
看看Getting started with VMwares ESXi/vSphere API in Python。
To get a VM object or a list of objects you can use the searchIndex class. The class had methods to search for VMs by UUID, DNS name, IP address or datastore path.
希望有两种方法可以在 vCenter 中查找对象:
- FindByUuid(虚拟机|主机)
- FindByDatastorePath(虚拟机)
- FindByDnsName(虚拟机|主机)
- FindByIp(虚拟机|主机)
- FindByInventoryPath(托管实体:VM|主机|资源池|..)
- FindChild(托管实体)
其中许多还具有 FindAll..
允许更广泛查找的方法。
对于这种特殊情况,您可以使用 FindByDnsName
来查找您的主机。
searcher = si.content.searchIndex
host = searcher.FindByDnsName(dnsName='test-esxi-host', vmSearch=False)
host.EnterMaintenanceMode(0)
此代码要求您使用具有 Host.Config.Maintenance
权限的用户向 vCenter (@SmartConnectNoSSL
) 进行身份验证。
最后你可以让你的主机退出维护模式:host.ExitMaintenanceMode(0)