你并不是在安装 OpenStack 本身(比如控制节点、计算节点等),而是在安装 Python 的客户端库,以便用 Python 脚本来与已经部署好的 OpenStack 云进行交互。

这就像用 Python 的 requests 库来调用一个 Web API 一样,OpenStack 也提供了标准的 API,而 Python 客户端库就是与这些 API 通信的桥梁。
核心工具:OpenStack Client
OpenStack 官方提供了一个统一的命令行工具叫做 openstack,它本身也是一个 Python 包,安装它通常是第一步,因为它不仅提供了命令行接口,也包含了底层的 Python 库。
推荐使用虚拟环境 (最佳实践)
为了避免与系统中的 Python 包产生冲突,强烈建议你先创建一个虚拟环境。
创建并激活虚拟环境
# 创建一个名为 openstack-env 的虚拟环境 python3 -m venv openstack-env # 激活虚拟环境 (Linux/macOS) source openstack-env/bin/activate # 激活虚拟环境 (Windows) # .\openstack-env\Scripts\activate
激活后,你的命令行提示符前面会出现 (openstack-env),表示你已处于虚拟环境中。

安装 OpenStack 客户端
在激活的虚拟环境中,使用 pip 安装官方客户端。
# 安装 OpenStack 客户端 pip install python-openstackclient
这个包会自动安装它所依赖的其他核心库,
keystoneauth1: 用于身份验证。novaclient: 用于与计算服务交互。glanceclient: 用于与镜像服务交互。neutronclient: 用于与网络服务交互。- 等等...
安装完成后,你就可以在命令行中使用 openstack 命令了。
# 验证安装 openstack --version
直接安装到系统环境 (不推荐)
如果你不使用虚拟环境,可以直接用 pip 安装,但这可能会与系统自带的 Python 包产生冲突,导致不可预知的问题。

# 可能需要使用 sudo sudo pip3 install python-openstackclient
如何配置 OpenStack 客户端
安装好库只是第一步,客户端需要知道如何连接到你的 OpenStack 云,包括认证信息、API 地址等,有几种方式可以提供这些信息:
使用云配置文件 (最常用)
OpenStack 的一个标准做法是提供一个名为 clouds.yaml 的配置文件,你从 OpenStack 管理员那里通常会得到这个文件。
clouds.yaml 文件示例:
clouds:
my_openstack_cloud:
auth:
auth_url: http://keystone.example.com:5000/v3
project_name: my_project
project_domain_name: Default
username: my_username
user_domain_name: Default
password: my_secret_password
# 对于某些云,可能需要指定项目ID而不是项目名
# project_id: "a123b456c789d012e345f678a901b23c"
region_name: RegionOne
identity_api_version: 3
你需要将这个文件放在以下位置之一,客户端会自动加载它:
~/.config/openstack/clouds.yaml(用户级配置)/etc/openstack/clouds.yaml(系统级配置)
使用环境变量
你也可以直接在终端中设置环境变量,这种方式适合临时使用或自动化脚本。
export OS_AUTH_URL=http://keystone.example.com:5000/v3 export OS_PROJECT_ID=a123b456c789d012e345f678a901b23c export OS_PROJECT_NAME="my_project" export OS_USER_DOMAIN_NAME="Default" export OS_USERNAME="my_username" export OS_PASSWORD="my_secret_password" export OS_REGION_NAME="RegionOne" export OS_INTERFACE=public export OS_IDENTITY_API_VERSION=3
使用命令行参数
在执行 openstack 命令时,可以直接通过参数传递所有信息,但这非常繁琐,通常只用于测试。
openstack server list --os-auth-url http://... --os-project-name ... --os-username ...
如何在 Python 代码中使用
现在你已经安装了库并配置好了认证信息,可以在 Python 脚本中进行编程了。
示例:列出所有虚拟机 (Nova)
import openstack
# 1. 创建一个连接对象
# 这会自动从 clouds.yaml 或环境变量中加载配置
conn = openstack.connect()
# 2. 使用连接对象调用 OpenStack 服务
print("Listing servers:")
for server in conn.compute.servers():
print(f"{server.id} : {server.name}")
# 3. 也可以按名称查找
server_name_to_find = "my-test-vm"
server = conn.compute.find_server(server_name_to_find)
if server:
print(f"\nFound server by name '{server_name_to_find}':")
print(f"ID: {server.id}")
print(f"Status: {server.status}")
print(f"Image: {server.image['name']}")
print(f"Flavor: {server.flavor['name']}")
else:
print(f"\nServer with name '{server_name_to_find}' not found.")
# 4. 断开连接 (conn 对象支持上下文管理器,推荐使用)
conn.close()
更推荐的方式:使用上下文管理器
为了确保连接在使用后被正确关闭,推荐使用 with 语句。
import openstack
# clouds.yaml 中的云名称
cloud_name = "my_openstack_cloud"
try:
# with 语句会自动处理连接的创建和关闭
with openstack.connect(cloud=cloud_name) as conn:
print(f"Connected to cloud: {cloud_name}")
# 创建一个新虚拟机
print("Creating a new server...")
image = conn.compute.find_image("ubuntu-20.04")
flavor = conn.compute.find_flavor("m1.small")
network = conn.network.find_network("private-net")
server = conn.compute.create_server(
name="my-python-created-server",
image=image,
flavor=flavor,
networks=[{"uuid": network.id}],
)
# 获取服务器,并等待其变为 'ACTIVE' 状态
server = conn.compute.wait_for_server(server)
print(f"Server created successfully with ID: {server.id} and Status: {server.status}")
except openstack.exceptions.SDKException as e:
print(f"An error occurred: {e}")
- 明确目标:你是在安装 Python 客户端库,用来调用 OpenStack API,而不是部署 OpenStack。
- 首选虚拟环境:使用
venv创建隔离的 Python 环境。 - 安装核心库:
pip install python-openstackclient。 - 配置认证:获取并放置
clouds.yaml文件,这是最标准、最方便的方式。 - 开始编码:使用
import openstack和openstack.connect()来建立连接,然后通过conn对象调用各种服务(如conn.compute,conn.network等)。
通过以上步骤,你就可以在 Python 中自如地与 OpenStack 云进行交互了。
