【誉天教育】华为认证数通HCIA+HCIE+HCIP+Python自动化课程 – 2024

85 阅读4分钟

把华为数通 HCIE 装进 Python 脚本里——一个后端码农 30 天“偷师”笔记(附可跑代码)

(一)为什么要“代码化”HCIE?

  1. 实验环境 40 台设备,手工配一条 OSPF 邻居,平均 3 min,脚本 3 s。
  2. 面试题:现场让你改 STP 优先级?我反手 netmiko 批量 send_config_set(),HR 直接喊停。
  3. 真实职场:凌晨割接 200 台交换机,老板只关心“能不能回滚”,Python 的 rollback_cfg() 函数就是护身符。

(二)实验拓扑(ENSP 云桥接)

PC--Cloud--CE1--CE2--CX--AR1
       |
   (Python Host)

Python Host 通过 Cloud 桥接到管理网,SSH 可达所有设备 → 一套脚本白天做实验,晚上当巡检。

(三)“HCIE 级”脚本清单

  1. 统一登录封装(基于 Netmiko + TextFSM)
  2. OSPF 邻居自动化部署 + 校验
  3. BGP 路由漂移告警(差异比对)
  4. STP 一键根切换 & 回滚
  5. 多线程批量升级(FTP + Boot-loader)
  6. 巡检报告自动生成(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 规划。

  1. 设备清单 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
  1. 主脚本 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}")
  1. 运行结果(节选)
$ 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?安排。

(九)考场上怎么用?

  1. 实验环节:把 ospf_deploy.py 放在 ~/scripts/,考官一声令下 python3 ospf_deploy.py,邻居全绿。
  2. 面试环节:主动展示“多线程升级”代码,讲到线程池 5 线程怎么防止 FTP 打爆,HCIE 加分项到手。
  3. 真网运维:凌晨 3 点割接,回滚命令提前 send_config_set() 写好,回车=30 台设备同时 rollback,心跳不慌。

(十)学习路径 & 资源

  1. 华为官方文档:Support-E 网站 → 产品 → 企业网络 → 交换机 → 命令参考
  2. 模拟器:eNSP Pro(新出,支持 API,可直接 Python 调用)
  3. 书籍:《华为路由器学习指南》《Python 网络自动化》
  4. 视频:B 站搜索“HCIE-Datacom 自动化”+“Netmiko 华为”

(十一)结语
证书只能帮你过 HR,自动化脚本才能让你过 2 点整的割接夜。
把命令行“翻译”成 Python 函数,你就拥有了可复现、可审计、可回滚的网络基础设施。
愿每个网络工程师,都能用代码把凌晨的变更窗口,缩短到一杯咖啡的时间。
代码已上传 GitHub,Star 自取,割接无眠,Python 相伴!