4. PowerStore REST API实战
PowerStore 的 REST API 采用标准的 HTTPS + JSON 接口风格,所有资源都通过 /api/rest/ 下的统一端点访问。与图形界面相比,API 的价值在于把"一次点击"变成"可重复执行的代码":批量创建卷、按命名规则映射主机、统一打快照、定时采集性能指标,都可以封装成脚本,纳入自动化流水线。本节围绕 Python 脚本,把卷、主机、主机组、快照、克隆和性能监控串成一条可落地的批量管理链路。
认证与请求骨架
调用任何接口前,先通过 POST /api/rest/login 获取会话令牌,后续请求在请求头中携带 DELL-EMC-TOKEN。PowerStore 也支持基于 Authorization: Basic 的认证方式,但会话令牌更适合脚本中反复调用。下面是一个最小可用的请求封装:
import requests, json, urllib3
urllib3.disable_warnings()
BASE = "https://10.0.0.10/api/rest"
SESS = requests.Session()
SESS.verify = False
def login(user, pwd):
r = SESS.post(f"{BASE}/login", json={"username": user, "password": pwd})
r.raise_for_status()
SESS.headers["DELL-EMC-TOKEN"] = r.json()["id"]
def get(path, **params):
r = SESS.get(f"{BASE}{path}", params=params)
r.raise_for_status()
return r.json()
def post(path, payload):
r = SESS.post(f"{BASE}{path}", json=payload)
r.raise_for_status()
return r.json()
注意 login 返回的令牌有有效期,长时间运行的脚本应在收到 401 时重新登录。所有写操作建议先查询再创建,避免重复对象。
批量创建卷
卷的创建端点是 POST /api/rest/volume,关键参数包括 name、size(单位字节)、volume_group_id(可选)、appliance_id 和 performance_policy。批量场景下,通常按业务前缀加序号生成名称,并统一指定容量和保护策略。示例:为 web 业务创建 5 个 100 GiB 卷,命名 web-vol-01 至 web-vol-05。
GiB = 1024**3
for i in range(1, 6):
payload = {
"name": f"web-vol-{i:02d}",
"size": 100 * GiB,
"description": "web tier batch volume",
"performance_policy": "medium"
}
vol = post("/volume", payload)
print(vol["name"], vol["id"], vol["size"])
返回体中 id 是后续映射、快照、克隆的唯一依据,务必在脚本中保存映射关系(例如写入 JSON 或数据库)。若卷已存在,接口会返回 4xx 错误,脚本应捕获并跳过,而不是中断整批任务。
主机与主机组
主机(host)代表一台发起端,需要提供 os_type 和 initiators(如 iSCSI IQN 或 FC WWPN)。主机组(host group)用于把多台主机作为一个整体映射,便于集群场景统一授权。创建顺序是:先建主机,再建主机组,最后把主机加入组。
host = post("/host", {
"name": "esxi-01",
"os_type": "VMware ESXi",
"initiators": [{"port_name": "iqn.1998-01.com.vmware:esxi-01",
"port_type": "iSCSI"}]
})
hg = post("/host_group", {"name": "web-cluster"})
post(f"/host_group/{hg['id']}/add_hosts",
{"host_ids": [host["id"]]})
映射卷到主机或主机组使用 POST /api/rest/volume/{id}/map,请求体指定 host_id 或 host_group_id,并可指定 LUN。批量映射时,建议按主机组维度操作,减少映射条目数量。
快照与克隆
快照用于时间点保护,端点为 POST /api/rest/volume/{id}/snapshot,可指定 name 和 description。克隆用于快速复制卷,端点为 POST /api/rest/volume/{id}/clone,需指定新卷名和目标容量。两者都会产生新的卷对象,区别在于快照与原卷共享数据块、空间占用小,克隆是独立副本、可单独映射。
snap = post(f"/volume/{vol_id}/snapshot",
{"name": "web-vol-01-snap-20240601"})
clone = post(f"/volume/{vol_id}/clone",
{"name": "web-vol-01-clone",
"host_group_id": hg["id"]})
批量快照时,可遍历卷列表逐个调用;若卷数量大,建议控制并发(如 5~10 个线程),避免管理接口过载。快照命名建议包含卷名和时间戳,便于后续按策略清理。
性能指标采集
PowerStore 的性能数据通过 POST /api/rest/metrics/generate 获取,请求体指定 entity(如 volume)、entity_ids、interval(如 Last5Minutes)和 metrics 列表。常用指标包括 read_iops、write_iops、read_bandwidth、write_bandwidth、avg_read_latency、avg_write_latency。返回的是时间序列数组,脚本可解析后写入监控系统或生成报表。
metrics = post("/metrics/generate", {
"entity": "volume",
"entity_ids": [vol_id],
"interval": "Last5Minutes",
"metrics": ["read_iops", "write_iops",
"avg_read_latency", "avg_write_latency"]
})
for m in metrics["response"]:
print(m["name"], m["values"][-1])
判断性能是否正常,不能只看单点值。建议连续采集多个周期,观察 IOPS 与延迟的比值:若 IOPS 上升而延迟同步大幅上升,说明后端可能成为瓶颈;若延迟稳定在毫秒级以内,则卷性能健康。批量卷场景下,可按卷聚合指标,找出热点卷。
批量管理脚本的组织建议
把上述能力组合成一个可复用脚本时,建议按"配置—执行—校验"三段组织。配置段用 YAML 或 JSON 描述卷清单、主机组、快照策略;执行段按依赖顺序调用 API;校验段重新查询对象状态,确认卷已映射、快照已创建、指标可采集。下面给出一个可直接参考的批量卷管理配置示例:
{
"volumes": [
{"name": "web-vol-01", "size_gib": 100, "policy": "medium"},
{"name": "web-vol-02", "size_gib": 100, "policy": "medium"},
{"name": "db-vol-01", "size_gib": 500, "policy": "high"}
],
"host_group": "web-cluster",
"snapshot": {"enabled": true, "retain_days": 7},
"metrics": ["read_iops", "write_iops",
"avg_read_latency", "avg_write_latency"]
}
脚本读取该配置后,先创建卷并记录 id,再按 host_group 批量映射,随后为每个卷创建快照,最后调用指标接口采集一轮数据。校验阶段用 GET /api/rest/volume 按名称过滤,确认 mapped_host_group 字段非空;用 GET /api/rest/volume/{id}/snapshot 确认快照存在。若某一步失败,脚本应记录失败对象并继续处理其余对象,最后汇总报告,而不是在第一个错误处退出。
GET 查询目标对象是否存在,避免重复创建;写操作建议加指数退避重试,应对管理接口短时繁忙。掌握这条链路后,PowerStore 的日常运维就从"逐台点选"升级为"脚本驱动":卷、主机、主机组、快照、克隆和性能指标都能以代码方式统一编排,既降低人为误操作,也为后续接入 Ansible、CI/CD 或自研运维平台打下基础。