第 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
$ 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
类的构造函数还支持其它参数。这个示例中只包括了必需的参数。
如果连接成功,这个示例会显示以下信息:
Connected to Red Hat Enterprise Virtualization Manager successfully!
Connected to Red Hat Enterprise Virtualization Manager successfully!
2.3. 示例:使用 Python 列出数据中心集合 复制链接链接已复制到粘贴板!
API
类提供了访问数据中心集合(名为 datacenters
)的功能。这个集合包括了环境中的所有数据中心。
例 2.2. 使用 Python 列出数据中心集合
这个 Python 示例列出了 datacenters
集合中的所有数据中心。它同时还显示了集合中的每个数据中心的基本信息。
如果环境中只包括 Default
数据中心,而且它还没有被激活,这个示例会输出以下信息:
Default (d8b74b20-c6e1-11e1-87a3-00163e77e2ed)
Default (d8b74b20-c6e1-11e1-87a3-00163e77e2ed)
2.4. 示例:使用 Python 列出集群集合 复制链接链接已复制到粘贴板!
API 类提供了访问集群集合(名为 clusters
)的功能。这个集合包括了环境中的所有集群。
例 2.3. 使用 Python 列出集群集合
这个 Python 示例列出了 clusters
集合中的集群。它同时还显示了集合中的每个集群的基本信息。
如果环境中只包括 Default
集群,这个示例会输出以下信息:
Default (99408929-82cf-4dc7-a532-9d998063fa95)
Default (99408929-82cf-4dc7-a532-9d998063fa95)
2.5. 示例:使用 Python 列出逻辑网络集合 复制链接链接已复制到粘贴板!
API
类提供了访问逻辑网络集合(名为 networks
)的功能。这个集合包括了环境中的所有逻辑网络。
例 2.4. 使用 Python 列出逻辑网络集合
这个 Python 示例列出了 networks
集合中的逻辑网络。它同时还显示了集合中的每个网络的基本信息。
如果环境中只包括默认的管理网络,这个示例会输出以下信息:
ovirtmgmt (00000000-0000-0000-0000-000000000009)
ovirtmgmt (00000000-0000-0000-0000-000000000009)
2.6. 示例:使用 Python 列出主机集合 复制链接链接已复制到粘贴板!
API
类提供了访问主机集合(名为 hosts
)的功能。这个集合包括了环境中的所有主机。
例 2.5. 使用 Python 列出主机集合
这个 Python 示例列出了 hosts
集合中的主机。
如果一个环境中只附加了一个名为 Atlantic
的主机,这个示例会输出以下信息:
Atlantic (5b333c18-f224-11e1-9bdd-00163e77e2ed)
Atlantic (5b333c18-f224-11e1-9bdd-00163e77e2ed)
2.7. 示例:列出 ISO 存储域中的 ISO 文件 复制链接链接已复制到粘贴板!
API
类提供了访问存储域集合(名为 storagedomains
)的功能。这个集合包括了一个 files
集合来描述存储域中的文件。
例 2.6. 列出 ISO 存储域中的 ISO 文件
这个 Python 示例输出 Red Hat Virtualization 环境中的每个 ISO 存储域中的 ISO 文件列表。
2.8. 示例:列出虚拟机的大小 复制链接链接已复制到粘贴板!
API
类提供了访问虚拟机集合(名为 vms
)的功能。这个集合包括了一个 disks
集合来描述附加到这个虚拟机上的每个磁盘的详细信息。
例 2.7. 列出虚拟机的大小
这个 Python 示例输出了 Red Hat Virtualization 环境中的虚拟机列表,以及它们的磁盘容量总和(以字节为单位):
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")
dc = api.datacenters.get(name="Default")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
hosts
集合的get
方法指定用来附加存储的主机。h = api.hosts.get(name="Atlantic")
h = api.hosts.get(name="Atlantic")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定 NFS 存储域的
Storage
参数。在这个示例中,NFS 的位置是192.0.43.10/storage/data
。s = params.Storage(address="192.0.43.10", path="/storage/data", type_="nfs")
s = params.Storage(address="192.0.43.10", path="/storage/data", type_="nfs")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
storagedomains
集合的add
方法请求创建存储域。除了Storage
参数,还需要提供以下信息:- 存储域的名称。
-
从
datacenters
集合获得的数据中心项。 -
从
hosts
集合获得的主机项。 -
添加的存储域类型(
data
、iso
或export
)。 -
使用的存储格式(
v1
、v2
或v3
)。
以上的步骤被组合为:
如果 add
方法调用成功,脚本会输出以下信息:
Storage Domain 'data1' added (bd954c03-d180-4d16-878c-2aedbdede566).
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" )
dc = api.datacenters.get( name="Default" )
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
hosts
集合的get
方法指定用来附加存储的主机。h = api.hosts.get(name="Atlantic")
h = api.hosts.get(name="Atlantic")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定 NFS 存储域的
Storage
参数。在这个示例中,NFS 的位置是192.0.43.10/storage/iso
。s = params.Storage(address="192.0.43.10", path="/storage/iso", type_="nfs")
s = params.Storage(address="192.0.43.10", path="/storage/iso", type_="nfs")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
storagedomains
集合的add
方法请求创建存储域。除了Storage
参数,还需要提供以下信息:- 存储域的名称。
-
从
datacenters
集合获得的数据中心项。 -
从
hosts
集合获得的主机项。 -
添加的存储域类型(
data
、iso
或export
)。 -
使用的存储格式(
v1
、v2
或v3
)。
以上的步骤被组合为:
如果 add
方法调用成功,脚本会输出以下信息:
Storage Domain 'iso1' added (789814a7-7b90-4a39-a1fd-f6a98cc915d8).
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
方法实现的。
如果 add
方法的调用成功,这个脚本会输出:
Attached data storage domain 'data1' to data center 'Default' (Status: maintenance). Attached ISO storage domain 'iso1' to data center 'Default' (Status: maintenance).
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
方法实现的。
如果 activate
请求成功,脚本会输出:
Activated data storage domain 'data1' in data center 'Default' (Status: active). Activated ISO storage domain 'iso1' in data center 'Default' (Status: active).
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
vm_memory = 512 * 1024 * 1024
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必须附加到
Default
集群(因此也被附加到Default
数据中心)。vm_cluster = api.clusters.get(name="Default")
vm_cluster = api.clusters.get(name="Default")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必须基于默认的
Blank
模板。vm_template = api.templates.get(name="Blank")
vm_template = api.templates.get(name="Blank")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必须从虚拟硬盘引导。
vm_os = params.OperatingSystem(boot=[params.Boot(dev="hd")])
vm_os = params.OperatingSystem(boot=[params.Boot(dev="hd")])
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在使用
vms
集合的add
方法创建虚拟机前,把这些选项组合为一个参数项。
如果 add
请求成功,脚本会输出以下信息:
Virtual machine 'vm1' added.
Virtual machine 'vm1' added.
2.14. 示例:使用 Python 创建虚拟机 NIC 复制链接链接已复制到粘贴板!
要使新创建的虚拟机可以访问网络资源,您需要创建一个虚拟 NIC 并把它附加到虚拟机上。
例 2.13. 使用 Python 创建虚拟机 NIC
这个 Python 示例创建一个名为 nic1
的 NIC,并把它附加到名为 vm1
的虚拟机上。这个 NIC 满足以下条件:
必须是
virtio
网络设备。nic_interface = "virtio"
nic_interface = "virtio"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必须连接到
ovirtmgmt
管理网络。nic_network = api.networks.get(name="ovirtmgmt")
nic_network = api.networks.get(name="ovirtmgmt")
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在使用虚拟机的
nics
集合的add
方法创建 NIC 前,把这些选项组合在一起作为 NIC 参数项。
如果 add
请求成功,脚本会输出以下信息:
Network interface 'nic1' added to 'vm1'.
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")])
disk_storage_domain = params.StorageDomains(storage_domain=[api.storagedomains.get(name="data1")])
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 磁盘的容量是 8GB,
disk_size = 8*1024*1024
disk_size = 8*1024*1024
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必须是一个
system
类磁盘(和data
相对应),disk_type = "system"
disk_type = "system"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必须是
virtio
存储设备,disk_interface = "virtio"
disk_interface = "virtio"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以
cow
格式保存,disk_format = "cow"
disk_format = "cow"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必须被标记为一个可用的引导设备。
disk_bootable = True
disk_bootable = True
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在使用虚拟机的
disks
集合的add
方法创建磁盘前,把这些选项组合在一起作为磁盘参数项。
如果 add
请求成功,脚本会输出以下信息:
Disk 'vm1_Disk1' added to 'vm1'.
Disk 'vm1_Disk1' added to 'vm1'.
2.16. 示例:使用 Python 为虚拟机附加一个 ISO 镜像 复制链接链接已复制到粘贴板!
在一个新建虚拟机上开始安装操作系统前,需要附加包括了操作系统安装介质的 ISO 镜像文件。
例 2.15. 指定 ISO 镜像
ISO 镜像包括在附加到 ISO 存储域中的 files
集合中。这个示例列出了一个 ISO 存储域中的 files
集合中的内容。
如果运行成功,脚本会为在 files
集合中找到的每个文件输出和以下相似的内容:
RHEL6.3-Server-x86_64-DVD1.iso
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
方法可以把指定的镜像文件附加到虚拟机上。
如果 add
请求成功,脚本会输出以下信息:
Attached CD to 'vm1'.
Attached CD to 'vm1'.
上面的示例是把一个 ISO 镜像附加到一个状态为 Down
的虚拟机上。如果需要把 ISO 附加到一个状态为 Up
的虚拟机上时,把第 2 个 try
中的代码改为:
例 2.17. 使用 Python 从虚拟机上弹出一个 cdrom
从虚拟机的 cdrom
集合中弹出一个 ISO。
2.17. 示例:使用 Python 分离一个磁盘 复制链接链接已复制到粘贴板!
您可以使用 Python 软件开发套件从虚拟机上分离虚拟磁盘。
例 2.18. 使用 Python 分离一个磁盘
2.18. 示例:使用 Python 启动虚拟机 复制链接链接已复制到粘贴板!
启动一个虚拟机
例 2.19. 使用 Python 启动虚拟机
这个示例使用 start
方法启动虚拟机。
如果 start
请求成功,脚本会输出以下信息:
Started 'vm1'.
Started 'vm1'.
请注意:status
的值是 up
,它代表了主机已经被启动。
2.19. 示例:使用 Python 启动覆盖参数的虚拟机 复制链接链接已复制到粘贴板!
启动覆盖参数的虚拟机
例 2.20. 使用 Python 启动覆盖参数的虚拟机
这个示例演示了如何使用 Windows ISO 启动虚拟机,并附加包含 Windows 驱动程序的 virtio-win_x86.vfd
软盘。这个动作与使用管理或用户门户网站中的 Run Once 窗口启动虚拟机一致。
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。
2.21. 示例:使用 Python 检查系统事件 复制链接链接已复制到粘贴板!
Red Hat Virtualization Manager 会记录许多系统事件,这些系统事件可以通过用户接口界面、系统日志文件和 API 进行访问。ovirtsdk
库使用 events
集合来访问事件。
例 2.22. 使用 Python 检查系统事件
在这个示例中,events
集合被列出。请注意:
-
使用
list
方法中的query
参数确保了所有结果页都会被返回。在默认的情况下,list
方法只返回结果的第 1 页(这个页默认包括最多100
个结果)。 - 结果列表中的事件顺序和实际发生的顺序相同。
这个脚本的输出会和以下类似(具体事件内容会根据系统的实际情况有所不同):
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.
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.