当前位置:首页>python>17、网络自动化——用Python批量管设备

17、网络自动化——用Python批量管设备

  • 2026-06-29 18:09:37
17、网络自动化——用Python批量管设备
📖 华为数通从0到1 · 第二季 · 连载第17篇(进阶篇)第一季(1-10篇)已完结,覆盖网络基础 + 路由交换 + 安全 + 排错。第二季对标HCIP水平,深入BGP、VPN、防火墙、数据中心、自动化运维等进阶主题。建议先看完第一季再跟学。

网络自动化——用Python批量管设备

华为数通从0到1 · 第17篇 · Netmiko + NAPALM + Ansible + 华为NETCONF

前面16篇我们学了网络基础、路由交换、安全、VPN、数据中心……这些知识让你能够手动配置和管理一台台设备。但如果你管理的是50台、100台、甚至1000台设备呢?

一台一台SSH登录,一条一条敲命令?这不是网络工程师该干的活——这是体力劳动

💡 生活类比:从手洗衣服到全自动洗衣机手动管理 = 手洗衣服:一件一件搓,费时费力,还容易漏掉一只袜子。自动化管理 = 全自动洗衣机:把所有衣服扔进去,按下按钮,去喝杯咖啡。洗完自动烘干,整整齐齐。网络自动化就是给你的设备管理装上一台"洗衣机"——写一次脚本,管一千台设备

今天分十一个部分讲:

🔹 为什么网络工程师要学Python — 效率对比:手动 vs 脚本🔹 Python环境搭建 — pip install netmiko napalm🔹 Netmiko入门 — SSH登录执行命令,单台/批量/配置模式🔹 实战脚本1 — 批量ping测试🔹 实战脚本2 — 批量导出配置备份🔹 实战脚本3 — 批量修改VLAN🔹 NAPALM — 多厂商统一接口🔹 Ansible — 无代码自动化,Playbook写法🔹 华为NETCONF/YANG — 可编程接口简介🔹 自动化运维最佳实践 — 版本管理/测试环境/回滚机制🔹 总结与下篇预告

· · ·

一、为什么网络工程师要学Python——手动 vs 脚本的效率鸿沟

先看一组真实场景的效率对比:

📋 手动操作 vs 自动化脚本 效率对比
任务场景 | 手动操作 | 自动化脚本
备份50台设备配置 | 3~4小时(逐台SSH+复制) | 2分钟(一键脚本)
批量修改100台设备VLAN | 1~2天(含出错返工) | 10分钟(含验证)
全网设备巡检 | 半天~一天 | 5分钟(自动生成报告)
ping测试200个IP | 30分钟(手动逐个ping) | 30秒(并行脚本)
版本升级20台交换机 | 4~6小时(逐台操作) | 30分钟(编排执行)
出错的概率 | 高(复制粘贴错、漏配) | 低(脚本逻辑固定)

看到差距了吗?手动操作不仅慢,还容易出错。人是会疲劳的——第30台设备和第1台设备的配置很可能因为手抖少打了一个字符。

而脚本呢?写一次,跑一万次,每次都一模一样。

📌 网络自动化的三个层次Level 1 · 脚本自动化:用Python写脚本,SSH登录设备执行命令。工具:Netmiko、Paramiko。Level 2 · 配置管理:用Ansible/NAPALM批量管理设备配置,支持幂等性和回滚。Level 3 · 可编程网络:通过API(RESTCONF/NETCONF)直接操作设备,控制器集中管理。工具:华为iMaster NCE、Cisco DNA Center。

今天我们从Level 1开始,一路学到Level 3的入门。

· · ·

二、Python环境搭建——工欲善其事,必先利其器

2.1 安装Python

首先确保你的电脑上安装了Python 3.6以上版本。在终端(Mac/Linux)或命令提示符(Windows)中输入:

# 检查Python版本
python3 --version
Python 3.10.5

如果没有安装,去 python.org 下载最新版。Windows用户记得勾选 "Add Python to PATH"

2.2 安装网络自动化库

我们需要安装以下Python库:

# 安装网络自动化核心库
pip install netmiko
pip install napalm
pip install nornir
# 可选:安装华为NETCONF库
pip install ncclient

简单介绍一下这几个库:

📦 网络自动化Python库一览
Netmiko — 基于Paramiko封装,专门用于SSH管理网络设备,支持华为/思科/H3C等几十种厂商
NAPALM — 多厂商统一API,支持get/set配置、diff对比、回滚,抹平厂商差异
Nornir — 纯Python自动化框架,替代Ansible的Python原生方案,支持并发执行
ncclient — NETCONF客户端库,用于通过NETCONF/YANG协议操作华为设备
Ansible — 无代码自动化工具,用YAML写Playbook,社区有大量华为module

2.3 准备设备清单

在开始写代码之前,先准备一份设备清单(Inventory)。实际工作中通常用一个CSV或YAML文件:

# devices.csv — 设备清单
host,port,username,password,device_type
192.168.1.1,22,admin,Huawei@123,huawei
192.168.1.2,22,admin,Huawei@123,huawei
192.168.1.3,22,admin,Huawei@123,huawei_vrp
192.168.1.4,22,admin,Cisco@123,cisco_ios
💡 device_type很重要Netmiko通过device_type知道这台设备是什么厂商、什么操作系统,从而正确地进入配置模式、识别命令提示符。华为VRP系统用 huawei 或 huawei_vrp,思科IOS用 cisco_ios,H3C用 hp_comware

· · ·

三、Netmiko入门——SSH登录执行命令

Netmiko是网络自动化领域的"瑞士军刀"。它帮你处理了SSH连接中最烦的事情:等待提示符、处理分页(---- More ----)、进入配置模式、发送命令、接收输出。

3.1 单台设备登录

最简单的用法:SSH登录一台华为交换机,执行几条命令并打印输出。

# netmiko_basic.py — SSH登录华为交换机执行命令fromnetmikoimport ConnectHandler# 定义设备连接参数device = {"device_type""huawei","host""192.168.1.1","username""admin","password""Huawei@123","port"22,}# 建立SSH连接with ConnectHandler(**device) as conn:print("✅ 连接成功:", conn.find_prompt())# 执行show命令    output = conn.send_command("display version")print(output)# 再执行一条    output2 = conn.send_command("display interface brief")print(output2)

就这么简单!ConnectHandler 会自动处理SSH连接、认证、等待提示符。用 with 语句还会在结束时自动关闭连接。

📌 send_command vs send_config_setsend_command():执行查看类命令(display/show/ping),在用户视图下执行,不会修改配置。send_config_set():进入配置模式,执行配置命令,会自动保存。用于修改设备配置。

3.2 批量设备遍历

能登录一台,就能登录一百台。只需要把设备信息放进列表,然后用循环遍历:

# netmiko_batch.py — 批量登录多台设备fromnetmikoimport ConnectHandler# 设备清单devices = [    {"device_type""huawei""host""192.168.1.1""username""admin""password""Huawei@123"},    {"device_type""huawei""host""192.168.1.2""username""admin""password""Huawei@123"},    {"device_type""huawei""host""192.168.1.3""username""admin""password""Huawei@123"},]# 遍历每台设备,执行命令for device in devices:try:with ConnectHandler(**device) as conn:            hostname = conn.find_prompt()            output = conn.send_command("display version")print(f"===== {hostname} =====")print(output)print()except Exception as e:print(f"❌ 连接 {device['host']} 失败:", e)

注意我们加了 try/except 异常处理——如果某台设备连不上(网络不通、密码错),程序不会崩溃,而是打印错误信息然后继续下一台。

3.3 配置模式(config mode)

如果你需要修改设备配置(比如加VLAN、改接口IP),就用 send_config_set()

# netmiko_config.py — 进入配置模式修改设备fromnetmikoimport ConnectHandlerdevice = {"device_type""huawei","host""192.168.1.1","username""admin","password""Huawei@123",}# 要执行的配置命令(列表形式,每条命令一个元素)config_commands = ["sysname Core-SW-01","vlan 100","vlan 200","interface Vlanif 100","ip address 10.0.100.1 255.255.255.0","quit","interface Vlanif 200","ip address 10.0.200.1 255.255.255.0","quit","return","save",]with ConnectHandler(**device) as conn:print("正在配置...")    output = conn.send_config_set(config_commands)print(output)print("✅ 配置完成!")
⚠️ 重要提醒:配置模式操作有风险!send_config_set() 会直接修改设备运行配置。在生产环境中使用前,务必:• 在模拟器(eNSP)上先测试• 确认命令列表正确无误• 准备好回滚方案(后面会讲)• 操作前备份当前配置

· · ·

四、实战脚本1:批量ping测试

场景:你有200个IP地址需要检测连通性,手动一个一个ping要半小时。写个脚本,30秒搞定。

# batch_ping.py — 批量ping测试# 在华为设备上批量执行ping命令fromnetmikoimport ConnectHandlerfromdatetimeimport datetime# 要ping的目标IP列表target_ips = ["192.168.1.1","192.168.1.2","192.168.1.3","192.168.1.10","192.168.1.20","10.0.0.1","10.0.0.254","172.16.0.1",]device = {"device_type""huawei","host""192.168.1.1","username""admin","password""Huawei@123",}# 记录测试结果results = {"success": [], "fail": []}print(f"🔍 开始批量ping测试 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")print("=" * 50)with ConnectHandler(**device) as conn:for ip in target_ips:# 华为设备ping命令:-c 4 表示ping 4次        cmd = f"ping -c 4 {ip}"        output = conn.send_command(cmd, read_timeout=15)# 判断结果:检查输出中是否包含丢包信息if"0.00%"in output or"0% packet loss"in output:print(f" ✅ {ip:18} — 可达")            results["success"].append(ip)elif"100.00%"in output or"100% packet loss"in output:print(f" ❌ {ip:18} — 不可达")            results["fail"].append(ip)else:print(f" ⚠️ {ip:18} — 部分丢包")            results["fail"].append(ip)# 汇总报告print("=" * 50)print(f"📊 测试完成:成功 {len(results['success'])} 个,失败 {len(results['fail'])} 个")if results["fail"]:print(f"⚠️ 不可达IP:"", ".join(results["fail"]))
📌 进阶:用Python本地ping(不需要SSH到设备上)如果你只是想从本机ping一批IP,不需要通过设备执行,可以用Python内置的 subprocess 模块或 icmplib 库:pip install icmplib然后用 from icmplib import ping 即可在本地发起ICMP ping。好处是支持并发,200个IP同时ping。

· · ·

五、实战脚本2:批量导出配置备份

这是网络工程师最常用的自动化脚本之一:每天/每周自动备份所有设备的running-config,存到本地文件,防止配置丢失。

# backup_config.py — 批量备份设备配置fromnetmikoimport ConnectHandlerfromdatetimeimport datetimeimportos# 创建备份目录today = datetime.now().strftime("%Y%m%d")backup_dir = f"./backups/{today}"os.makedirs(backup_dir, exist_ok=True)# 设备清单devices = [    {"device_type""huawei""host""192.168.1.1""username""admin""password""Huawei@123""name""Core-SW-01"},    {"device_type""huawei""host""192.168.1.2""username""admin""password""Huawei@123""name""Access-SW-01"},    {"device_type""huawei""host""192.168.1.3""username""admin""password""Huawei@123""name""Access-SW-02"},    {"device_type""huawei""host""192.168.1.4""username""admin""password""Huawei@123""name""FW-01"},]print(f"💾 开始备份配置 - {today}")print(f"📁 备份目录:{backup_dir}")print("=" * 50)success_count = 0fail_count = 0for device in devices:    name = device["name"]    host = device["host"]try:with ConnectHandler(**device) as conn:# 华为设备查看当前配置            config = conn.send_command("display current-configuration", read_timeout=30)# 保存到文件            filename = f"{backup_dir}/{name}_{host}.cfg"withopen(filename, "w", encoding="utf-8"as f:                f.write(config)print(f" ✅ {name:16} ({host}) — 备份成功")            success_count += 1except Exception as e:print(f" ❌ {name:16} ({host}) — 失败:{e}")        fail_count += 1print("=" * 50)print(f"📊 备份完成:成功 {success_count} 台,失败 {fail_count} 台")
💡 进阶技巧:配合cron/计划任务实现每日自动备份Linux/Mac:用crontab设置每天凌晨2点执行:0 2 * * * python3 /opt/scripts/backup_config.pyWindows:用"任务计划程序"创建一个每日触发任务。再配合Git做版本管理,就能看到每天配置的变更记录(diff),谁改了什么一目了然。

· · ·

六、实战脚本3:批量修改VLAN

场景:公司新来了一批员工,需要在30台接入交换机上批量创建VLAN并把接口划入对应VLAN。手动操作?至少要干两天。用脚本?十分钟搞定。

# batch_vlan.py — 批量创建VLAN并配置接口fromnetmikoimport ConnectHandlerimportcsv# VLAN配置需求(也可以从CSV文件读取)vlan_config = {"vlan_id"300,"vlan_name""Engineering","gateway""10.0.3.1 255.255.255.0","access_ports": ["GigabitEthernet0/0/10""GigabitEthernet0/0/11""GigabitEthernet0/0/12"],}# 从CSV读取设备清单devices = []withopen("devices.csv""r"as f:    reader = csv.DictReader(f)for row in reader:        devices.append(row)print(f"🔧 开始批量配置 VLAN {vlan_config['vlan_id']} ({vlan_config['vlan_name']})")print(f"📋 目标设备数:{len(devices)} 台")print("=" * 50)for device in devices:    host = device["host"]# 构建配置命令    config_cmds = [f"vlan {vlan_config['vlan_id']}",f"description {vlan_config['vlan_name']}","quit",f"interface Vlanif {vlan_config['vlan_id']}",f"ip address {vlan_config['gateway']}","quit",    ]# 为每个access端口添加配置for port in vlan_config["access_ports"]:        config_cmds.extend([f"interface {port}","port link-type access",f"port default vlan {vlan_config['vlan_id']}","quit",        ])# 保存配置    config_cmds.extend(["return""save"])try:with ConnectHandler(**device) as conn:            output = conn.send_config_set(config_cmds)print(f" ✅ {host:18} — VLAN {vlan_config['vlan_id']} 配置成功")except Exception as e:print(f" ❌ {host:18} — 失败:{e}")print("=" * 50)print("🎉 批量VLAN配置完成!")
💡 这段脚本的核心思路1. 把配置需求(VLAN ID、名称、网关、端口列表)定义为数据结构2. 把设备清单从CSV文件读取3. 用循环遍历每台设备,动态生成配置命令4. 通过send_config_set()下发配置这就是"数据驱动"的自动化思想:把"做什么"(数据)和"怎么做"(代码)分离。换一批设备、换一个VLAN,只需改数据,代码一行不动。

· · ·

七、NAPALM——多厂商统一接口

Netmiko很好用,但它有一个问题:不同厂商的命令不一样。华为用 display version,思科用 show version,H3C又用别的命令。如果你的网络是多厂商混合环境(这在企业中很常见),就需要针对不同厂商写不同的代码。

NAPALM(Network Automation and Programmability Abstraction Layer with Multivendor support)解决的就是这个问题——它提供了一套统一的API,不管底层是华为、思科还是Juniper,调用的方法都一样。

💡 生活类比:万能遥控器Netmiko = 每个品牌的专用遥控器:索尼电视用索尼遥控器,三星电视用三星遥控器。你有5个品牌的设备,桌上就摆5个遥控器。NAPALM = 万能遥控器:一个遥控器,切换设备类型后,按同一个"电源"按钮就能控制所有电视。在NAPALM中,get_facts() 在华为上自动翻译成 display version,在思科上自动翻译成 show version。你不用关心底层命令是什么。

7.1 NAPALM基本用法

# napalm_demo.py — 用统一API获取设备信息importnapalm# 选择设备驱动(华为VRP用 huawei_vrpv8)driver = napalm.get_network_driver("huawei_vrpv8")# 建立连接device = driver(    hostname="192.168.1.1",    username="admin",    password="Huawei@123",    optional_args={"port"22})device.open()# 获取设备基本信息(统一API)facts = device.get_facts()print("设备信息:", facts)# 输出: {'hostname': 'Core-SW', 'vendor': 'Huawei', 'model': 'S5735', ...}# 获取接口信息(统一API)interfaces = device.get_interfaces()for name, info in interfaces.items():if info["is_up"]:print(f" {name:25} UP speed={info['speed']}")# 获取ARP表arp_table = device.get_arp_table()print(f"ARP表项数:"len(arp_table))# 获取路由表routes = device.get_route_to(destination="0.0.0.0/0")print("默认路由:", routes)device.close()

7.2 NAPALM的配置管理与回滚

NAPALM最强大的功能之一是配置对比和回滚。它可以在下发配置前先看diff(差异),确认没问题再提交。如果出了问题,可以一键回滚。

# napalm_config.py — 配置对比、提交、回滚importnapalmdriver = napalm.get_network_driver("huawei_vrpv8")device = driver("192.168.1.1""admin""Huawei@123")device.open()# 加载新的配置文件(merge=增量合并,replace=全量替换)device.load_merge_candidate(filename="new_config.cfg")# 查看变更差异(不实际生效)diff = device.compare_config()if diff:print("即将变更的内容:")print(diff)# 确认无误后提交    confirm = input("确认提交?(y/n): ")if confirm == "y":        device.commit_config()print("✅ 配置已提交")else:        device.discard_config()print("❌ 已放弃变更")else:print("无变更")# 如果配置出了问题,可以回滚到上一个版本# device.rollback()device.close()
📋 Netmiko vs NAPALM 对比
对比维度 | Netmiko | NAPALM
适用场景 | 执行任意CLI命令 | 获取结构化数据、配置管理
多厂商支持 | 需要自己适配不同命令 | 统一API自动翻译
配置回滚 | 不支持(需自己实现) | 原生支持
输出格式 | 原始文本(需自己解析) | 结构化字典/JSON
底层协议 | SSH/SCP | SSH/NETCONF

· · ·

八、Ansible——无代码自动化

如果你不想写Python代码,又想要自动化能力,Ansible 是你的好选择。它用一种叫 YAML 的标记语言来描述任务,不需要写一行代码。

💡 Ansible的工作方式Ansible是无Agent的——不需要在目标设备上安装任何软件。它通过SSH连接到设备,执行命令,然后断开。就像你手动SSH登录设备一样,只不过Ansible帮你自动化了这个过程。Ansible Controller(你的电脑/服务器)→ SSH → 网络设备(华为/思科/...)

8.1 安装Ansible

# 安装Ansible
pip install ansible
# 安装华为Collection(华为设备专用模块)
ansible-galaxy collection install community.network
ansible-galaxy collection install ansible.netcommon

8.2 Inventory文件——设备清单

# inventory.yml — Ansible设备清单
all:
  children:
    huawei_switches:
      hosts:
        core-sw-01:
          ansible_host: 192.168.1.1
          ansible_user: admin
          ansible_password: Huawei@123
          ansible_network_os: community.network.ce
        access-sw-01:
          ansible_host: 192.168.1.2
          ansible_user: admin
          ansible_password: Huawei@123
          ansible_network_os: community.network.ce
      vars:
        ansible_connection: ansible.netcommon.network_cli

8.3 Playbook——用YAML描述任务

下面是一个完整的Ansible Playbook,功能是:登录所有华为交换机,查看版本信息并备份配置。

# backup_playbook.yml — 批量备份华为设备配置
---
- name: 备份华为交换机配置
  hosts: huawei_switches
  gather_facts: no
  tasks:
    - name: 获取设备版本信息
      community.network.ce_command:
        commands:
          - display version
      register: version_output
    - name: 打印版本信息
      debug:
        var: version_output.stdout_lines
    - name: 获取当前配置
      community.network.ce_command:
        commands:
          - display current-configuration
      register: config_output
    - name: 保存配置到本地文件
      copy:
        content: "{{ config_output.stdout[0] }}"
        dest: "./backups/{{ inventory_hostname }}.cfg"

执行这个Playbook:

# 运行Ansible Playbook
ansible-playbook -i inventory.yml backup_playbook.yml

8.4 Ansible批量配置VLAN

# vlan_playbook.yml — 批量配置VLAN
---
- name: 批量创建VLAN
  hosts: huawei_switches
  gather_facts: no
  vars:
    vlan_list:
      - { id: 100, name: "Management" }
      - { id: 200, name: "Office" }
      - { id: 300, name: "Engineering" }
  tasks:
    - name: 创建VLAN
      community.network.ce_config:
        lines:
          - "vlan {{ item.id }}"
          - "description {{ item.name }}"
          - "quit"
      loop: "{{ vlan_list }}"
    - name: 保存配置
      community.network.ce_config:
        lines:
          - save
📌 Ansible的幂等性(Idempotency)Ansible的配置模块是幂等的——意思是"执行一次和执行一百次效果一样"。如果VLAN 100已经存在,Ansible不会重复创建;如果配置已经是目标状态,Ansible会跳过。这是相比纯Python脚本的巨大优势:你不用担心重复执行会出问题。

· · ·

九、华为NETCONF/YANG接口简介

前面讲的Netmiko和Ansible,底层都是通过SSH + CLI命令行来操作设备。这种方式虽然简单,但有一个根本性的问题:CLI输出是非结构化的文本,需要用正则表达式去解析,很脆弱——华为一升级固件改了输出格式,你的解析代码就全废了。

NETCONF(Network Configuration Protocol)是一种专门为网络设备管理设计的协议。它用XML/JSON格式传输数据,完全结构化,不需要解析文本。

💡 CLI vs NETCONF 的区别CLI方式:你发 display version,设备回一段文字,你需要自己从文字里提取版本号、运行时间等信息。NETCONF方式:你发一个XML请求,设备回一个结构化的XML/JSON响应,每个字段都有明确的标签。直接取数据,不需要解析。YANG 是NETCONF的数据建模语言——它定义了设备有哪些数据可以查询/修改,就像数据库的表结构定义。华为设备的YANG模型文档可以在华为官网下载。

9.1 NETCONF连接示例

华为CE(CloudEngine)系列交换机和NE路由器支持NETCONF协议,默认端口830。

# netconf_demo.py — 通过NETCONF获取华为设备信息fromncclientimport manager# 建立NETCONF连接(端口830)conn = manager.connect(    host="192.168.1.1",    port=830,    username="admin",    password="Huawei@123",    hostkey_verify=False,    device_params={"name""huawei"})print("✅ NETCONF连接成功")print("支持的能力集:")for cap in conn.server_capabilities:print(" ", cap)# 发送RPC请求获取设备信息rpc = """<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">  <get-system-info xmlns="urn:huawei:yang:hw-system">  </get-system-info></rpc>"""reply = conn.dispatch(rpc)print("设备信息(XML):")print(reply.xml)# 获取配置config = conn.get_config(source="running")print("当前配置(XML):")print(config.xml[:500]) # 只打印前500字符conn.close_session()

9.2 NETCONF操作类型

📋 NETCONF四大操作
<get> — 获取设备运行状态数据(类似 display 命令)
<get-config> — 获取设备配置(类似 display current-configuration)
<edit-config> — 修改设备配置(支持merge/replace/remove操作)
<commit> — 提交配置变更(如果设备支持candidate datastore)
📌 NETCONF vs RESTCONFNETCONF:基于SSH(端口830),使用XML格式,2006年标准化(RFC 4741/6241)。RESTCONF:基于HTTPS(端口443),使用JSON/YANG+JSON格式,更像Web API。华为新设备(如iMaster NCE)支持RESTCONF。两者都基于YANG数据模型,本质功能一样,只是传输协议不同。RESTCONF更适合与现代Web应用集成。

· · ·

十、自动化运维最佳实践

自动化是双刃剑——用好了效率翻倍,用不好一键搞瘫全网。以下是几条血泪经验总结的最佳实践:

10.1 版本管理——用Git管理所有配置和脚本

每一个自动化脚本、每一份设备配置都应该纳入Git版本管理。这样做的好处:

🔑 Git管理网络配置的好处• 变更追溯:谁在什么时候改了什么配置,一目了然(git log / git diff)• 回滚能力:配置改坏了?git revert 回到上一个版本• 团队协作:多人修改同一个脚本/配置不会冲突(git merge)• 审批流程:用 Pull Request 做配置变更审批,避免"一人改全网"• 自动备份:Git本身就是备份,push到远程仓库(GitHub/GitLab)更安全
# 推荐的网络自动化仓库结构
network-automation/
├── inventory/
│   ├── devices.csv
│   └── inventory.yml
├── scripts/
│   ├── backup_config.py
│   ├── batch_vlan.py
│   └── health_check.py
├── playbooks/
│   ├── backup.yml
│   └── vlan_config.yml
├── backups/
│   └── 20260616/
│       ├── Core-SW-01.cfg
│       └── Access-SW-01.cfg
└── README.md

10.2 测试环境——先在模拟器上验证

⚠️ 铁律:任何自动化脚本,先模拟器,后生产!永远不要在未经测试的情况下对生产设备执行自动化脚本。一个循环里的bug可能让100台设备同时断网。推荐测试流程:1. 在 eNSP模拟器 中搭建与生产环境类似的拓扑2. 用模拟器测试脚本逻辑、命令语法、异常处理3. 在 一台非关键设备 上先跑(金丝雀发布)4. 确认无误后,再推广到所有设备

10.3 回滚机制——永远留一条退路

自动化脚本中必须包含回滚机制。以下是几种常见的回滚策略:

# rollback_demo.py — 带回滚的配置脚本fromnetmikoimport ConnectHandlerimporttimedevice = {"device_type""huawei","host""192.168.1.1","username""admin","password""Huawei@123",}# 策略1:先备份,再修改with ConnectHandler(**device) as conn:# Step 1: 备份当前配置    backup = conn.send_command("display current-configuration", read_timeout=30)withopen("pre_change_backup.cfg""w"as f:        f.write(backup)print("✅ 已备份当前配置")# Step 2: 执行配置变更    config_cmds = ["vlan 500""description Test-VLAN""quit"]    output = conn.send_config_set(config_cmds)print("🔧 配置已下发")# Step 3: 验证(检查关键业务是否正常)    check = conn.send_command("ping -c 4 192.168.1.254")if"100.00%"in check:print("❌ 验证失败!正在回滚...")# 回滚:删除刚创建的配置        rollback_cmds = ["undo vlan 500"]        conn.send_config_set(rollback_cmds)print("↩️ 已回滚")else:print("✅ 验证通过,保存配置")        conn.send_command("save")

10.4 日志和告警

自动化脚本应该有完善的日志记录——什么时候执行了什么、成功还是失败、错误详情是什么。

# 使用Python logging模块记录日志importlogginglogging.basicConfig(    level=logging.INFO,    format="%(asctime)s [%(levelname)s] %(message)s",    handlers=[        logging.FileHandler("automation.log"),        logging.StreamHandler()    ])logger = logging.getLogger("net_auto")# 使用示例logger.info("开始备份设备配置...")logger.info(f"成功备份: {host}")logger.error(f"连接失败: {host} - {error}")
📋 自动化运维最佳实践清单
✅ 版本管理:所有脚本和配置纳入Git,变更有记录
✅ 先测后上:模拟器 → 单台试点 → 全网推广
✅ 备份先行:每次变更前自动备份当前配置
✅ 回滚机制:脚本内置自动回滚逻辑(验证失败即回滚)
✅ 日志记录:所有操作有日志,出错有告警
✅ 最小权限:自动化账号只给必要权限,不用root
✅ 密码安全:密码不硬编码在脚本中,用环境变量或加密文件
✅ 并发控制:合理设置并发数,避免同时对太多设备操作

· · ·

十一、总结与下篇预告

今天我们打开了网络自动化的大门,从最基础的SSH脚本到企业级自动化工具,一路走了过来。让我们回顾一下今天学到的核心知识:

📋 本篇知识回顾
🔹 为什么学Python:效率提升100倍+,减少人为错误
🔹 Netmiko:SSH登录设备、执行命令、批量遍历、配置模式
🔹 三大实战脚本:批量ping / 配置备份 / 批量VLAN
🔹 NAPALM:多厂商统一API、配置diff、回滚能力
🔹 Ansible:无代码自动化、YAML Playbook、幂等性
🔹 NETCONF/YANG:结构化数据接口、华为可编程网络
🔹 最佳实践:Git版本管理 / 测试环境 / 回滚机制 / 日志告警
🔑 一张图总结自动化工具选型小团队 / 快速上手:Netmiko(Python脚本,灵活自由)多厂商混合环境:NAPALM(统一API)或 Ansible(统一Playbook)大型企业 / 标准化运维:Ansible + NETCONF/YANG + SDN控制器华为全家桶:华为iMaster NCE(SDN控制器) + NETCONF + YANG模型不管选哪个工具,核心思想是一样的:把重复性劳动交给机器,把时间留给架构设计和故障分析
📌 给初学者的学习建议1. 先学Netmiko:它最直观,就是你手动SSH操作的自动化版本2. 写三个脚本:备份配置、批量ping、批量配置——这三个场景覆盖80%的日常需求3. 再学Ansible:当你的脚本越来越多,需要更好的管理和协作时4. 最后学NETCONF:当你需要结构化数据、需要和SDN控制器对接时不要贪多,把一个工具用到极致,再学下一个。

· · ·

📢 下篇预告:第18篇——网络监控——让设备自己"喊疼"自动化解决了"配置管理"的问题,但网络运维还有一半工作没解决——监控和告警你不可能每天手动检查100台设备的CPU、内存、接口流量。你需要一套监控系统,让设备主动告诉你哪里出了问题。下一篇我们将学习:• SNMP协议原理与配置• Syslog日志收集与分析• NetStream/sFlow流量监控• 开源监控方案:Zabbix + Prometheus + Grafana• 华为Telemetry实时遥测技术• 搭建一个完整的网络监控大屏从"救火"到"防火"——这才是高级网络工程师的核心能力。
华为数通从0到1 · 第二季 · 第17篇网络自动化——用Python批量管设备© 2026 技术连载 · 转载请注明出处

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-02 23:25:24 HTTP/2.0 GET : https://f.mffb.com.cn/a/501682.html
  2. 运行时间 : 0.857665s [ 吞吐率:1.17req/s ] 内存消耗:4,555.16kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=683e45ea499cb7aad802117fed1cc0e3
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000600s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000611s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003752s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.012767s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000725s ]
  6. SELECT * FROM `set` [ RunTime:0.015200s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000813s ]
  8. SELECT * FROM `article` WHERE `id` = 501682 LIMIT 1 [ RunTime:0.101196s ]
  9. UPDATE `article` SET `lasttime` = 1783005924 WHERE `id` = 501682 [ RunTime:0.091810s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.017414s ]
  11. SELECT * FROM `article` WHERE `id` < 501682 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.046609s ]
  12. SELECT * FROM `article` WHERE `id` > 501682 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.009652s ]
  13. SELECT * FROM `article` WHERE `id` < 501682 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.108104s ]
  14. SELECT * FROM `article` WHERE `id` < 501682 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.244813s ]
  15. SELECT * FROM `article` WHERE `id` < 501682 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.127250s ]
0.860501s