0 介绍
OpenStack SDK 是一个旨在简化与 OpenStack 云平台交互的 Python 库。它提供了一个统一、高级、面向对象的接口,无需直接处理底层的 REST API、认证、版本协商等复杂细节。以上是ai回答,所以想了解了下如何使用该sdk来调用openstack各个组件的接口
1. 核心组件与架构-ai整理
openstack.connection.Connection
: 核心类。创建一个Connection
实例是所有操作的起点。它封装了认证、会话、服务发现等。- 服务客户端 (Service Clients): 每个 OpenStack 服务对应一个客户端,通过
Connection
的属性访问:conn.compute
-> Nova (计算)conn.image
-> Glance (镜像)conn.network
-> Neutron (网络)conn.volume
-> Cinder (块存储)conn.object_store
-> Swift (对象存储)conn.identity
-> Keystone (身份认证)conn.baremetal
-> Ironic (裸金属)conn.dns
-> Designate (DNS)conn.orchestration
-> Heat (编排)conn.octavia
-> Octavia (负载均衡)
- 资源 (Resources): 表示具体的云资源,如
Server
,Image
,Network
,Volume
等。它们通常是服务客户端方法的返回值。
2. 测试demo
-
设置环境变量 将认证信息导出为环境变量
bashexport OS_AUTH_URL=https://your-openstack-auth-url:5000/v3 export OS_PROJECT_NAME=your_project_name export OS_PROJECT_DOMAIN_NAME=Default export OS_USERNAME=your_username export OS_USER_DOMAIN_NAME=Default export OS_PASSWORD=your_password export OS_REGION_NAME=RegionOne export OS_INTERFACE=public export OS_IDENTITY_API_VERSION=3
-
**或者在代码中直接指定 **
pythonfrom openstack import connect conn = connect( auth_url="https://your-openstack-auth-url:5000/v3", project_name="your_project_name", username="your_username", password="your_password", user_domain_name="Default", project_domain_name="Default", region_name="RegionOne" )
最关键的一步:编写测试demo
创建一个 Python 文件
python
# -*- coding: utf-8 -*-
"""
使用 OpenStack SDK 列出所有虚拟机 (服务器)
"""
# 导入 openstack 模块
import openstack
# 创建连接 (会自动从 clouds.yaml 或环境变量读取配置)
# 如果使用 clouds.yaml 中名为 'mycloud' 的配置,传入 cloud='mycloud'
conn = openstack.connect(cloud='mycloud') # 如果只有一个默认配置,可以省略 cloud 参数
# 获取计算服务客户端
compute = conn.compute
# 列出所有服务器
print("正在获取服务器列表...")
servers = compute.servers()
# 遍历并打印服务器信息
for server in servers:
print(f"服务器名: {server.name}")
print(f" ID: {server.id}")
print(f" 状态: {server.status}")
print(f" 镜像 ID: {server.image_id}")
print(f" Flavor ID: {server.flavor_id}")
# 注意: 获取 Flavor 名称和 IP 地址需要额外的 API 调用
try:
flavor = compute.get_flavor(server.flavor_id)
print(f" Flavor 名称: {flavor.name}")
except Exception as e:
print(f" 获取 Flavor 信息失败: {e}")
# 打印 IP 地址
for address_list in server.addresses.values():
for address in address_list:
print(f" IP: {address['addr']} ({address['OS-EXT-IPS:type']})")
print("-" * 40)
print(f"共找到 {len(list(servers))} 台服务器。")