网络自动化运维 Help

4-1 LLDP服务和JSON格式

介绍

链路发现协议介绍

LLDP协议:(Link Layer Discovery Protocol)是IEEE 802.1ab中定义的链路层发现协议。LLDP是一种标准的二层发现方式,可以将本端设备的管理地址、设备标识、接口标识等信息组织起来,并发布给自己的邻居设备,邻居设备收到这些信息后将其以标准的管理信息库MIB(Management Information Base)的形式保存起来,以供网络管理系统查询及判断链路的通信状况。

目的: 随着网络规模越来越大,网络设备种类繁多,并且各自的配置错综复杂,对网络管理能力的要求也越来越高。传统网络管理系统多数只能分析到三层网络拓扑结构,无法确定网络设备的详细拓扑信息、是否存在配置冲突等。因此需要有一个标准的二层信息交流协议。 LLDP提供了一种标准的链路层发现方式。通过LLDP获取的设备二层信息能够快速获取相连设备的拓扑状态;显示出客户端、交换机、路由器、应用服务器以及网络服务器之间的路径;检测设备间的配置冲突、查询网络失败的原因。企业网用户可以通过使用网管系统,对支持运行LLDP协议的设备进行链路状态监控,在网络发生故障的时候快速进行故障定位。 1

实验设计

4 1
  1. S0交换机和Cloud结构与2-1节相同。

  2. 在S0交换机上分出几台其它设备构成拓扑网络,所有节点开启LLDP网络发现。

  3. 在S0上获取拓扑节点信息,使用netmiko库ssh连接远程服务器,通过lldp协议获取S0节点相关的拓扑信息。

  4. 处理拓扑信息数据,使用graphviz绘制拓扑图。

1.S5700与物理机互通

详见2-1eNSP设备节点与物理机通讯.md

# 设备端简化版配置 <Huawei>system-view [Huawei]interface vlanif 1 [Huawei-Vlanif1]ip address 192.168.56.100 24 [Huawei-Vlanif1]quit

2.配置SSH

详见3-1SSH协议.md
因为需要先远程连接服务器,才能做后面的事,重复SSH内容。

<Huawei>system-view [Huawei]undo info-center enable [Huawei]aaa [Huawei-aaa]local-user zhangsan password cipher Huawei@123 [Huawei-aaa]local-user zhangsan service-type ssh [Huawei-aaa]quit [Huawei]stelnet server enable [Huawei]ssh user zhangsan authentication-type password [Huawei]ssh user zhangsan service-type stelnet [Huawei]user-interface vty 0 4 [Huawei-ui-vty0-4]authentication-mode aaa [Huawei-ui-vty0-4]user privilege level 15 [Huawei-ui-vty0-4]protocol inbound ssh [Huawei-ui-vty0-4]quit [Huawei]display ssh server status [Huawei]display ssh user-information zhangsan

3.更多设备节点和命名设备

拉出更多S5700设备,启动,与第一台S5700连接。
分别登录设备,顶级节点命名为S0 ,另外的命名为S1、S2

<Huawei>sy [Huawei]sysname S0 # 为三台设备命名为不同名字 [S0]

4.分别开启LLDP服务

一行命令即可开启LLDP功能。所有设备都分别开启。

[S0]lldp enable # 为所有设备分别开启

5.或直接导入工程

鉴于内容跟之前两章重复,也可以直接导入。

⏬下载地址: eNSP工程-unit4-一些节点开启lldp发现.zip

6.验证结果

在S0设备上输入

[S0]display lldp neighbor brief

能看到回显信息,与S0连接的S1、S2节点信息为成功。

Local Intf Neighbor Dev Neighbor Intf Exptime GE0/0/2 S1 GE0/0/1 95 GE0/0/3 S2 GE0/0/1 113
4 1 lldp

JSON格式

介绍

JSON:(JavaScript Object Notation,JavaScript 对象表示法)是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成,广泛应用于 Web 应用程序中。

想一想为什么需要json格式?直接将输出存储在本地记事本中;存储在数据库中;将信息从一台服务器发送至客户端;服务器上使用的编程语言和框架各部相同。

数据类型和语法

数据类型

  • 字符串:由双引号包围的 Unicode 字符序列。

  • 数字:可以是整数或浮点数。

  • 布尔值:true 或 false。

  • 数组:由方括号 [] 包围的有序值序列,值之间用逗号分隔。

  • 对象:由花括号 {} 包围的键值对集合,键值对之间用逗号分隔,键和值之间用冒号分隔。

  • 空值:null。

语法规则:

  • 数据以键值对的形式存在。

  • 键值对之间用逗号分隔。

  • 对象由花括号 {} 包围。

  • 数组由方括号 [] 包围。

  • 字符串必须用双引号包围。

示例:

{ "name": "学生数据", "students": [ { "name": "John Doe", "age": 30, "isEmployed": true, "address": { "street": "123 Main St", "city": "Anytown" }, { "name": "John Doe", "age": 30, "isEmployed": true, "address": { "street": "123 Main St", "city": "Anytown" } ] }

与Python Dict字典的区别

虽然长的跟Python字典完全一致,但只是恰巧罢了。Dict字典是Python内置的数据结构,在硬盘上以二进制字节存在,我们看到的是解码后的信息。
Python的dict字典、Javascript的对象、Java的Map都是键值对映射,支持的数据类型和语法甚至完全一样,以至于看上去一样,但它们的具体实现和存储在硬盘上的字节肯定是不一样的。
因此,需要XML、JSON这种可以作为中间通用格式的字符串存在。

Json字符串与python Dict互转

使用内置库json。
dict转json字符串: dict.dumps()
json字符串转dict: jsonstring.loads()
注意:dict.dump()和string.load()方法针对文件。

# 字典转json字符串 import json data = { 'name': 'S0', 'nodes': [ { 'start_int': 'GE0/0/2', 'next_node': 'S1', 'end_int': 'GE0/0/1' }, { 'start_int': 'GE0/0/3', 'next_node': 'S2', 'end_int': 'GE0/0/1' } ] } jsonstr = json.dumps(data) # 观察俩者的类型和输出的不同。 print(type(data), data) print(type(jsonstr), jsonstr)
# json字符串转字典 import json jsonstr = """ { "name": "John Doe", "age": 30 } """ data = json.loads(json_string) print(type(data), data) print(type(jsonstr), jsonstr)
17 三月 2025