PyVmomi 初体验

  做为一个VMware的员工,一直用命令行操做,终于被迫须要使用pyvmomi了,体验了一下,文档不多,摸索起来略有费劲儿 ,赶忙把心得记录下来。linux

1. PyVmomi能够在esxi host上面直接用,也能够在任何的linux系统上用,远程链接到VC或者host上进行操做。vim

2. 若是要操做vDS Swtich,必需要链接到VC上进行建立,不然在host上直接操做会失败,并在hostd.log里产生以下的异常:app

2018-02-27T06:45:07.442Z verbose hostd[1001392607] [Originator@6876 sub=PropertyProvider opID=9c8882ef user=root] [RecordAndNotifyChangeInt] No listeners on haTask-ha-folder-network-vim.Folder.createDistributedVirtualSwitch-2021163135 - bailing outdom

2018-02-27T06:45:07.443Z info hostd[1001392607] [Originator@6876 sub=Default opID=9c8882ef user=root] AdapterServer caught exception: N5Vmomi5Fault12NotSupported9ExceptionE(Message is: ,
--> Fault cause: vmodl.fault.NotSupported
--> Fault Messages are:
--> (null)
--> )

ide

3. 经过linux VM 链接到VC,建立vDS Switch的代码:函数

两个经常使用到的函数写在最前面.net

 

def wait_for_task(task, actionName='job', hideResult=False):
   """
   Waits and provides updates on a vSphere task
   """
   while task.info.state == vim.TaskInfo.State.running:
   time.sleep(2)
   if task.info.state == vim.TaskInfo.State.success:
      if task.info.result is not None and not hideResult:
         out = '%s completed successfully, result: %s' % (actionName, task.info.result)
         print (out)
      else:
         out = '%s completed successfully.' % actionName
         print (out)
   else:
      out = '%s did not complete successfully: %s' % (actionName, task.info.error)
      raise task.info.error
      print (out)
   return task.info.result命令行

def get_obj(content, vimtype, name):
   """
   Get the vsphere object associated with a given text name
   """ 
   obj = None
   container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
   for c in container.view:
      if c.name == name:
         obj = c
      break
   return objip

 

正文开始ssl

import ssl
import pyVim
import pyVim.connect
if hasattr(ssl, '_create_unverified_context'):
    context = ssl._create_unverified_context()
else:
    context = None
 
si = pyVim.connect.SmartConnect(host=<vc_ip>, user=<username>, pwd=<pwd>, port=int("443"),sslContext=context)
content = si.RetrieveContent()
root = content.rootFolder
dc = root.childEntity
if not dc:  //若是是第一次链接VC,并无建立datastore,则须要建立一个心得datastore。
    dc1 = root.CreateDatacenter('dc1')
else:
    dc1 = dc[0]
#链接esxi host并把host 添加到datastore中
spec = vim.host.ConnectSpec(force=True, hostName=<host>, userName=xxx, password=xxx, password='ca$hc0w', sslThumbprint=None)
task = dc1.hostFolder.AddStandaloneHost(spec=spec, addConnected=True)
#第一次添加胡遇到sslException,须要从新添加一下.

>>> wait_for_task(task)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 16, in wait_for_task
pyVmomi.VmomiSupport.SSLVerifyFault: (vim.fault.SSLVerifyFault) {
dynamicType = <unset>,
dynamicProperty = (vmodl.DynamicProperty) [],
msg = "Authenticity of the host's SSL certificate is not verified.",
faultCause = <unset>,
faultMessage = (vmodl.LocalizableMessage) [],
selfSigned = false,
thumbprint = 'C7:53:4B:CE:A7:0E:9F:67:7C:53:46:8E:AC:11:F6:D4:B2:D5:46:3C'
}

>>> spec = vim.host.ConnectSpec(force=True, hostName=<host>, userName=xxx, password=xxx, sslThumbprint='C7:53:4B:CE:A7:0E:9F:67:7C:53:46:8E:AC:11:F6:D4:B2:D5:46:3C')
>>> task = dc1.hostFolder.AddStandaloneHost(spec=spec, addConnected=True)
>>> wait_for_task(task)
job completed successfully, result: 'vim.ComputeResource:domain-s178'
'vim.ComputeResource:domain-s178'    #第二次添加成功

>>> host = get_obj(content, [vim.HostSystem], <hostname>)
>>> host
'vim.HostSystem:host-180'
>>> dvs_config_spec.uplinkPortPolicy = vim.DistributedVirtualSwitch.NameArrayUplinkPortPolicy()
>>> uplink_port_names = ['uplink0']
>>> dvs_config_spec.uplinkPortPolicy.uplinkPortName = uplink_port_names
>>> dvs_config_spec.maxPorts = 2000
>>> pnic_spec = vim.dvs.HostMember.PnicSpec()
>>> pnic_spec.pnicDevice = 'vmnic4'
>>> pnic_specs.append(pnic_spec)
>>> dvs_host_config = vim.dvs.HostMember.ConfigSpec()
>>> dvs_host_config.operation = vim.ConfigSpecOperation.add
>>> dvs_host_config.host=host
>>> dvs_host_configs.append(dvs_host_config)
>>> dvs_host_config.backing = vim.dvs.HostMember.PnicBacking()
>>> dvs_host_config.backing.pnicSpec = pnic_specs
>>> dvs_config_spec.host = dvs_host_configs
>>> dvs_create_spec.configSpec = dvs_config_spec
>>> dc = root.childEntity[0]
>>> network_folder = dc.networkFolder
>>>
>>> task = network_folder.CreateDVS_Task(dvs_create_spec)
>>> wait_for_task(task)
job completed successfully, result: 'vim.dvs.VmwareDistributedVirtualSwitch:dvs-186'
'vim.dvs.VmwareDistributedVirtualSwitch:dvs-186'
>>>

至此已经成功的建立了vds switch到esxi host上了。

在host上用命令行查看  esxcfg-vswitch -l:

DVS Name Num Ports Used Ports Configured Ports MTU Uplinks
vds111 3236 3 512 1500 vmnic4

DVPort ID In Use Client
0 1 vmnic4

但能够发现,DVPort ID 并非我给出的uplink0, 并且并无vm的portid建立出来。待续。

相关文章
相关标签/搜索