Python自动化存储检测脚本开发实践 1. 从手工测试到自动化检测的跨越作为一名服务器测试工程师我每天都要面对大量重复的存储设备检测工作。每次新服务器上架都需要手动执行lsblk、nvme list等一系列命令来检查磁盘配置。这种工作方式不仅效率低下还容易出错。直到有一天我决定用Python将这些手工操作自动化这才真正体会到工具化思维带来的效率提升。存储自动检测脚本的核心价值在于标准化检测流程确保每次检查的项目完整一致结构化输出结果便于存档和对比分析解放测试工程师的双手把精力放在更有价值的分析工作上2. 脚本设计思路与技术选型2.1 需求分析与功能规划在设计storage_check.py时我首先明确了脚本需要实现的四大核心功能基础信息采集获取主机名、系统时间、内核版本等环境信息磁盘设备检测通过lsblk命令识别所有磁盘设备及其属性NVMe专项检查针对NVMe固态盘获取详细规格信息异常情况预警对不符合预期的配置发出警告提示2.2 技术实现方案经过对比多种方案最终选择的技术路线如下命令执行使用Python的subprocess模块调用系统命令输出解析优先采用JSON格式输出提高解析可靠性结果展示结构化输出按功能模块分区显示异常处理设置合理的超时机制和错误捕获提示在服务器测试环境中命令执行的稳定性至关重要。subprocess.run()的timeout参数可以有效防止因命令卡死导致的脚本挂起。3. 核心代码实现详解3.1 命令执行封装def run_cmd(cmd): 执行 shell 命令返回 (ok, stdout, stderr) try: result subprocess.run( cmd, shellTrue, textTrue, capture_outputTrue, timeout10 ) return result.returncode , result.stdout.strip(), result.stderr.strip() except Exception as e: return False, , str(e)这个基础函数封装了命令执行的核心逻辑shellTrue支持管道等复杂命令textTrue返回字符串而非字节流timeout1010秒超时保护统一返回(执行状态, 标准输出, 错误输出)三元组3.2 lsblk磁盘检测实现def get_lsblk_disks(): ok, out, err run_cmd(lsblk -J -o NAME,SIZE,TYPE,MOUNTPOINT) if not ok: return [], [flsblk failed: {err}] disks [] try: data json.loads(out) for item in data.get(blockdevices, []): if item.get(type) disk: disks.append({ name: item.get(name, ), size: item.get(size, ), type: item.get(type, ), mountpoint: item.get(mountpoint, ) }) except Exception as e: return [], [flsblk json parse failed: {e}] return disks, [] if disks else [No disk found from lsblk]关键点解析使用-J参数获取JSON格式输出避免文本解析的不稳定性只关注typedisk的设备过滤掉分区和逻辑卷完整捕获可能的异常情况包括命令执行失败和JSON解析错误3.3 NVMe设备检测实现def parse_nvme_list_text(text): devices [] for line in [line.rstrip() for line in text.splitlines() if line.strip()]: if line.startswith(/dev/nvme): parts line.split() devices.append({ node: parts[0] if len(parts) 0 else , sn: parts[1] if len(parts) 1 else , model: .join(parts[2:-4]) if len(parts) 6 else , usage: parts[-4] if len(parts) 4 else , fw: parts[-1] if len(parts) 1 else }) return devices由于nvme list没有JSON输出选项这里采用文本解析方式通过行首/dev/nvme识别有效行使用固定位置索引提取关键字段对model字段特殊处理合并中间可能包含空格的型号描述4. 异常检测与预警机制4.1 预警规则设计def build_warnings(disks, nvmes): warnings [] nvme_count len(nvmes) # NVMe数量检查 if nvme_count : warnings.append(WARN: NVMe count is 0) elif nvme_count 2: warnings.append(fWARN: NVMe count is low ({nvme_count})) # 磁盘容量检查 for d in disks: if not d[size]: warnings.append(fWARN: disk {d[name]} has empty size) return warnings当前实现的预警规则包括NVMe数量不足预警默认阈值2块磁盘容量信息缺失预警命令执行失败预警在各自函数中实现4.2 预警阈值优化建议在实际使用中建议根据服务器规格调整预警阈值单路入门级服务器NVMe_MIN1主流双路服务器NVMe_MIN2高端四路服务器NVMe_MIN4可以通过配置文件或环境变量实现灵活配置NVME_MIN int(os.getenv(NVME_MIN, 2))5. 部署与使用指南5.1 环境准备确保目标服务器满足以下条件Python 3.6lsblk命令可用util-linux包nvme-cli工具已安装用于NVMe检测执行用户有root权限或sudo权限5.2 脚本部署步骤# 创建专用目录 mkdir -p /opt/server_scripts # 下载或创建脚本文件 vi /opt/server_scripts/storage_check.py # 设置执行权限 chmod x /opt/server_scripts/storage_check.py # 创建软链接方便调用 ln -s /opt/server_scripts/storage_check.py /usr/local/bin/storage-check5.3 执行与输出解读直接运行脚本将输出结构化检测报告storage-check典型输出包含五个部分头部信息脚本版本、检测时间主机基础信息磁盘设备汇总NVMe设备详情异常警告汇总6. 实际应用案例解析6.1 新服务器验收场景在新服务器上架验收时运行脚本可以快速完成磁盘数量核对NVMe型号和固件版本确认异常配置预警相比手工检查效率提升80%以上。6.2 自动化测试集成该脚本可以轻松集成到自动化测试框架中def test_storage_config(): result subprocess.run( [python3, storage_check.py], capture_outputTrue, textTrue ) assert WARN not in result.stdout, 发现存储配置异常7. 性能优化与异常处理7.1 执行超时问题处理在测试环境中可能会遇到命令执行超时的情况。建议根据环境调整timeout值默认10秒对关键命令实现重试机制def run_cmd_with_retry(cmd, max_retry3): for i in range(max_retry): ok, out, err run_cmd(cmd) if ok: return ok, out, err time.sleep(1) return False, , fCommand failed after {max_retry} retries7.2 大规模环境优化当检测数百台服务器时可以考虑改用多线程/多进程并行执行将结果集中存储到数据库实现差异对比功能8. 脚本扩展方向8.1 功能增强路线图v2版本增加预期值配置功能EXPECTED_DISKS 12 EXPECTED_NVME 2v3版本集成RAID卡检测def get_raid_info(): return run_cmd(storcli /c0 show)v4版本支持结果导出为JSON/CSVdef save_json(result, filename): with open(filename, w) as f: json.dump(result, f)8.2 企业级应用建议在生产环境中使用时建议添加日志记录功能实现邮件/短信告警与CMDB系统集成建立历史数据对比机制9. 经验总结与避坑指南9.1 开发过程中的教训命令输出格式差异不同Linux发行版的lsblk输出可能有差异使用-J参数强制JSON输出可以避免这个问题。权限问题nvme list需要root权限在脚本中应提前检查权限if os.geteuid() ! : print(请使用root用户运行此脚本) sys.exit(1)环境依赖某些服务器可能未安装nvme-cli应增加检查if shutil.which(nvme) is None: return [], [nvme command not found]9.2 性能优化技巧并行命令执行对于不相互依赖的命令可以使用多线程并行执行from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor() as executor: future_lsblk executor.submit(get_lsblk_disks) future_nvme executor.submit(get_nvme_devices) disks future_lsblk.result() nvmes future_nvme.result()缓存机制对于不常变动的信息如磁盘型号可以添加缓存功能减少重复检测。10. 同类工具对比与选型建议10.1 现有方案对比方案优点缺点手工执行命令灵活无需准备效率低易出错Shell脚本执行速度快解析复杂维护困难Python脚本功能强大易扩展需要Python环境10.2 技术选型建议根据团队实际情况选择小规模临时检查手工命令简单自动化Shell脚本复杂企业级需求Python脚本对于测试工程师团队我强烈推荐Python方案因为更易于维护和扩展可以集成到现有测试框架支持更复杂的业务逻辑便于团队协作开发这个storage_check.py脚本虽然只有200多行代码但已经实现了从手工测试到自动化检测的重要跨越。它不仅提高了我的工作效率更重要的是培养了我作为测试工程师的工具化思维。在后续的百日学习计划中我会继续分享更多服务器测试自动化实践。