第 2 章 Python 快速入门示例
2.1. Python 快速入门介绍
本章提供了一组示例,它们展示了使用 Python SDK 在一个基本 Red Hat Virtualization 环境中创建虚拟机的步骤。
本章中所使用的示例是基于 V3 Python SDK 的。
这些示例使用 ovirt-engine-sdk-python
软件包所提供的 ovirtsdk
Python 库。通过 Red Hat Subscription Manager 订阅 Red Hat Virtualization
权利池的系统可以获得这个软件包。如需了解更多关于通过订阅系统来下载软件的信息,请参阅 第 1.2 节 “安装 Python 软件开发套件”。
您还需要:
- 已经连接到网络中的 Red Hat Virtualization Manager。
- 一个已经被配置并连接到网络中的 Red Hat Virtualization Host。
- 包括需要在虚拟机上安装的操作系统的 ISO 镜像文件。
- 对组成 Red Hat Virtualization 环境的物理和逻辑项有一定的了解。
- 对 Python 编程语言有一定的了解。
所有 Python 示例中都包括了代表用户验证信息的占位符(USER 代表用户名,PASS 代表密码)。请确认 Python 代码中的相应信息满足您所在环境的用户验证要求。
Red Hat Virtualization Manager 会为每个资源的 id
属性生成一个 GUID。这里所使用的值可能会和您实际使用的 Red Hat Virtualization 环境中的值不同。
这些 Python 示例只包括基本的异常和错误处理逻辑。如需了解更多关于 SDK 的异常和错误处理信息,请参阅 ovirtsdk.infrastructure.errors
模块的 pydoc。
$ pydoc ovirtsdk.infrastructure.errors
2.2. 示例:使用 Python 访问 API 的进入点
ovirtsdk
Python 库提供了 API
类,它被作为 API 的进入点使用。
例 2.1. 使用 Python 访问 API 的进入点
这个 python 例子连接到 Red Hat Virtualization Manager(位于 rhevm.demo.redhat.com
)所提供的一个 REST API 实例(instance)上。如果连接成功,它会创建一个 API
类。如果需要断开连接,使用 API
类的 disconnect()
方法。
在这个示例中,提供给 API
类的构造函数的参数包括:
-
要连接到的 Manager 的
url
。 -
用来进行用户验证的用户的
username
。 -
用来进行用户验证的用户的
password
。 -
ca_file
(到证书的路径)。证书是 Manager 的证书颁发机构所颁发的文件,它可以通过https://[engine-fqdn]_ovirt-engine/services/pki-resource?resource=ca-certificate&format=_X509-PEM-CA
获得。
API
类的构造函数还支持其它参数。这个示例中只包括了必需的参数。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") print "Connected to %s successfully!" % api.get_product_info().name api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果连接成功,这个示例会显示以下信息:
Connected to Red Hat Enterprise Virtualization Manager successfully!
2.3. 示例:使用 Python 列出数据中心集合
API
类提供了访问数据中心集合(名为 datacenters
)的功能。这个集合包括了环境中的所有数据中心。
例 2.2. 使用 Python 列出数据中心集合
这个 Python 示例列出了 datacenters
集合中的所有数据中心。它同时还显示了集合中的每个数据中心的基本信息。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") dc_list = api.datacenters.list() for dc in dc_list: print "%s (%s)" % (dc.get_name(), dc.get_id()) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果环境中只包括 Default
数据中心,而且它还没有被激活,这个示例会输出以下信息:
Default (d8b74b20-c6e1-11e1-87a3-00163e77e2ed)
2.4. 示例:使用 Python 列出集群集合
API 类提供了访问集群集合(名为 clusters
)的功能。这个集合包括了环境中的所有集群。
例 2.3. 使用 Python 列出集群集合
这个 Python 示例列出了 clusters
集合中的集群。它同时还显示了集合中的每个集群的基本信息。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") c_list = api.clusters.list() for c in c_list: print "%s (%s)" % (c.get_name(), c.get_id()) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果环境中只包括 Default
集群,这个示例会输出以下信息:
Default (99408929-82cf-4dc7-a532-9d998063fa95)
2.5. 示例:使用 Python 列出逻辑网络集合
API
类提供了访问逻辑网络集合(名为 networks
)的功能。这个集合包括了环境中的所有逻辑网络。
例 2.4. 使用 Python 列出逻辑网络集合
这个 Python 示例列出了 networks
集合中的逻辑网络。它同时还显示了集合中的每个网络的基本信息。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API(url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") n_list = api.networks.list() for n in n_list: print "%s (%s)" % (n.get_name(), n.get_id()) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果环境中只包括默认的管理网络,这个示例会输出以下信息:
ovirtmgmt (00000000-0000-0000-0000-000000000009)
2.6. 示例:使用 Python 列出主机集合
API
类提供了访问主机集合(名为 hosts
)的功能。这个集合包括了环境中的所有主机。
例 2.5. 使用 Python 列出主机集合
这个 Python 示例列出了 hosts
集合中的主机。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API(url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") h_list = api.hosts.list() for h in h_list: print "%s (%s)" % (h.get_name(), h.get_id()) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果一个环境中只附加了一个名为 Atlantic
的主机,这个示例会输出以下信息:
Atlantic (5b333c18-f224-11e1-9bdd-00163e77e2ed)
2.7. 示例:列出 ISO 存储域中的 ISO 文件
API
类提供了访问存储域集合(名为 storagedomains
)的功能。这个集合包括了一个 files
集合来描述存储域中的文件。
例 2.6. 列出 ISO 存储域中的 ISO 文件
这个 Python 示例输出 Red Hat Virtualization 环境中的每个 ISO 存储域中的 ISO 文件列表。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") storage_domains = api.storagedomains.list() for storage_domain in storage_domains: if(storage_domain.get_type() == "iso"): print(storage_domain.get_name() + ":\n") files = storage_domain.files.list() for file in files: print(" %s" % file.get_name()) print() api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
2.8. 示例:列出虚拟机的大小
API
类提供了访问虚拟机集合(名为 vms
)的功能。这个集合包括了一个 disks
集合来描述附加到这个虚拟机上的每个磁盘的详细信息。
例 2.7. 列出虚拟机的大小
这个 Python 示例输出了 Red Hat Virtualization 环境中的虚拟机列表,以及它们的磁盘容量总和(以字节为单位):
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") virtual_machines = api.vms.list() if len(virtual_machines) > 0: print("%-30s %s" % ("Name","Disk Size")) print("==================================================") for virtual_machine in virtual_machines: disks = virtual_machine.disks.list() disk_size = 0 for disk in disks: disk_size += disk.get_size() print("%-30s: %d" % (virtual_machine.get_name(), disk_size)) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
2.9. 示例:使用 Python 创建 NFS 数据存储
当 Red Hat Virtualization 环境被第一次创建时,它需要定义最少一个数据存储域和一个 ISO 存储域。数据存储域被用来存储虚拟磁盘镜像;ISO 存储域被用来存储在虚拟机上安装操作系统所需的安装介质。
API
类提供了访问存储域集合(名为 storagedomains
)的功能。这个集合包括环境中的所有存储域。storagedomains
集合也可以被用来添加和删除存储域。
这个示例中所提供的代码假设,远程 NFS 共享已经为在 Red Hat Virtualization 中使用进行了预配置。请参阅 Red Hat Virtualization 管理指南 来获得关于准备 NFS 共享的信息。
例 2.8. 使用 Python 创建 NFS 数据存储
这个 Python 示例在 storagedomains
集合中添加了一个 NFS 数据域。使用 Python 添加 NFS 存储域可以分为以下几步:
使用
datacenters
集合的get
方法指定存储必须被附加到的数据中心。dc = api.datacenters.get(name="Default")
使用
hosts
集合的get
方法指定用来附加存储的主机。h = api.hosts.get(name="Atlantic")
指定 NFS 存储域的
Storage
参数。在这个示例中,NFS 的位置是192.0.43.10/storage/data
。s = params.Storage(address="192.0.43.10", path="/storage/data", type_="nfs")
使用
storagedomains
集合的add
方法请求创建存储域。除了Storage
参数,还需要提供以下信息:- 存储域的名称。
-
从
datacenters
集合获得的数据中心项。 -
从
hosts
集合获得的主机项。 -
添加的存储域类型(
data
、iso
或export
)。 -
使用的存储格式(
v1
、v2
或v3
)。
以上的步骤被组合为:
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") dc = api.datacenters.get(name="Default") h = api.hosts.get(name="Atlantic") s = params.Storage(address="192.0.43.10", path="/storage/data", type_="nfs") sd_params = params.StorageDomain(name="data1", data_center=dc, host=h, type_="data", storage_format="v3", storage=s) try: sd = api.storagedomains.add(sd_params) print "Storage Domain '%s' added (%s)." % (sd.get_name()) except Exception as ex: print "Adding storage domain failed: %s" % ex api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 add
方法调用成功,脚本会输出以下信息:
Storage Domain 'data1' added (bd954c03-d180-4d16-878c-2aedbdede566).
2.10. 示例:使用 Python 创建 NFS ISO 存储
要创建虚拟机,则需要为虚拟机操作系统提供安装介质。可在 Red Hat Virtualization 环境中将安装介质保存在 ISO 存储域中。
这个示例中所提供的代码假设,远程 NFS 共享已经为在 Red Hat Virtualization 中使用进行了预配置。请参阅 Red Hat Virtualization 管理指南 来获得关于准备 NFS 共享的信息。
例 2.9. 使用 Python 创建 NFS ISO 存储
这个 Python 示例在 storagedomains
集合中添加了一个 NFS ISO 域。使用 Python 添加 NFS 存储域可以分为以下几步:
使用
datacenters
集合的get
方法指定存储必须被附加到的数据中心。dc = api.datacenters.get( name="Default" )
使用
hosts
集合的get
方法指定用来附加存储的主机。h = api.hosts.get(name="Atlantic")
指定 NFS 存储域的
Storage
参数。在这个示例中,NFS 的位置是192.0.43.10/storage/iso
。s = params.Storage(address="192.0.43.10", path="/storage/iso", type_="nfs")
使用
storagedomains
集合的add
方法请求创建存储域。除了Storage
参数,还需要提供以下信息:- 存储域的名称。
-
从
datacenters
集合获得的数据中心项。 -
从
hosts
集合获得的主机项。 -
添加的存储域类型(
data
、iso
或export
)。 -
使用的存储格式(
v1
、v2
或v3
)。
以上的步骤被组合为:
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") dc = api.datacenters.get(name="Default") h = api.hosts.get(name="Atlantic") s = params.Storage(address="192.0.43.10", path="/storage/iso", type_="nfs") sd_params = params.StorageDomain(name="iso1", data_center=dc, host=h, type_="iso", storage_format="v3", storage=s) try: sd = api.storagedomains.add(sd_params) print "Storage Domain '%s' added (%s)." % (sd.get_name()) except Exception as ex: print "Adding storage domain failed: %s" % ex api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 add
方法调用成功,脚本会输出以下信息:
Storage Domain 'iso1' added (789814a7-7b90-4a39-a1fd-f6a98cc915d8).
2.11. 示例:使用 Python 为数据中心附加存储域
在把存储域添加到 Red Hat Virtualization 后,需要把它们附加到数据中心并进行激活,然后才可以被使用。
例 2.10. 使用 Python 为数据中心附加存储域
这个 Python 示例把一个名为 data1
的数据存储域和一个名为 iso1
的 ISO 存储域附加到 default
数据中心中。这个附加的操作是通过数据中心的 storagedomains
集合的 add
方法实现的。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") dc = api.datacenters.get(name="Default") sd_data = api.storagedomains.get(name="data1") sd_iso = api.storagedomains.get(name="iso1") try: dc_sd = dc.storagedomains.add(sd_data) print "Attached data storage domain '%s' to data center '%s' (Status: %s)." % (dc_sd.get_name(), dc.get_name, dc_sd.get_status().get_state()) except Exception as ex: print "Attaching data storage domain to data center failed: %s." % ex try: dc_sd = dc.storagedomains.add(sd_iso) print "Attached ISO storage domain '%s' to data center '%s' (Status: %s)." % (dc_sd.get_name(), dc.get_name, dc_sd.get_status().get_state()) except Exception as ex: print "Attaching ISO storage domain to data center failed: %s." % ex api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 add
方法的调用成功,这个脚本会输出:
Attached data storage domain 'data1' to data center 'Default' (Status: maintenance). Attached ISO storage domain 'iso1' to data center 'Default' (Status: maintenance).
请注意:status
的值代表了存储域仍然需要被激活。
2.12. 示例:使用 Python 激活存储域
一旦把存储域添加到 Red Hat Virtualization,并把它们附加到一个数据中心,您需要把它们激活后才可以使用。
例 2.11. 使用 Python 激活存储域
这个 Python 示例激活了一个名为 data1
的数据存储域和一个名为 iso1
的 ISO 存储域。这两个存储域都被附加到 Default
数据中心中。激活操作是通过存储域的 activate
方法实现的。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") dc = api.datacenters.get(name="Default") sd_data = dc.storagedomains.get(name="data1") sd_iso = dc.storagedomains.get(name="iso1") try: sd_data.activate() print "Activated data storage domain '%s' in data center '%s' (Status: %s)." % (sd_data.get_name(), dc.get_name, sd_data.get_status().get_state()) except Exception as ex: print "Activating data storage domain in data center failed: %s." % ex try: sd_iso.activate() print "Activated ISO storage domain '%s' in data center '%s' (Status: %s)." % (sd_iso.get_name(), dc.get_name, sd_iso.get_status().get_state()) except Exception as ex: print "Activating ISO storage domain in data center failed: %s." % ex api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 activate
请求成功,脚本会输出:
Activated data storage domain 'data1' in data center 'Default' (Status: active). Activated ISO storage domain 'iso1' in data center 'Default' (Status: active).
请注意:status
的值代表了存储域已经被激活。
2.13. 示例:使用 Python 创建虚拟机
创建虚拟机需要几个步骤。这里介绍的第一步将创建虚拟机本身的对象。
例 2.12. 使用 Python 创建虚拟机
这个 Python 示例创建了一个名为 vm1
的虚拟机。这个虚拟机会满足以下条件:
最少有 512MB 内存(以字节表示)。
vm_memory = 512 * 1024 * 1024
必须附加到
Default
集群(因此也被附加到Default
数据中心)。vm_cluster = api.clusters.get(name="Default")
必须基于默认的
Blank
模板。vm_template = api.templates.get(name="Blank")
必须从虚拟硬盘引导。
vm_os = params.OperatingSystem(boot=[params.Boot(dev="hd")])
在使用
vms
集合的add
方法创建虚拟机前,把这些选项组合为一个参数项。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") vm_name = "vm1" vm_memory = 512 * 1024 * 1024 vm_cluster = api.clusters.get(name="Default") vm_template = api.templates.get(name="Blank") vm_os = params.OperatingSystem(boot=[params.Boot(dev="hd")]) vm_params = params.VM(name=vm_name, memory=vm_memory, cluster=vm_cluster, template=vm_template, os=vm_os) try: api.vms.add(vm=vm_params) print "Virtual machine '%s' added." % vm_name except Exception as ex: print "Adding virtual machine '%s' failed: %s" % (vm_name, ex) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 add
请求成功,脚本会输出以下信息:
Virtual machine 'vm1' added.
2.14. 示例:使用 Python 创建虚拟机 NIC
要使新创建的虚拟机可以访问网络资源,您需要创建一个虚拟 NIC 并把它附加到虚拟机上。
例 2.13. 使用 Python 创建虚拟机 NIC
这个 Python 示例创建一个名为 nic1
的 NIC,并把它附加到名为 vm1
的虚拟机上。这个 NIC 满足以下条件:
必须是
virtio
网络设备。nic_interface = "virtio"
必须连接到
ovirtmgmt
管理网络。nic_network = api.networks.get(name="ovirtmgmt")
在使用虚拟机的
nics
集合的add
方法创建 NIC 前,把这些选项组合在一起作为 NIC 参数项。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") vm = api.vms.get(name="vm1") nic_name = "nic1" nic_interface = "virtio" nic_network = api.networks.get(name="ovirtmgmt") nic_params = params.NIC(name=nic_name, interface=nic_interface, network=nic_network) try: nic = vm.nics.add(nic_params) print "Network interface '%s' added to '%s'." % (nic.get_name(), vm.get_name()) except Exception as ex: print "Adding network interface to '%s' failed: %s" % (vm.get_name(), ex) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 add
请求成功,脚本会输出以下信息:
Network interface 'nic1' added to 'vm1'.
2.15. 示例:使用 Python 创建虚拟机存储磁盘
要使新创建的虚拟机可以访问具有持久性的存储,您需要创建并附加一个磁盘。
例 2.14. 使用 Python 创建虚拟机存储磁盘
这个 Python 示例创建一个 8GB virtio
磁盘,并把它附加到名为 vm1
的虚拟机上。这个磁盘满足以下条件:
必须存储在名为
data1
的存储域中,disk_storage_domain = params.StorageDomains(storage_domain=[api.storagedomains.get(name="data1")])
磁盘的容量是 8GB,
disk_size = 8*1024*1024
必须是一个
system
类磁盘(和data
相对应),disk_type = "system"
必须是
virtio
存储设备,disk_interface = "virtio"
以
cow
格式保存,disk_format = "cow"
必须被标记为一个可用的引导设备。
disk_bootable = True
在使用虚拟机的
disks
集合的add
方法创建磁盘前,把这些选项组合在一起作为磁盘参数项。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") vm = api.vms.get(name="vm1") sd = params.StorageDomains(storage_domain=[api.storagedomains.get(name="data1")]) disk_size = 8*1024*1024 disk_type = "system" disk_interface = "virtio" disk_format = "cow" disk_bootable = True disk_params = params.Disk(storage_domains=sd, size=disk_size, type_=disk_type, interface=disk_interface, format=disk_format, bootable=disk_bootable) try: d = vm.disks.add(disk_params) print "Disk '%s' added to '%s'." % (d.get_name(), vm.get_name()) except Exception as ex: print "Adding disk to '%s' failed: %s" % (vm.get_name(), ex) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 add
请求成功,脚本会输出以下信息:
Disk 'vm1_Disk1' added to 'vm1'.
2.16. 示例:使用 Python 为虚拟机附加一个 ISO 镜像
在一个新建虚拟机上开始安装操作系统前,需要附加包括了操作系统安装介质的 ISO 镜像文件。
例 2.15. 指定 ISO 镜像
ISO 镜像包括在附加到 ISO 存储域中的 files
集合中。这个示例列出了一个 ISO 存储域中的 files
集合中的内容。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API(url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") sd = api.storagedomains.get(name="iso1") iso = sd.files.list() for i in iso: print "%s" % i.get_name() except Exception as ex: print "Unexpected error: %s" % ex
如果运行成功,脚本会为在 files
集合中找到的每个文件输出和以下相似的内容:
RHEL6.3-Server-x86_64-DVD1.iso
请注意,因为 ISO 域中的每个文件的名称必须是唯一的,所以文件的 id
和 name
属性是相同的。
例 2.16. 使用 Python 为虚拟机附加一个 ISO 镜像
这个 Python 示例把 RHEL6.3-Server-x86_64-DVD1.iso ISO 镜像文件附加到 vm1
虚拟机上。使用虚拟机的 cdroms
集合的 add
方法可以把指定的镜像文件附加到虚拟机上。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API(url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_, ca_file="_ca.crt_") sd = api.storagedomains.get(name="iso1") cd_iso = sd.files.get(name="RHEL6.3-Server-x86_64-DVD1.iso") cd_vm = api.vms.get(name="vm1") cd_params = params.CdRom(file=cd_iso) try: cd_vm.cdroms.add(cd_params) print "Attached CD to '%s'." % cd_vm.get_name() except Exception as ex: print "Failed to attach CD to '%s': %s" % (cd_vm.get_name(), ex) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 add
请求成功,脚本会输出以下信息:
Attached CD to 'vm1'.
上面的示例是把一个 ISO 镜像附加到一个状态为 Down
的虚拟机上。如果需要把 ISO 附加到一个状态为 Up
的虚拟机上时,把第 2 个 try
中的代码改为:
try: cdrom=cd_vm.cdroms.get(id="_00000000-0000-0000-0000-000000000000_") cdrom.set_file(_cd_iso_) cdrom.update(current=True) print "Attached CD to '%s'." % cd_vm.get_name() except: print "Failed to attach CD to '%s': %s" % (cd_vm.get_name(), ex)
例 2.17. 使用 Python 从虚拟机上弹出一个 cdrom
从虚拟机的 cdrom
集合中弹出一个 ISO。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API(url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_, ca_file="_ca.crt_") sd = api.storagedomains.get(name="iso1") vm = api.vms.get(name="vm1") try: vm.cdroms.get(id="00000000-0000-0000-0000-000000000000").delete() print "Removed CD from '%s'." % vm.get_name() except Exception as ex: print "Failed to remove CD from '%s': %s" % (vm.get_name(), ex) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
2.17. 示例:使用 Python 分离一个磁盘
您可以使用 Python 软件开发套件从虚拟机上分离虚拟磁盘。
例 2.18. 使用 Python 分离一个磁盘
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API(url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") vm = api.vms.get(name="VM_NAME") disk = vm.disks.get(name="DISK_NAME") detach = params.Action(detach=True) disk.delete(action=detach) print "Detached disk %s successfully!" % disk api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
2.18. 示例:使用 Python 启动虚拟机
启动一个虚拟机
例 2.19. 使用 Python 启动虚拟机
这个示例使用 start
方法启动虚拟机。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") vm = api.vms.get(name="vm1") try: vm.start() print "Started '%s'." % vm.get_name() except Exception as ex: print "Unable to start '%s': %s" % (vm.get_name(), ex) api.disconnect() except Exception as ex: print "Unexpected error: %s" % ex
如果 start
请求成功,脚本会输出以下信息:
Started 'vm1'.
请注意:status
的值是 up
,它代表了主机已经被启动。
2.19. 示例:使用 Python 启动覆盖参数的虚拟机
启动覆盖参数的虚拟机
例 2.20. 使用 Python 启动覆盖参数的虚拟机
这个示例演示了如何使用 Windows ISO 启动虚拟机,并附加包含 Windows 驱动程序的 virtio-win_x86.vfd
软盘。这个动作与使用管理或用户门户网站中的 Run Once 窗口启动虚拟机一致。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") except Exception as ex: print "Failed to connect to API: %s" % ex try: vm = api.vms.get(name="Win_machine") except Exception as ex: print "Failed to retrieve VM: %s" % ex cdrom = params.CdRom(file=params.File(id="windows_example.iso")) floppy = params.Floppy(file=params.File(id="virtio-win_x86.vfd")) try: vm.start( action=params.Action( vm=params.VM( os=params.OperatingSystem( boot=[params.Boot(dev="cdrom")] ), cdroms=params.CdRoms(cdrom=[cdrom]), floppies=params.Floppies(floppy=[floppy]) ) ) ) except Exception as ex: print "Failed to start VM: %s" % ex
CD 镜像和软盘文件需要已存在于 ISO 域中。如果还没有存在于 ISO 域中,使用 ISO 上传工具来它们上传到域中。如需了解更多相关信息,请参阅 The ISO Uploader Tool。
2.20. 示例:使用 Python 启动使用 Cloud-Init 的虚拟机
使用 Python 启动使用 Cloud-Init 的虚拟机。
例 2.21. 使用 Python 启动使用 Cloud-Init 的虚拟机
这个示例演示了如何使用 Cloud-Init 工具启动虚拟机,为 eth0 接口设定主机名和静态 IP。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") except Exception as ex: print "Failed to connect to API: %s" % ex try: vm = api.vms.get(name="_MyVM_") except Exception as ex: print "Failed to retrieve VM: %s" % ex try: vm.start( action=params.Action( vm=params.VM( initialization=params.Initialization( cloud_init=params.CloudInit( host=params.Host(address="_MyHost.example.com_"), network_configuration=params.NetworkConfiguration( nics=params.Nics( nic=[params.NIC( name="_eth0_", boot_protocol="_static_", on_boot=_True_, network=params.Network( ip=params.IP( address="_10.10.10.1_", netmask="_255.255.255.0_", gateway="_10.10.10.1_" ) ) ) ] ) ) ) ) ) ) ) except Exception as ex: print "Failed to start VM: %s" % ex
2.21. 示例:使用 Python 检查系统事件
Red Hat Virtualization Manager 会记录许多系统事件,这些系统事件可以通过用户接口界面、系统日志文件和 API 进行访问。ovirtsdk
库使用 events
集合来访问事件。
例 2.22. 使用 Python 检查系统事件
在这个示例中,events
集合被列出。请注意:
-
使用
list
方法中的query
参数确保了所有结果页都会被返回。在默认的情况下,list
方法只返回结果的第 1 页(这个页默认包括最多100
个结果)。 - 结果列表中的事件顺序和实际发生的顺序相同。
from ovirtsdk.api import API from ovirtsdk.xml import params try: api = API (url="https://_HOST_", username="_USER_@_DOMAIN_", password="_PASS_", ca_file="_ca.crt_") event_list = [] event_page_index = 1 event_page_current = api.events.list(query="page %s" % event_page_index) while(len(event_page_current) != 0): event_list = event_list + event_page_current event_page_index = event_page_index + 1 try: event_page_current = api.events.list(query="page %s" % event_page_index) except Exception as ex: print "Error retrieving page %s of list: %s" % (event_page_index, ex) event_list.reverse() for event in event_list: print "%s %s CODE %s - %s" % (event.get_time(), event.get_severity().upper(), event.get_code(), event.get_description()) except Exception as ex: print "Unexpected error: %s" % ex
这个脚本的输出会和以下类似(具体事件内容会根据系统的实际情况有所不同):
2012-09-25T18:40:10.065-04:00 NORMAL CODE 30 - User admin@internal logged in. 2012-09-25T18:40:10.368-04:00 NORMAL CODE 153 - VM vm1 was started by admin@internal (Host: Atlantic). 2012-09-25T18:40:10.470-04:00 NORMAL CODE 30 - User admin@internal logged in.