pyvmomi: добавление.vmx в инвентарь в качестве шаблона и перемещение в определенную папку
РЕДАКТИРОВАТЬ: перекрестная вставка в Reddit в R / VMware здесь
Я новичок в использовании VMWare API и специально пытаюсь использовать pyVmomi. Мне очень трудно понять, как все это сочетается. То, что я пытаюсь сделать, это просто: 1. взять vmx/vmdk, который находится в хранилище данных, и добавить его в инвентарь (RegisterVM_Task?) 2. Оказавшись в инвентаре, преобразовать в шаблон. Если 2 выше можно объединить в 1 процесс, даже лучше. В основном, все, что я смог сделать, это подключиться к моей конечной точке vcenter и получить действительное соединение через pyVmomi. Вот соответствующий код, который я имею и пытаюсь использовать без успеха:
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
import requests
import ssl
#hacky way around SSL certificate checks in Python 2.7.9+
requests.packages.urllib3.disable_warnings()
try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
pass
else:
ssl._create_default_https_context = _create_unverified_https_context
# Create connection to vcenter
hostname = 'vcenter'
username = 'username'
passwd = 'password'
try:
si = SmartConnect(host=hostname, user=username, pwd=passwd, port=int(443))
except IOError, e:
pass
if not si:
print "Could not connect to the specified host using specified username and password"
# Do stuff
content = si.RetrieveContent()
si.content.rootFolder.RegisterVM_Task("[dvsolidfire01-vmware-general] packer_images/centos7-vmware-2015-10-13/devit-centos7-vmware-2015-10-13.vmx", "template-test", asTemplate=True)
Для чего это возвращает vim.Task:task-XXXXX, и затем я вижу фактическую задачу в консоли vcenter, которая завершается с ошибкой: "Указанный параметр был неверным: host", поэтому, если я пытаюсь указать хост / кластер Строка, я получаю следующую ошибку: "TypeError: Для" хоста "ожидаемый тип vim.HostSystem, но получил str" ОК, так как мне указать тип vim.HostSystem? И правильный ли мой синтаксис / процесс для того, что я пытаюсь сделать? Это довольно сложно понять без каких-либо примеров или документации. Любая помощь будет оценена! (да, я видел образцы pyvmomi, но они мне здесь не помогают). Спасибо!
Я достиг именно того, что я описываю через PowerCLI с помощью кода ниже:
# Add VMX to Inventory and convert to template
$vCenter='vcenter'
$vCenterUser='username'
$vCenterUserPassword='password'
write-host "Connecting to vCenter Server $vCenter" -foreground green
Connect-viserver $vCenter -user $vCenterUser -password $vCenterUserPassword -WarningAction 0
# Set Cluster to MyCluster
$Cluster = "MyCluster"
# Get random ESX host from Cluster list
$ESXHost = Get-Cluster $Cluster | Get-VMHost | select -First 1
write-host "Adding to inventory and converting to template..." -foreground green
$VM = New-VM -VMFilePath $VMXFile -VMHost $ESXHost
$template = Get-VM $VM | Set-VM -ToTemplate -Name "Template-Test" -Confirm:$false
# Move template to Templates folder
$folder = Get-Folder -ID "Folder-group-v22506"
Move-Inventory -Item $template -Destination $folder
Мне действительно нужно, чтобы это запускалось с хоста Linux, поэтому pyvmomi предпочтительнее. Я не уверен, почему документация или использование настолько сложны и неинтуитивны по сравнению с PowerCLI. Любая помощь будет очень ценится здесь!
Спасибо!
РЕШЕНО: Итак, я понял это, и, надеюсь, мои испытания и разочарования приведут к тому, что другие могут использовать в своих поисках, если они наткнутся на это.
Для тех, кому может понадобиться что-то подобное, я постарался документировать это как можно лучше. Код относительно прост в том, что я не использую классы и не создаю экземпляры своих собственных объектов (пока). Текущая версия выполнила то, что мне нужно (на данный момент). Вот так:
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
import atexit
import time
def main():
def get_uuid(vmfolder, vmname, vmstatus):
"""
Get UUID of specific orphaned vm from vmfolder ManagedObject
"""
# if this is a group it will have children, if so iterate through all the VMs in said parent
if hasattr(vmfolder, 'childEntity'):
vmlist = vmfolder.childEntity
for vm in vmlist:
summary = vm.summary
if summary.config.name == vmname and summary.runtime.connectionState == vmstatus:
return summary.config.instanceUuid
# Environment vars
hostname = 'vcenter'
username = 'username'
from getpass import getpass
passwd = getpass("enter vcenter pass: ")
#hacky workaround to ssl cert warnings in Python 2.7.9+
#http://www.errr-online.com/index.php/tag/pyvmomi/
import requests, ssl
requests.packages.urllib3.disable_warnings()
try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
pass
else:
ssl._create_default_https_context = _create_unverified_https_context
# Make connection to vcenter
try:
si = SmartConnect(host=hostname, user=username, pwd=passwd, port=int(443))
except IOError, e:
pass
if not si:
print "Could not connect to the specified host using specified username and password"
atexit.register(Disconnect, si)
# Get vcenter content object
content = si.RetrieveContent()
# Get list of DCs in vCenter and set datacente to the vim.Datacenter object corresponding to the "DC01" DC
datacenters = content.rootFolder.childEntity
for dc in datacenters:
if dc.name == "DC01":
datacenter = dc
# Get List of Folders in the "DC01" DC and set tfolder to the vim.Folder object corresponding to the "Templates" folder
dcfolders = datacenter.vmFolder
vmfolders = dcfolders.childEntity
for folder in vmfolders:
if folder.name == "Templates":
tfolder = folder
# Set "Discovered virtual machine" folder to orphan_folder for future use.
elif folder.name == "Discovered virtual machine":
orphan_folder = folder
# Get vim.HostSystem object for specific ESX host to place template on
esxhost = content.searchIndex.FindByDnsName(None, "dvesx10.dev.tsi.lan", vmSearch=False)
# Clean up orphaned VM from packer build (since they don't do it for some reason)
orphan_uuid = get_uuid(orphan_folder, "devit-centos7-vmware-2015-10-15", "orphaned")
if orphan_uuid not None:
vm = content.searchIndex.FindByUuid(None, orphan_uuid, True, True)
vm.Destroy_Task()
# Wait 10 seconds until VMWare updates that the orphaned item has been deleted before trying to create a new one
time.sleep(10)
# Wow, we can actually do stuff now! Add the VMX in the specified path to the inventory as a template within the "Templates" folder
tfolder.RegisterVM_Task("[dvsolidfire01-vmware-general] packer_images/centos7-vmware-2015-10-15/devit-centos7-vmware-2015-10-15.vmx", "CentOS 7 - 2015Q4 - Test", asTemplate=True, host=esxhost)
if __name__ == "__main__":
main()