OpenStack 是一个越来越流行的、用于部署基础架构即服务 (IaaS) 云的开源解决方案。OpenStack 附带了一个仪表板 Web 应用程序,非常适合执行
手动任务,比如启动单个虚拟机 (VM) 实例,
但是,如果希望自动化基于云的任务,则需要编写可操作 OpenStack 的脚本。
许多用户直接为 OpenStack 具象状态传输 (REST) 应用编程接口 (API) 编写自动化脚本,或者编写调用命令行工具(比如 keystone 或 nova)的 shell 脚本。但 Python 中有一种编写 OpenStack 自动化脚本的更好方法。所有 OpenStack 服务都公开了原生 Python API,以公开与命令行工具相同的特性集。不幸的是,描述如何使用这些 API 的文档很少。
如果您是 Python 程序员,那么 Python API 会比命令行工具或 REST API 容易使用得多。在本文中,我将演示如何使用原生 OpenStack Python API 自动化常见的用户和管理性任务。
OpenStack 项目和代号
OpenStack 这个词不是指单个应用程序。它是一个服务集合,这些服务协同工作来实现 IaaS 云。每个 OpenStack 服务都有一个正式名称和一个代号,如表 1 所示,而且每个 OpenStack 服务公开了自己的 Python API。
表 1. OpenStack 服务和代号
正式名称 代号 Identity Service keystone Image Service glance Compute Service nova Networking Service quantum Block Storage Service cinder Object Storage Service swift
安装 Python 绑定
Python 绑定与每个服务的命令行工具捆绑在一起。事实上,每个命令行工具使用相应的 Python API 实现。可从 Python Package Index中使用 pip(一个 Python 包安装程序)来安装每个工具。pip 包名称包括:
python-keystoneclient python-glanceclient python-novaclient python-quantumclient python-cinderclient python-swiftclient
例如,要安装 keystone 客户端,可运行以下命令:
$ pip install python-keystoneclient
可将这些包安装到 Python 虚拟环境或您的系统级 Python 包中,只要您拥有本地机器上的根用户特权。
所有 OpenStack API 都有一些版本,Python 绑定支持多个 API 版本,以保持向后兼容性。因此可以安全地下载这些包的最新版本,因为它们将会适合 OpenStack 服务的所有更低版本。
在本文中,我将重点介绍来自以下服务的 Python API 示例:
OpenStack Identity Service (keystone) OpenStack Image Service (glance) OpenStack Compute Service (nova)
设置一个测试环境
为了最充分地掌握本文的内容,建议您使用管理员特权访问一个 OpenStack 云,以便试用这些代码段。如果目前没有 OpenStack 云的管理员访问权,那么最简单的方法就是在一个 VM 中部署 OpenStack。DevStack 项目(参见 参考资料 获取链接)旨在简化在单个机器上创建一个面向开发的 OpenStack 部署的过程。配合 VirtualBox 等虚拟化工具,您可以在笔记本电脑上(甚至在 Mac 或 Windows® 上)实现一个 OpenStack 云。
您还可以获得 TryStack 上的一个免费帐户,TryStack 是由社区维护的 OpenStack 沙盒。请注意,只能获取 TryStack 上的用户级特权,不能获得管理级特权,所以您无法使用 TryStack 测试需要管理特权的脚本。
OpenStack Identity (keystone)
客户端要对 Identity (keystone) API 发出请求,可实例化适当的 keystone 客户端 Python 对象并调用它的方法。因为 API 提供了版本控制,所以 Python 客户端始终与该 API 的一个特定版本有关联。
清单 1 显示了使用 keystone 客户端的 2.0 版将 Image Service 添加到服务目录的示例。
清单 1. 使用 keystone 创建一个管理员角色
import keystoneclient.v2_0.client as ksclient# Replace the method arguments with the ones from your local configkeystone = ksclient.Client(auth_url="http://192.168.27.100:35357/v2.0", username="admin", password="devstack", tenant_name="demo")glance_service = keystone.services.create(name="glance", service_type="image", description="OpenStack Image Service")
凭据
在实例化 keystoneclient.v2_0.client.Client 对象时必须提供凭据。keystone 端点接受两种类型的凭据:令牌,或者用户名和密码。如果您是管理员,那么您可以使用 admin 令牌,这是一种具有管理员特权且永不过期的特殊令牌。要定义此令牌,可以使用运行 keystone 服务的机器上的 /etc/keystone/keystone.conf 文件中的 admin_token 选项(参见清单 2)。
清单 2. 使用身份验证令牌执行身份验证
import keystoneclient.v2_0.client as ksclient# Replace the values below with the ones from your local configendpoint = "http://192.168.27.100:35357/v2.0"admin_token = "devstack"keystone = ksclient.Client(endpoint=endpoint, token=admin_token)
出于安全原因,一般不赞成使用 admin 令牌。相反,在创建了具有管理特权的用户之后,建议 OpenStack Identity 开发人员始终使用用户名和密码进行身份验证(参见清单 3)。
清单 3. 使用用户名和密码执行身份验证
import keystoneclient.v2_0.client as ksclient# Replace the values below the ones from your local config,auth_url = "http://192.168.27.100:35357/v2.0"username = "admin"password = "devstack"tenant_name = "demo"keystone = ksclient.Client(auth_url=auth_url, username=username, password=password, tenant_name=tenant_name)