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 上升而延迟同步大幅上升,说明后端可能成为瓶颈;若延迟稳定在毫秒级以内,则卷性能健康。批量卷场景下,可按卷聚合指标,找出热点卷。

PowerStore REST API 批量卷管理链路 Python 脚本 login 获取令牌 requests 封装 循环 / 并发控制 卷 Volume web-vol-01 ~ 05 100 GiB / medium 返回 volume_id 主机组 Host Group web-cluster esxi-01 (iSCSI) 统一映射入口 map 快照 Snapshot 共享数据块 空间占用小 时间点保护 克隆 Clone 独立副本 可单独映射 用于测试/发布 性能指标采集 metrics/generate read_iops · write_iops · read_bandwidth · write_bandwidth avg_read_latency · avg_write_latency interval = Last5Minutes,按卷聚合找热点 结果判断 IOPS↑ 且延迟↑ → 后端瓶颈 延迟稳定 ms 级 → 健康 按卷聚合定位热点卷

批量管理脚本的组织建议

把上述能力组合成一个可复用脚本时,建议按"配置—执行—校验"三段组织。配置段用 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 或自研运维平台打下基础。