PyVmomi 初体验

  作为一个VMware的员工,一直用命令行操作,终于被迫需要使用pyvmomi了,体验了一下,文档很少,摸索起来略有费劲儿 ,赶紧把心得记录下来。

1. PyVmomi可以在esxi host上面直接用,也可以在任何的linux系统上用,远程连接到VC或者host上进行操作。

2. 如果要操作vDS Swtich,必须要连接到VC上进行创建,否则在host上直接操作会失败,并在hostd.log里产生如下的异常:

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 out

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)
--> )

3. 通过linux VM 连接到VC,创建vDS Switch的代码:

两个常用到的函数写在最前面

 

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 obj

 

正文开始

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创建出来。待续。

转载于:https://www.cnblogs.com/halfjuly/p/8479714.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值