Как перевести хост ESXi в режим обслуживания с помощью pyvmomi?

Меня попросили написать код на Python, который переводил бы хост VMWare ESXi в режим обслуживания. Мне дали имя виртуального центра, test-vc, и имя хоста ESXi, test-esxi-host, и эту ссылку...

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)

person Red Cricket    schedule 22.10.2018    source источник
comment
Мне кажется, что это метод хоста. Следует ожидать, что вы сначала определите свой хост (класс HostSystem), а затем запустите этот метод в своем экземпляре.   -  person Cheche    schedule 23.10.2018
comment
Спасибо @Cheche, я попытаюсь понять, как это сделать. Вы раньше работали с этим vmware PyVmomi? Я не могу найти хорошую документацию по нему.   -  person Red Cricket    schedule 23.10.2018
comment
Да, я работал в основном с виртуальными машинами. Я посмотрю завтра, может быть, я могу вам помочь. Извините, но сейчас у меня нет доступа к коду.   -  person Cheche    schedule 23.10.2018


Ответы (1)


Взгляните на Получение началось с VMwares ESXi/vSphere API в Python.

Чтобы получить объект виртуальной машины или список объектов, вы можете использовать класс searchIndex. У класса были методы для поиска виртуальных машин по UUID, DNS-имени, IP-адресу или пути к хранилищу данных.

Надеюсь, есть несколько способов поиска объектов в vCenter:

  • FindByUuid (ВМ|Хост)
  • FindByDatastorePath (ВМ)
  • FindByDnsName (ВМ | Хост)
  • FindByIp (ВМ|Хост)
  • FindByInventoryPath (управляемый объект: ВМ|Хост|Пулы ресурсов|..)
  • FindChild (управляемая сущность)

Многие из них также имеют FindAll.. методы, которые позволяют осуществлять гораздо более широкий поиск.

В этом конкретном случае вы можете использовать FindByDnsName для поиска вашего хоста.

searcher = si.content.searchIndex
host = searcher.FindByDnsName(dnsName='test-esxi-host', vmSearch=False)
host.EnterMaintenanceMode(0)

Этот код требует, чтобы вы прошли аутентификацию в vCenter (@SmartConnectNoSSL) с пользователем с привилегиями Host.Config.Maintenance.

Наконец, вы можете вывести свой хост из режима обслуживания с помощью: host.ExitMaintenanceMode(0)

person Cheche    schedule 23.10.2018