第 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 存储域可以分为以下几步:

  1. 使用 datacenters 集合的 get 方法指定存储必须被附加到的数据中心。

    dc = api.datacenters.get(name="Default")
  2. 使用 hosts 集合的 get 方法指定用来附加存储的主机。

    h = api.hosts.get(name="Atlantic")
  3. 指定 NFS 存储域的 Storage 参数。在这个示例中,NFS 的位置是 192.0.43.10/storage/data

    s = params.Storage(address="192.0.43.10", path="/storage/data", type_="nfs")
  4. 使用 storagedomains 集合的 add 方法请求创建存储域。除了 Storage 参数,还需要提供以下信息:

    • 存储域的名称。
    • datacenters 集合获得的数据中心项。
    • hosts 集合获得的主机项。
    • 添加的存储域类型(dataisoexport)。
    • 使用的存储格式(v1v2v3)。

以上的步骤被组合为:

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 存储域可以分为以下几步:

  1. 使用 datacenters 集合的 get 方法指定存储必须被附加到的数据中心。

    dc = api.datacenters.get( name="Default" )
  2. 使用 hosts 集合的 get 方法指定用来附加存储的主机。

    h = api.hosts.get(name="Atlantic")
  3. 指定 NFS 存储域的 Storage 参数。在这个示例中,NFS 的位置是 192.0.43.10/storage/iso

    s = params.Storage(address="192.0.43.10", path="/storage/iso", type_="nfs")
  4. 使用 storagedomains 集合的 add 方法请求创建存储域。除了 Storage 参数,还需要提供以下信息:

    • 存储域的名称。
    • datacenters 集合获得的数据中心项。
    • hosts 集合获得的主机项。
    • 添加的存储域类型(dataisoexport)。
    • 使用的存储格式(v1v2v3)。

以上的步骤被组合为:

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 域中的每个文件的名称必须是唯一的,所以文件的 idname 属性是相同的。

例 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.
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.