把华为数通 HCIE 装进 Python 脚本里——一个后端码农 30 天“偷师”笔记(附可跑代码)
(一)为什么要“代码化”HCIE?
- 实验环境 40 台设备,手工配一条 OSPF 邻居,平均 3 min,脚本 3 s。
- 面试题:现场让你改 STP 优先级?我反手
netmiko批量send_config_set(),HR 直接喊停。 - 真实职场:凌晨割接 200 台交换机,老板只关心“能不能回滚”,Python 的
rollback_cfg()函数就是护身符。
(二)实验拓扑(ENSP 云桥接)
PC--Cloud--CE1--CE2--CX--AR1
|
(Python Host)
Python Host 通过 Cloud 桥接到管理网,SSH 可达所有设备 → 一套脚本白天做实验,晚上当巡检。
(三)“HCIE 级”脚本清单
- 统一登录封装(基于 Netmiko + TextFSM)
- OSPF 邻居自动化部署 + 校验
- BGP 路由漂移告警(差异比对)
- STP 一键根切换 & 回滚
- 多线程批量升级(FTP + Boot-loader)
- 巡检报告自动生成(Markdown → PDF)
(四)核心库版本
pip install netmiko==4.3.0 ntc-templates==3.4.0 Jinja2==3.1.2 tqdm==4.65.0
(五)代码实战:OSPF 邻居批量部署 + 状态校验
场景:给 20 台 CE 交换机新建 Area 1,Loopback0 当 Router-ID,接口按 10.1.<id>.0/24 规划。
- 设备清单
devices.yaml
devices:
- host: 192.168.56.11
name: CE1
id: 1
- host: 192.168.56.12
name: CE2
id: 2
# … 省略到 CE20
ssh:
username: python
password: Huawei@123
- 主脚本
ospf_deploy.py
#!/usr/bin/env python3
import yaml, logging, datetime, sys
from netmiko import ConnectHandler
from jinja2 import Template
from tqdm import tqdm
logging.basicConfig(level=logging.INFO, format="%(asctime)s | %(levelname)s | %(message)s")
TEMPLATE = Template("""
sysname {{ name }}
interface LoopBack0
ip address {{ rid }} 255.255.255.255
ospf 1 router-id {{ rid }}
area 0.0.0.1
network {{ net }} 0.0.0.255
#
return
save y
""")
def deploy(dev):
dev_info = {
"device_type": "huawei",
"host": dev["host"],
"username": ssh_user,
"password": ssh_pass,
"conn_timeout": 30,
}
cfg = TEMPLATE.render(name=dev["name"], rid=f"1.1.1.{dev['id']}", net=f"10.1.{dev['id']}.0")
logging.info(f"Connecting {dev['name']}...")
with ConnectHandler(**dev_info) as conn:
output = conn.send_config_set(cfg.splitlines(), delay_factor=1)
logging.debug(output)
# 校验邻居状态
neigh = conn.send_command("display ospf peer brief", use_textfsm=True)
up_count = len([n for n in neigh if n["state"] == "Full"])
logging.info(f"{dev['name']} OSPF Full neighbors: {up_count}")
return up_count
if __name__ == "__main__":
with open("devices.yaml") as f:
data = yaml.safe_load(f)
ssh_user = data["ssh"]["username"]
ssh_pass = data["ssh"]["password"]
total = 0
for d in tqdm(data["devices"], desc="Deploying"):
total += deploy(d)
print(f"\n>>> 全部完成,累计 Full 邻居数:{total}")
- 运行结果(节选)
$ python ospf_deploy.py
Deploying: 100%|████████| 20/20 [02:15<00:00, 6.75s/device]
>>> 全部完成,累计 Full 邻居数:38
人工 3 小时,脚本 2 分钟,HCIE 实验考场同理。
(六)BGP 路由漂移监控
需求:每 60 s 采集一次 BGP 表,与前一次 diff,若丢失前缀 >5 条就告警。
import schedule, time, json, os, difflib
from netmiko import ConnectHandler
from datetime import datetime
ROUTER = {"device_type": "huawei", "host": "192.168.56.20",
"username": "python", "password": "Huawei@123"}
SNAPSHOT = "bgp_snapshot.txt"
def get_bgp():
with ConnectHandler(**ROUTER) as conn:
bgp = conn.send_command("display bgp routing-table")
return sorted(bgp.splitlines())
def job():
old = get_bgp() if os.path.exists(SNAPSHOT) else []
new = get_bgp()
with open(SNAPSHOT, "w") as f:
f.write("\n".join(new))
diff = list(difflib.unified_diff(old, new, lineterm=''))
lost = [l for l in diff if l.startswith('- ') and not l.startswith('---')]
if len(lost) > 5:
print(f"[{datetime.now()}] BGP 告警:丢失前缀 {len(lost)} 条")
schedule.every(60).seconds.do(job)
if __name__ == "__main__":
while True:
schedule.run_pending()
time.sleep(1)
把 print 换成企业微信/钉钉 webhook,就是现网告警。
(七)批量升级(多线程 + 进度条)
20 台 CX 从 V200R019 升到 V200R020,FTP 本地已放好 .cc 文件。
核心代码片段:
from concurrent.futures import ThreadPoolExecutor, as_completed
from netmiko import ConnectHandler
from tqdm import tqdm
def upgrade(dev):
with ConnectHandler(**dev) as conn:
conn.send_command("ftp 192.168.56.100")
conn.send_command("python") # FTP 用户名
conn.send_command("Huawei@123") # FTP 密码
output = conn.send_command("get V200R020.cc")
conn.send_command("quit")
conn.send_config_set(["startup system-software V200R020.cc", "y"])
conn.send_command("reboot fast", expect_string="continue")
return dev["host"] + " done"
futures = []
with ThreadPoolExecutor(max_workers=5) as pool:
for d in devices:
futures.append(pool.submit(upgrade, d))
for f in tqdm(as_completed(futures), total=len(futures)):
print(f.result())
平均 8 min 一台,比串行省 4 倍时间,割接窗口内轻松完成。
(八)一键巡检报告(TextFSM + Jinja2 + Markdown)
采集项:CPU、内存、OSPF、BGP、STP、温度。
TextFSM 模板已集成在 ntc-templates,直接 use_textfsm=True 拿到结构化字典,喂给 Jinja2,10 s 生成 PDF。
from mdutils import MdUtils
import pdfkit, textwrap
md = MdUtils(title="HCIE 巡检报告")
cpu = conn.send_command("display cpu-usage", use_textfsm=True)[0]["cpu_5sec"]
md.new_header(level=1, title="设备 CE1")
md.new_paragraph(f"CPU 5 秒利用率:{cpu}%")
...
html = md.get_md_text()
pdfkit.from_string(html, "report.pdf")
领导只认 PDF?安排。
(九)考场上怎么用?
- 实验环节:把
ospf_deploy.py放在~/scripts/,考官一声令下python3 ospf_deploy.py,邻居全绿。 - 面试环节:主动展示“多线程升级”代码,讲到线程池 5 线程怎么防止 FTP 打爆,HCIE 加分项到手。
- 真网运维:凌晨 3 点割接,回滚命令提前
send_config_set()写好,回车=30 台设备同时rollback,心跳不慌。
(十)学习路径 & 资源
- 华为官方文档:Support-E 网站 → 产品 → 企业网络 → 交换机 → 命令参考
- 模拟器:eNSP Pro(新出,支持 API,可直接 Python 调用)
- 书籍:《华为路由器学习指南》《Python 网络自动化》
- 视频:B 站搜索“HCIE-Datacom 自动化”+“Netmiko 华为”
(十一)结语
证书只能帮你过 HR,自动化脚本才能让你过 2 点整的割接夜。
把命令行“翻译”成 Python 函数,你就拥有了可复现、可审计、可回滚的网络基础设施。
愿每个网络工程师,都能用代码把凌晨的变更窗口,缩短到一杯咖啡的时间。
代码已上传 GitHub,Star 自取,割接无眠,Python 相伴!