Openstack_通用模块_Oslo_vmware 创建/删除 vCenter 虚拟机

简介: 目录目录oslovmwareConnect to vCenter ServerCreate VirtualMachine for vCenter常用的虚拟机配置项删除虚拟机oslo.

目录

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:

from oslo_vmware import api 
from oslo_vmware import vim_util

session = api.VMwareAPISession(
            '<vCenter_Server_IPAddress>',
            '<server_username>',
            '<server_password>',
             1,  
             0.1)

Create VirtualMachine for vCenter

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

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

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

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

# 获取 Datacenter 资源清单
datacenter  = session.invoke_api(
                            vim_util,        
                            'get_objects',              
                            session.vim,                 
                            'Datacenter',                
                            100) 

# 选择创建虚拟机的目标 Datacenter
datacenter = datacenter.objects[1]

# 选择创建虚拟机的目标 Folder
vmFolder = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
                              datacenter.obj,
                              'vmFolder')

# 获取 Cluster 资源清单
computeResource  = session.invoke_api(
                            vim_util,        
                            'get_objects',              
                            session.vim,                 
                            'ComputeResource',                
                            100) 

# 选择创建虚拟机的目标 Cluster
cluster =  computeResource.objects[2]

# 选择创建虚拟机的目标 ResourcePool
resourcePool = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
                                  cluster.obj,
                                  'resourcePool')

# 获取虚拟机配置信息对象
client_factory = session.vim.client.factory
config_spec = client_factory.create('ns0:VirtualMachineConfigSpec')

# 设定虚拟机配置信息
import uuid
instance_uuid = str(uuid.uuid4())
data_store_name = 'datastore1'

config_spec.name = 'jmilkfan_vm'
config_spec.guestId = 'otherGuest'
config_spec.instanceUuid = instance_uuid
vm_file_info = client_factory.create('ns0:VirtualMachineFileInfo')
vm_file_info.vmPathName = "[" + data_store_name + "]"
config_spec.files = vm_file_info

tools_info = client_factory.create('ns0:ToolsConfigInfo')
tools_info.afterPowerOn = True
tools_info.afterResume = True
tools_info.beforeGuestStandby = True
tools_info.beforeGuestShutdown = True
tools_info.beforeGuestReboot = True
config_spec.tools = tools_info

config_spec.numCPUs = int(instance.vcpus) = 1
config_spec.numCoresPerSocket = int(extra_specs.cores_per_socket) = 1
config_spec.memoryMB = int(instance.memory_mb) = 512

extra_config = []
opt = client_factory.create('ns0:OptionValue')
opt.key = "nvp.vm-uuid"
opt.value = instance_uuid
extra_config.append(opt)
config_spec.extraConfig = extra_config

# 创建虚拟机
vm_create_task = session.invoke_api(session.vim, 
                                    "CreateVM_Task", 
                                    vmFolder['vmFolder'], 
                                    config=config_spec, 
                                    pool=resourcePool['resourcePool'])

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

In [190]: datacenter.objects[1]
Out[190]: 
(ObjectContent){
   obj = 
      (obj){
         value = "datacenter-2"
         _type = "Datacenter"
      }
   propSet[] = 
      (DynamicProperty){
         name = "name"
         val = "ECONE"
      },
 }

In [191]:  computeResource.objects[2]
Out[191]: 
(ObjectContent){
   obj = 
      (obj){
         value = "domain-c7"
         _type = "ClusterComputeResource"
      }
   propSet[] = 
      (DynamicProperty){
         name = "name"
         val = "cluster"
      },
 }

ERROR 2: 配置参数错误 config.fiile
TSG: 检查 config_spec 的参数是否符合创建虚拟机的基本要求

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

Help on method invoke_api in module oslo_vmware.api:

invoke_api(self, module, method, *args, **kwargs) method of oslo_vmware.api.VMwareAPISession instance
    Wrapper method for invoking APIs.

    The API call is retried in the event of exceptions due to session
    overload or connection problems.

    :param module: module corresponding to the VIM API call
    :param method: method in the module which corresponds to the
                   VIM API call
    :param args: arguments to the method
    :param kwargs: keyword arguments to the method
    :returns: response from the API call
    :raises: VimException, VimFaultException, VimAttributeException,
             VimSessionOverLoadException, VimConnectionException

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

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

常用的虚拟机配置项

# /opt/stack/nova/nova/virt/vmwareapi/vm_util.py +204 ==> get_vm_create_spec()

client_factory = session.vim.client.factory
config_spec = client_factory.create('ns0:VirtualMachineConfigSpec')

config_spec.name name
config_spec.guestId = os_type

# The name is the unique identifier for the VM
config_spec.instanceUuid = instance.uuid
config_spec.annotation = metadata

# Set the HW version
config_spec.version = extra_specs.hw_version

# Allow nested hypervisor instances to host 64 bit VMs.
if os_type in ("vmkernel5Guest", "vmkernel6Guest", "windowsHyperVGuest"):
    config_spec.nestedHVEnabled = "True"

# Append the profile spec
if profile_spec:
    config_spec.vmProfile = [profile_spec]

# Datastore for VM
vm_file_info = client_factory.create('ns0:VirtualMachineFileInfo')
vm_file_info.vmPathName = "[" + data_store_name + "]"
config_spec.files = vm_file_info

# VMTools for VM
tools_info = client_factory.create('ns0:ToolsConfigInfo')
tools_info.afterPowerOn = True
tools_info.afterResume = True
tools_info.beforeGuestStandby = True
tools_info.beforeGuestShutdown = True
tools_info.beforeGuestReboot = True
config_spec.tools = tools_info

# CPU Info for VM
config_spec.numCPUs = int(instance.vcpus)

# Memory for VM
config_spec.memoryMB = int(instance.memory_mb)

删除虚拟机

删除虚拟机的逻辑就相对简单了:
1. 找到虚拟机
2. 执行删除.

# 获取虚拟机的资源清单
vms  = session.invoke_api(vim_util,        
                            'get_objects',              
                            session.vim,                 
                            'VirtualMachine',                
                            100) 

# 获取该虚拟机的 instanceUuid
vms.objects[10]

summary = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
                              vms.objects[10].obj,
                              'summary')

instance_uuid = summary['summary'].config.instanceUuid

# 通过 instanceUuid 获取虚拟机实体对象
vm = session.invoke_api(session.vim, 
                         "FindAllByUuid",
                         session.vim.service_content.searchIndex,
                         uuid=instance_uuid,
                         vmSearch=True,
                         instanceUuid=True)

vm_ref = vm[0]

# 删除虚拟机
destroy_task = session.invoke_api(session.vim, 
                                  "Destroy_Task", 
                                  vm_ref)

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

相关文章
|
1天前
|
存储 虚拟化
【2025最新】 神奇!VMware Workstation Pro虚拟机还原与删除功能,让你轻松应对各种场景!
删除和还原VMware虚拟机的操作步骤如下: **删除虚拟机:** 1. 选择要删除的虚拟机,右键点击并选择“移除”。 2. 这仅从列表中移除虚拟机,并未彻底删除。需前往VMware默认存储路径(如 `D:\VMware\data`),找到对应虚拟机文件夹并删除。 **还原虚拟机:** 1. 若误删虚拟机列表项目,可通过右键点击空白处,选择“打开”,找到保存虚拟机的路径文件夹。 2. 选择被删除虚拟机对应的 `.vmx` 配置文件并打开,即可在列表中恢复该虚拟机。 总结:VMware虚拟机可用于模拟多种操作系统和开发环境,掌握删除与还原技巧可提高使用效率。
31 8
【2025最新】 神奇!VMware Workstation Pro虚拟机还原与删除功能,让你轻松应对各种场景!
|
2天前
|
虚拟化
【2025最新】VMware Workstation Pro 虚拟机基础配置教程,方便你的神操作!
VMware Workstation Pro 是一款强大的虚拟化工具,本文简要介绍其基本配置与操作。安装后,用户可以通过“编辑菜单 &gt; 首选项”设置虚拟机保存路径、是否显示托盘图标等全局配置。新建虚拟机时,需选择操作系统类型、配置处理器、内存、网络和硬盘等参数。建议根据主机硬件性能合理分配资源,避免过度占用。创建完成后,用户可加载 ISO 镜像文件安装所需操作系统。通过这些步骤,您可以轻松搭建并管理多个虚拟环境。
28 8
【2025最新】VMware Workstation Pro 虚拟机基础配置教程,方便你的神操作!
|
2天前
|
存储 编解码 虚拟化
【2025最新】VMware Workstation Pro 虚拟机配置与安装VMware Tools 感受它的强大~
VMware Tools 是 VMware 虚拟机中自带的一种增强工具,能够显著提升虚拟机的性能和用户体验。它提供了优化的显卡驱动程序、文件共享与拖放功能、时间同步以及跨虚拟机和宿主机的复制粘贴功能。安装 VMware Tools 可以让虚拟机在 VMware 平台上运行得更加高效,并且对于老旧系统(如 Win98、Win2000、WinXP)也能提供必要的驱动支持。每个虚拟机都需要独立安装与其操作系统版本相匹配的 VMware Tools,以确保最佳兼容性和性能表现。
27 6
【2025最新】VMware Workstation Pro 虚拟机配置与安装VMware Tools 感受它的强大~
|
3月前
|
Ubuntu 网络安全 虚拟化
VMware虚拟机ping不通原因排查及分析
下面以 VMware 虚拟机为例进行介绍。
2186 3
|
2天前
|
Web App开发 安全 Linux
【独家揭秘2025】VMware Workstation Pro虚拟机:免费安装教程大放送,一键解锁操作系统模拟神器!
VMware Workstation Pro 是由威睿(VMware)公司开发的一款功能强大的桌面虚拟化软件,允许用户在同一台物理计算机上同时运行多个操作系统,如Windows、..
16 2
【独家揭秘2025】VMware Workstation Pro虚拟机:免费安装教程大放送,一键解锁操作系统模拟神器!
|
3月前
|
存储 SQL 数据库
虚拟化数据恢复—Vmware虚拟机误还原快照的数据恢复案例
虚拟化数据恢复环境: 一台虚拟机从物理机迁移到ESXI虚拟化平台,迁移完成后做了一个快照。虚拟机上运行了一个SQL Server数据库,记录了数年的数据。 ESXI虚拟化平台上有数十台虚拟机,EXSI虚拟化平台连接了一台EVA存储,所有的虚拟机都存放在EVA存储上。 虚拟化故障: 工组人员误操作将数年前迁移完成后做的快照还原了,也就意味着虚拟机状态还原到数年前,近几年数据都被删除了。 还原快照相当于删除数据,意味着部分存储空间会被释放。为了不让这部分释放的空间被重用,需要将连接到这台存储的所有虚拟机都关掉,需要将不能长时间宕机的虚拟机迁移到别的EXSI虚拟化平台上。
149 50
|
4月前
|
安全 虚拟化 数据中心
Xshell 连接 VMware虚拟机操作 截图和使用
Xshell 连接 VMware虚拟机操作 截图和使用
133 4
|
4月前
|
Linux 虚拟化
vmware虚拟机安装2024(超详细)
vmware虚拟机安装2024(超详细)
545 6
|
4月前
|
虚拟化 网络虚拟化 网络架构
虚拟机 VMware Workstation 16 PRO 的网络配置
虚拟机 VMware Workstation 16 PRO 的网络配置
156 2
|
5月前
|
存储 SQL 数据挖掘
虚拟化数据恢复—VMware虚拟机vmdk文件被误删除的数据恢复案例
虚拟化数据恢复环境: 某品牌服务器(部署VMware EXSI虚拟机)+同品牌存储(存放虚拟机文件)。 虚拟化故障: 意外断电导致服务器上某台虚拟机无法正常启动。查看虚拟机配置文件发现这台故障虚拟机除了磁盘文件以外其他配置文件全部丢失,xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。管理员联系VMware工程师寻求帮助。VMware工程师尝试新建一个虚拟机来解决故障,但发现ESXi存储空间不足。于是将故障虚拟机下的xxx-flat.vmdk磁盘文件删除,然后重建一个虚拟机并且分配固定大小的虚拟磁盘。