提高脚本编写效率的5个实战技巧

刚接手一批老旧网络设备,每天手动登录十来台路由器查接口状态、清ARP、抓包分析——干到第三天,手抖着敲错命令把某分支网点的VLAN删了。后来咬牙写了段Python脚本,10秒跑完原来半小时的活,还顺手加了错误回滚和日志记录。

别硬敲,先搭骨架

写脚本前花两分钟画个流程图:输入是什么(IP列表?CSV?)、中间要调哪些命令(ssh、ping、snmpwalk)、输出存哪(屏幕?Excel?邮件?)。骨架定了,后面填代码就像往格子里填字,不卡壳。比如批量检查交换机端口UP/DOWN状态,骨架就是:读取设备列表 → 逐台SSH登录 → 执行show interface status → 提取关键字段 → 汇总成表格

善用现成轮子,别重造螺丝刀

Netmiko、Nornir、TextFSM 这些库不是摆设。拿Netmiko举个例子,三行代码搞定多厂商设备登录:

from netmiko import ConnectHandler
device = {"device_type": "cisco_ios", "host": "192.168.1.1", "username": "admin", "password": "pass"}
conn = ConnectHandler(**device)

比自己用paramiko从头处理telnet/ssh握手、密码交互、命令等待提示符省心太多。遇到华为或H3C设备?换device_type值就行,不用改逻辑。

把重复操作“钉”进函数里

发现连续三次都在写if 'up' in output: print('OK')?立刻抽成函数:

def check_port_up(output):
    return 'up' in output.lower() and 'admin down' not in output.lower()

下次查光模块温度、BGP邻居状态,直接复用这个判断逻辑,改的只是传进去的字符串。

日志比print好使十倍

别再满屏print('正在连接...') → print('执行完成') → print('结果:xxx')。用Python logging模块,一行开关调试模式:

import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info(f'已处理{len(devices)}台设备')

出问题时翻日志文件,时间、级别、上下文全在,不用猜哪步挂了。

小脚本也配个配置文件

把IP地址、超时时间、用户名这些硬编码全挪进config.yaml里:

devices:
  - host: 192.168.1.1
   type: cisco_ios
  - host: 192.168.1.2
   type: huawei_vrp
timeout: 10

换测试环境?改配置文件就行,代码一动不动。运维同事接手时也不用翻源码找IP,打开yaml就明白怎么调。

脚本不是越长越厉害,是越少出错、越容易改、越敢半夜被叫起来跑一次才真有用。