目录

oslo.vmware

oslo.vmware 是 Openstack 的通用模块, 用于连接/获取/操作 vCenter 上的实体资源(Datacenter/CLuster/Host/VirtualMachine…等). Openstack Nova Project 具有一定的 Hypervisor 异构能力, 到 /opt/stack/nova/nova/virt 路径下可以看见其所支持的虚拟化类型包括了 hyperv/libvirt/xenapi/vmwareapi . 其中 vmwareapi 主要由 oslo.vmware 来提供基础的接口实现, Nova Project 在此基础上做了进一步的封装和重构.

Connect to vCenter Server

关于如何连接和获取 vCenter 实体资源对象的信息, 在 Python Module_oslo.vmware_连接 vCenter 一文中作了介绍, 通过 oslo_vmware.api Module 的 class VMwareAPISession 来完成, Return session 对象 . EXAMPLE:

  1. from oslo_vmware import api
  2. from oslo_vmware import vim_util
  3. session = api.VMwareAPISession(
  4. '<vCenter_Server_IPAddress>',
  5. '<server_username>',
  6. '<server_password>',
  7. 1,
  8. 0.1)

Create VirtualMachine for vCenter

在 vCenter 上创建虚拟机通过调用 Folder.CreateVM_Task() 来实现, 然后使用 VirtualMachine managed object 的属性和方法来配置这个虚拟机.

Folder.CreateVM_Task() 方法使 用 一 个 VirtualMachineConfigSpec 数据对象作为参数。VirtualMachineConfigSpec 允许你设定创建虚拟机的属性信息.你还必须指定一个 Host 或一个 ResourcePool(或两者都指定)。虚拟机需要占用 HostResourcePool 里的 CPU 和内存。

  1. Folder.CreateVM_Task(_this, config, pool, host)
  2. # _this(ManagedObjectReference) – 文件夹,你想放置虚拟机的文件夹
  3. # config(VirtualMachineConfigSpec) – 虚拟机配置讯息,数据对象明确了CPU,内存,网络等等信息。
  4. # pool(ManagedObjectReference to a ResourcePool) – 资源池,虚拟机获得从中获得资源。
  5. # host(ManagedObjectReference to a Host) - 主机,代表了虚拟机运行的目标主机。

NOTE: 假如你在一个独立的 ESXi 主机上应用 Folder.CreateVM_Task() 方法, 可以省略 host 参数。假如目标主机是 VMware DRS Cluster 里的一部分, host 参数是可选的. 假如没有指定主机,系统自动选择一个。

EXAMPLE:

  1. # 获取 Datacenter 资源清单
  2. datacenter = session.invoke_api(
  3. vim_util,
  4. 'get_objects',
  5. session.vim,
  6. 'Datacenter',
  7. 100)
  8. # 选择创建虚拟机的目标 Datacenter
  9. datacenter = datacenter.objects[1]
  10. # 选择创建虚拟机的目标 Folder
  11. vmFolder = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
  12. datacenter.obj,
  13. 'vmFolder')
  14. # 获取 Cluster 资源清单
  15. computeResource = session.invoke_api(
  16. vim_util,
  17. 'get_objects',
  18. session.vim,
  19. 'ComputeResource',
  20. 100)
  21. # 选择创建虚拟机的目标 Cluster
  22. cluster = computeResource.objects[2]
  23. # 选择创建虚拟机的目标 ResourcePool
  24. resourcePool = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
  25. cluster.obj,
  26. 'resourcePool')
  27. # 获取虚拟机配置信息对象
  28. client_factory = session.vim.client.factory
  29. config_spec = client_factory.create('ns0:VirtualMachineConfigSpec')
  30. # 设定虚拟机配置信息
  31. import uuid
  32. instance_uuid = str(uuid.uuid4())
  33. data_store_name = 'datastore1'
  34. config_spec.name = 'jmilkfan_vm'
  35. config_spec.guestId = 'otherGuest'
  36. config_spec.instanceUuid = instance_uuid
  37. vm_file_info = client_factory.create('ns0:VirtualMachineFileInfo')
  38. vm_file_info.vmPathName = "[" + data_store_name + "]"
  39. config_spec.files = vm_file_info
  40. tools_info = client_factory.create('ns0:ToolsConfigInfo')
  41. tools_info.afterPowerOn = True
  42. tools_info.afterResume = True
  43. tools_info.beforeGuestStandby = True
  44. tools_info.beforeGuestShutdown = True
  45. tools_info.beforeGuestReboot = True
  46. config_spec.tools = tools_info
  47. config_spec.numCPUs = int(instance.vcpus) = 1
  48. config_spec.numCoresPerSocket = int(extra_specs.cores_per_socket) = 1
  49. config_spec.memoryMB = int(instance.memory_mb) = 512
  50. extra_config = []
  51. opt = client_factory.create('ns0:OptionValue')
  52. opt.key = "nvp.vm-uuid"
  53. opt.value = instance_uuid
  54. extra_config.append(opt)
  55. config_spec.extraConfig = extra_config
  56. # 创建虚拟机
  57. vm_create_task = session.invoke_api(session.vim,
  58. "CreateVM_Task",
  59. vmFolder['vmFolder'],
  60. config=config_spec,
  61. pool=resourcePool['resourcePool'])

ERROR 1: 对象不支持该操作

TSG: 检查 Datacenter 和 Cluster 是否为有效的清单对象, 该例子中的 Datacenter:ECONE 和 Cluster:cluster 均为拥有 Host 且正常运作的资源对象.

  1. In [190]: datacenter.objects[1]
  2. Out[190]:
  3. (ObjectContent){
  4. obj =
  5. (obj){
  6. value = "datacenter-2"
  7. _type = "Datacenter"
  8. }
  9. propSet[] =
  10. (DynamicProperty){
  11. name = "name"
  12. val = "ECONE"
  13. },
  14. }
  15. In [191]: computeResource.objects[2]
  16. Out[191]:
  17. (ObjectContent){
  18. obj =
  19. (obj){
  20. value = "domain-c7"
  21. _type = "ClusterComputeResource"
  22. }
  23. propSet[] =
  24. (DynamicProperty){
  25. name = "name"
  26. val = "cluster"
  27. },
  28. }

ERROR 2: 配置参数错误 config.fiile

TSG: 检查 config_spec 的参数是否符合创建虚拟机的基本要求

NOTE 1: session.invoke_api() 方法, 实际上是调用了指定 module 中的 method, 再将参数集合中其余的参数作为 method 的实参传递到过去, 最后返回一个 API CALL 的响应.

HELP:

  1. Help on method invoke_api in module oslo_vmware.api:
  2. invoke_api(self, module, method, *args, **kwargs) method of oslo_vmware.api.VMwareAPISession instance
  3. Wrapper method for invoking APIs.
  4. The API call is retried in the event of exceptions due to session
  5. overload or connection problems.
  6. :param module: module corresponding to the VIM API call
  7. :param method: method in the module which corresponds to the
  8. VIM API call
  9. :param args: arguments to the method
  10. :param kwargs: keyword arguments to the method
  11. :returns: response from the API call
  12. :raises: VimException, VimFaultException, VimAttributeException,
  13. VimSessionOverLoadException, VimConnectionException

所以如果你感兴趣的话, 可以到 module 中看看该 method 是怎么实现的.

NOTE 2: 需要注意的是, 当 module == session.vim 时, 实际上 module 是一个 VIM Object , 所以在 module 中并没有 method 的实现, 而是在 class VIM 中实现.

常用的虚拟机配置项

  1. # /opt/stack/nova/nova/virt/vmwareapi/vm_util.py +204 ==> get_vm_create_spec()
  2. client_factory = session.vim.client.factory
  3. config_spec = client_factory.create('ns0:VirtualMachineConfigSpec')
  4. config_spec.name name
  5. config_spec.guestId = os_type
  6. # The name is the unique identifier for the VM
  7. config_spec.instanceUuid = instance.uuid
  8. config_spec.annotation = metadata
  9. # Set the HW version
  10. config_spec.version = extra_specs.hw_version
  11. # Allow nested hypervisor instances to host 64 bit VMs.
  12. if os_type in ("vmkernel5Guest", "vmkernel6Guest", "windowsHyperVGuest"):
  13. config_spec.nestedHVEnabled = "True"
  14. # Append the profile spec
  15. if profile_spec:
  16. config_spec.vmProfile = [profile_spec]
  17. # Datastore for VM
  18. vm_file_info = client_factory.create('ns0:VirtualMachineFileInfo')
  19. vm_file_info.vmPathName = "[" + data_store_name + "]"
  20. config_spec.files = vm_file_info
  21. # VMTools for VM
  22. tools_info = client_factory.create('ns0:ToolsConfigInfo')
  23. tools_info.afterPowerOn = True
  24. tools_info.afterResume = True
  25. tools_info.beforeGuestStandby = True
  26. tools_info.beforeGuestShutdown = True
  27. tools_info.beforeGuestReboot = True
  28. config_spec.tools = tools_info
  29. # CPU Info for VM
  30. config_spec.numCPUs = int(instance.vcpus)
  31. # Memory for VM
  32. config_spec.memoryMB = int(instance.memory_mb)

删除虚拟机

删除虚拟机的逻辑就相对简单了:

1. 找到虚拟机

2. 执行删除.

  1. # 获取虚拟机的资源清单
  2. vms = session.invoke_api(vim_util,
  3. 'get_objects',
  4. session.vim,
  5. 'VirtualMachine',
  6. 100)
  7. # 获取该虚拟机的 instanceUuid
  8. vms.objects[10]
  9. summary = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
  10. vms.objects[10].obj,
  11. 'summary')
  12. instance_uuid = summary['summary'].config.instanceUuid
  13. # 通过 instanceUuid 获取虚拟机实体对象
  14. vm = session.invoke_api(session.vim,
  15. "FindAllByUuid",
  16. session.vim.service_content.searchIndex,
  17. uuid=instance_uuid,
  18. vmSearch=True,
  19. instanceUuid=True)
  20. vm_ref = vm[0]
  21. # 删除虚拟机
  22. destroy_task = session.invoke_api(session.vim,
  23. "Destroy_Task",
  24. vm_ref)

当然在实际生产环境中, 我们会将之前创建的或者已经拥有的虚拟机资产信息存放到数据库中. 所以获取 instanceUuid 的途径就变成了从数据库获取.

Openstack_通用模块_Oslo_vmware 创建/删除 vCenter 虚拟机的更多相关文章

  1. Openstack_通用模块_Oslo_vmware 创建 vCenter 虚拟机快照

    创建虚拟机快照 vSphere Create Snapshot 文档 Snapshot 是虚拟机磁盘文件(VMDK)在某个点及时的复本.包含了虚拟机所有虚拟磁盘上的数据状态和这个虚拟机的电源状态(on ...

  2. Openstack_通用模块_Oslo_vmware 创建 vSS PortGroup

    目录 目录 vSS vSSPG vSphere SDK 中相关的网络对象 创建 vSS PortGroup vSS & vSSPG vSS(Standard vSwitch 标准交换机) 为在 ...

  3. VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机

    目录 目录 软件环境 前言 Openstack 接口驱动 使用 KVM 在 Compute Node 上创建虚拟机的流程 使用 VCDirver 在 vCenter 上创建虚拟机的流程 配置 vCen ...

  4. 如何在Windows中批量创建VMware的虚拟机

    在最近的工作中,需要创建一批类似的机器.在VMware中创建了模板,然后根据自义向导部署之后,发现可以快速的完成新vm的部署.系统中的计算机名,IP地址都可以自动的完成更新.唯一的缺点是,系统自带的向 ...

  5. 使用Windows Azure创建Linux系统虚拟机-下

    如何将数据磁盘附加到新虚拟机 您的应用程序可能需要存储数据.要这样设置,您可以将数据磁盘添加到先前创建的虚拟机.要做到这一点,最简单的方法是将空数据磁盘连接到本机. 在Linux上,磁盘资源通常由Az ...

  6. Idea多模块工程创建——继承、聚合

    一.工程介绍 淘淘网上商城是一个综合性的B2C平台,类似京东商城.天猫商城.会员可以在商城浏览商品.下订单,以及参加各种活动. 管理员.运营可以在平台后台管理系统中管理商品.订单.会员等. 客服可以在 ...

  7. Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建

    maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...

  8. Spring Boot 多模块项目创建与配置 (一) (转)

    Spring Boot 多模块项目创建与配置 (一) 最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都 ...

  9. Spring Boot 多模块项目创建与配置 (一)

    最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都使用spring boot框架.之前有零零散散学过一些 ...

随机推荐

  1. IDEA--错误:找不到或无法加载XXXXX--解决方法--创建javafx或其他项目出现的问题

    今天一上午超厂长在学习javafx的时候,总是创建一个然后运行就会出现 出现错误:找不到或无法加载主类 找了二个小时,都说是jdk或者其他环境配置问题 按照那些改了也没用重新创建一个也提示出现错误:找 ...

  2. django登录注册验证之密码包含特殊字符,确认密码一致实现,Form验证

    Form验证的原理 首先用户在注册界面提交表单,后台收到表单之后通过request.post取到数据然后传入已经写好的Form类 执行obj.is_valid()这里的obj为Form的实例,在For ...

  3. python数据结构:pandas(1)

    废话不说,直接上干货 一.数据结构 (1)Series:一维数组,与Numpy中的一维array类似.二者与Python基本的数据结构List也很相近.Series如今能保存不同种数据类型,字符串.b ...

  4. python-xss攻击和单例模式

    1.python中单例模式 class Foo: instance = None def __new__(cls, *args, **kwargs): if not Foo.instance: Foo ...

  5. man - 格式化并显示在线帮助手册页

    总览 man [-acdfFhkKtwW] [-m 系统名] [-p <前处理程序>] [-C <配置文件>] [-M <路径>] [-P <浏览方式> ...

  6. Nginx1.3.15导致Wordpress,Drupal等框架无限重定向的解决方案

    Wordpress建立的站点出现无限循环重定向问题.很多人遇到这个问题,并不是单纯Wordpress,Drupal, PHPCake等框架也都遇到同样的问题. 新版本的Nginx在收到 http:// ...

  7. 10年前文章_嵌入开发使用的服务器配置 tftp ,http,nfs

    tftp server 安装 dnsmasq,  在目录 /etc/dnsmasq.d 下生成包含如下内容的配置文件 tftp.conf enable-tftptftp-root=/tftpboot ...

  8. jemter简单测试方式

    一.简介 Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率. **开源,他是一款开源的免费软件,使用它你不需要支付任何费用, * ...

  9. spring jpa 带参数分页查询(一)

    1.写个接口继承JpaRepository @NoRepositoryBean public interface BaseRepository<T,PK extends Serializable ...

  10. PHP使用HighChart生成股票K线图详解

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...