第 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.