企业网络基础设施技术分享头像
关注
网络自动化Python课程:YANG数据建模语言入门封面图

网络自动化Python课程:YANG数据建模语言入门

📑 知识精讲

本课程由拥有20年行业经验的思科认证系统讲师主讲,系统讲解YANG数据建模语言的核心概念、层级架构、分类体系、配套工具链,以及它与NETCONF、RESTCONF等传输协议的协作关系,最终通过实操演示帮助学员掌握YANG在网络自动化场景中的落地方法。

课程整体介绍与学习目标

  • 讲师背景与课程定位:本次课程的主讲人为思科内容开发工程师,拥有20年思科认证系统讲师与咨询经验,课程面向网络自动化工程师,聚焦YANG数据建模语言的核心知识与实操应用。

  • 核心学习内容:课程将覆盖YANG的基础结构、语法规则、Python调用方法,同时讲解YANG开发常用工具,最后通过思科YANG套件完成实操实验。

    • 🚩重点:YANG是专为网络数据设计的标准化数据建模语言,掌握它是理解和使用NETCONF、RESTCONF等网络配置协议的核心前提。

网络自动化与数据模型的基础概念

  • 网络自动化的核心驱动:网络自动化发展的关键动力是NETCONF等协议的标准化,而这些协议要实现实用、可移植、可靠的特性,必须依赖标准化的数据模型框架,定义数据的语法与语义。

  • 无标准化数据模型的痛点:如果没有统一的数据模型,网络自动化工程师需要在不同平台、不同厂商之间反复转换数据模型,开发和维护编排软件的复杂度会大幅提升。

    • 🚩重点:YANG是NETCONF、RESTCONF、gNMI等协议最通用的数据建模语言,它的诞生初衷就是为NETCONF提供标准化的数据模型支撑。

YANG的基础定义与核心属性

  • YANG的官方定义:YANG全称为"Yet Another Next Generation",是IETF在2010年通过RFC 6020定义的数据建模语言,专门面向网络基础设施与网络构造。

  • YANG的核心能力:它可以精准描述网络设备上可配置的内容、可监控的状态,以及可执行的管理操作。

  • YANG的语言特性:具备人类可读易学习、层级化配置模型、可复用类型与分组、支持扩展增强、配置校验约束、模块化、版本规则明确等特点。

    • 🚩重点:YANG不是API也不是传输协议,这是初学者最容易混淆的知识点。

从日常实体理解数据模型

  • 数据模型的本质:数据模型用于描述离散实体的元素,以及元素之间的关联关系,它广泛存在于日常生活场景中。

  • 生活化示例:以人的属性为例,年龄必须是整数、姓名只能是字符串,数据模型会明确定义每一项数据的类型与关联规则;软件产品也可以通过版本、厂商、能力等属性完成建模。

    • 🚩重点:数据模型的核心作用是明确定义数据的合法格式、取值范围与关联逻辑,避免数据歧义。

CLI命令行背后的数据模型逻辑

  • CLI报错的底层原理:在网络设备CLI中配置非法接口速度时,系统返回的报错本质是违反了接口数据模型的约束规则。

  • 逻辑接口的特性约束:Loopback等逻辑接口不支持speed、duplex等物理属性,这一限制同样由设备数据模型定义,用户虽然看不到模型,但它始终在后台管控设备配置行为。

    • 🚩重点:所有CLI的配置校验、命令可见性限制,底层都是由数据模型实现的。

YANG的层级架构与核心特征

  • YANG的层级定位:YANG作为数据建模语言,生成YANG数据模型后可编码为XML或JSON格式,分别通过NETCONF、RESTCONF协议传输,最终在Python中使用ncclient、requests库调用。

  • YANG的核心特性:以网络数据为核心、最初为NETCONF设计现在支持多协议、可同时建模配置与运行状态数据、明确定义数据的语法与语义。

  • YANG的树状结构:YANG模型是典型的树状层级结构,例如可以定义BGP路由器的AS号合法取值范围为0-65535,强制约束输入数据的合法性。

    • 🚩重点:YANG是强结构化、强类型的独立建模语言,不依赖任何特定传输协议。

YANG模块与分类体系

  • YANG模块定义:单个YANG数据模型可以由一个或多个YANG模块组成,每个模块都是独立的YANG代码文件。

  • 设备模型与服务模型:设备模型聚焦单台设备的网络特性,例如接口、VLAN、OSPF等;服务模型面向大规模网络编排,例如L3 MPLS VPN、租户模型等,需要映射到底层设备模型。

  • YANG模型获取渠道:思科官方YANG模型开源仓库地址为 https://github.com/YangModels/yang,可获取不同平台版本的模型文件。

    • 🚩重点:初学者优先从单设备网络特性维度理解YANG模型,服务模型属于进阶内容。

YANG的扩展与偏离机制

  • 标准模型的扩展逻辑:YANG支持对标准模型进行augmentation(增强)和deviation(偏离),厂商可以基于通用标准模型添加自定义特性。

  • 生活化类比:标准蓝色圆珠笔是基础模型,厂商可以扩展出双色笔等增强版本,用户也可以自行修改笔的结构实现静音效果,对应厂商在标准YANG模型基础上添加私有特性。

    • 🚩重点:厂商自定义的增强与偏离规则同样使用YANG编写,可在设备或公开仓库中与标准模型一同获取。

YANG基础语句元素

  • leaf节点:代表单个数据节点,没有子节点,只能存储一个数值,可以是数字、字符串等类型。

  • leaf-list节点:同类型数据的集合,类似Excel中的一列,例如Trunk端口允许通过的VLAN ID列表。

  • container节点:仅用于组织子节点,自身不存储数据,直接映射XML和JSON中的层级结构。

  • list节点:可以存储多组不同类型的子节点,类似完整的Excel表格,支持多行多列数据。

    • 🚩重点:leaf、leaf-list、container、list是YANG最核心的四个基础构建语句。

YANG模型的两大分类

  • 行业标准模型:由IETF、OpenConfig等组织制定,厂商与平台中立,例如IETF定义的接口模型,仅包含通用基础配置信息。

  • 厂商专属模型:由设备厂商自定义,例如思科针对EIGRP等私有协议提供的专属模型,可以访问全部厂商私有特性,功能覆盖更完整。

    • 🚩重点:不同类型的接口模型返回数据差异明显,OpenConfig模型会额外返回接口运行状态信息,IETF模型仅保留基础通用字段。

YANG生态工具链介绍

  • YANG验证工具:用于校验YANG模块语法正确性,检测语法错误与对象依赖问题。

  • YANG解析工具:将设备运行配置转换为符合YANG模型的JSON或XML结构化数据。

  • YANG转换工具:将YANG模块转换为UML、树状图、JSON等多种可视化格式。

  • YANG代码生成工具:基于YANG模型自动生成可交互的代码类,降低开发门槛。

    • 🚩重点:PYANG是最主流的Python开源YANG工具,支持验证、可视化转换等多种核心功能。

主流YANG实用工具详解

  • pyang工具:可生成YANG模型的树状可视化输出、UML图,支持生成XML骨架、HTML格式的可折叠树视图,直观展示模型的读写属性与数据类型。

  • YANG Development Kit (YDK):开源SDK,封装了协议与编码细节,大幅降低YANG自动化脚本的开发难度。

  • YANG Explorer:支持可视化浏览YANG模型树,辅助生成NETCONF与RESTCONF请求。

  • YANG Validator:在线工具,支持通过RFC编号、IETF草案名称或上传文件的方式校验YANG模型。

思科YANG Suite实操演示

  • 工具定位:基于Django开发的开源Web应用,提供可视化YANG操作界面,支持NETCONF、RESTCONF、gNMI等协议。

  • 初始化配置流程:首先创建YANG模型仓库,通过本地上传、NETCONF下载、SCP拷贝、Git克隆等方式导入模型,再创建YANG模块集实现模型分组管理,最后配置设备连接凭证。

  • 核心功能演示:可视化浏览YANG模型树结构,自动生成符合模型规范的RPC请求,支持直接下发get-config、edit-config等操作到真实网络设备。

    • 🚩重点:使用YANG模型驱动API时,必须严格遵循模型定义的数据结构,否则通信会失败。

课程总结与后续学习指引

  • 核心收获:学员掌握YANG基础概念后,就可以基于NETCONF、RESTCONF等协议对网络设备进行自动化配置与监控。

  • 后续学习方向:在YANG基础概念之上,可以深入学习NETCONF与RESTCONF协议的细节,完成更复杂的网络自动化开发任务。

💡 核心概念
  • YANG:IETF在RFC 6020中定义的网络-centric数据建模语言,用于描述网络设备的配置、状态与管理操作。

  • 数据模型:描述离散实体的元素以及元素之间关联关系的规则集合,明确定义数据的合法格式与取值范围。

  • YANG leaf:YANG中的单个数据节点,没有子节点,仅存储一个数值。

  • YANG container:YANG中的组织节点,自身不存储数据,仅用于归类子节点,映射XML/JSON的层级结构。

  • YANG augmentation/deviation:YANG支持对标准模型进行扩展或自定义偏离,适配厂商的私有特性需求。

  • YANG层级栈图:(根据课堂图片)YANG → YANG Data Model → XML/JSON → NETCONF/RESTCONF → ncclient/requests

✨ 课堂金句
  • "你可能从来没见过数据模型,但它一直都在,定义着你的设备该怎么被配置。"

  • "YANG不是用来传输数据的,它是用来定义数据长什么样的。"

  • "当你在CLI看到报错的时候,换个角度想:是你违反了这个功能的数据模型规则。"

📝 待办事项
  • 实操任务:完成思科YANG Suite的环境搭建,导入设备YANG模型,生成并下发一条接口配置RPC请求。

  • 阅读参考:访问思科开源YANG模型仓库 https://github.com/YangModels/yang,浏览对应设备平台的YANG模型文件。

  • 后续学习:深入学习NETCONF与RESTCONF协议的细节,掌握基于YANG的全流程网络自动化开发。

  • 工具练习:使用PYANG生成IETF接口模型的树状可视化输出,理解模型的层级结构。

🔍 YANG基础概念
  • 定义:YANG(Yet Another Next Generation)是由IETF在RFC 6020中定义的网络数据建模语言,专注于网络基础设施和构造,描述设备可配置项、可监控项及管理操作。

  • 核心属性

    • ✅ 人类可读且易于学习

    • ✅ 层次化配置数据模型

    • ✅ 可重用类型与分组(结构化类型)

    • ✅ 通过扩展实现可扩展性

    • ✅ 用于配置验证的形式化约束

    • ✅ 通过模块和子模块实现数据模块化

    • ✅ 定义明确的版本控制规则

🔗 YANG与网络自动化
  • 数据模型的重要性:网络配置协议(如NETCONF、RESTCONF、gNMI)需标准化数据模型确保实用性、可移植性和可靠性,YANG是此类协议的主流数据建模语言

  • 应用挑战:工程师面临YANG结构复杂性、语法学习及Python集成等挑战(如使用ncclient库操作NETCONF协议)。

  • 工具支持:开源社区及Cisco等厂商提供开发工具(如Cisco YANG套件),课程包含基于Cisco YANG套件的实操实验。

📊 YANG模型分类

类型

定义主体

特点

示例

行业标准模型

IETF、ITU、OpenConfig等

符合标准规范,通用性强

ietf-diffserv-policy.yang

Cisco通用模型

Cisco

跨Cisco平台通用

OTV(适用于IOS XE和NX-OS)

Cisco平台特定模型

Cisco

特定于Cisco某平台

IOS XE上的BGP扩展

🏗️ YANG模型结构与特性
  • 层次化结构:YANG模型采用树形层级结构,每个数据模型是一个模块(Module),包含自包含的顶级节点层级。

  • 核心组件

    • 📦 容器(Container):用于分组相关节点

    • 📜 列表(List):标识按序列存储的节点

    • 🍃 叶子节点(Leaf):表示节点的单个属性,必须关联数据类型

    • 🔄 数据类型:可从其他模块导入或在模块内定义

  • 数据编码:YANG模型数据可编码为XML或JSON,分别通过NETCONF和RESTCONF协议传输。

🌐 网络与服务模型应用
  • 设备模型:聚焦单设备网络特性,如接口、VLAN、ACL、隧道、OSPF等。

  • 服务模型:定义复杂网络服务,如L3 MPLS VPN、MP-BGP、VRF、系统管理和网络故障,常与Cisco NSO等编排工具结合用于大规模自动化。

  • 模型扩展与偏差:支持对标准模型的增强(Augmentation)偏差(Deviation),厂商可根据实现需求调整标准模型(如BGP的毫秒级BFD扩展)。

🚀 YANG与传输协议关系
  • 独立性:YANG仅定义数据的语法、语义和约束,不涉及数据传输机制。

  • 协议映射

    • XML编码 → NETCONF协议 → Python库:ncclient

    • JSON编码 → RESTCONF协议 → Python库:requests

  • 类比关系:YANG模块对于NETCONF/RESTCONF的作用类似MIBs对于SNMP,核心优势在于可读性和结构化设计。

💻 CLI与YANG模型映射实例
  • 配置验证:设备CLI命令的有效性由YANG模型约束(如接口速率配置speed 1000000因超出模型定义范围报错,合法值为1000/10000 Mbps)。

  • 接口类型差异:逻辑接口(如Loopback)不支持物理属性(如速率),此限制由设备模型定义。

PS:由于连接么美国远程实验室延迟太大,直接将实验步骤和答案直接粘贴至以下:

Received message from host
<?xml version="1.0" ?>
<rpc-reply message-id="urn:uuid:1a26213a-ffcd-46c8-9e80-a052a8ffed49" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
  <data>
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
      <interface>
        <name>GigabitEthernet1</name>
        <description>MGMT - 172.21.1.20/24</description>
        <type xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type">ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
        <ipv4 xmlns="urn:ietf:params:xml:ns:yang:ietf-ip">
          <address>
            <ip>172.21.1.21</ip>
            <netmask>255.255.255.0</netmask>
          </address>
        </ipv4>
        <ipv6 xmlns="urn:ietf:params:xml:ns:yang:ietf-ip"/>
      </interface>
      <interface>
        <name>GigabitEthernet2</name>
        <description>VLAN 12 - R1 TO R2 P2P</description>
        <type xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type">ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
        <ipv4 xmlns="urn:ietf:params:xml:ns:yang:ietf-ip">
          <address>
            <ip>10.0.12.1</ip>
            <netmask>255.255.255.252</netmask>
          </address>
        </ipv4>
        <ipv6 xmlns="urn:ietf:params:xml:ns:yang:ietf-ip"/>
      </interface>
      <interface>
<-- output omitted -->

Received message from host
<?xml version="1.0" ?>
<rpc-reply message-id="urn:uuid:1d40816d-3748-410d-8cf9-549221668d9e" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
  <data>
    <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
      <interface>
        <name>GigabitEthernet1</name>
        <description>MGMT - 172.21.1.20/24</description>
        <type xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type">ianaift:ethernetCsmacd</type>
        <enabled>true</enabled>
        <ipv4 xmlns="urn:ietf:params:xml:ns:yang:ietf-ip">
          <address>
            <ip>172.21.1.21</ip>
            <netmask>255.255.255.0</netmask>
          </address>
        </ipv4>
        <ipv6 xmlns="urn:ietf:params:xml:ns:yang:ietf-ip"/>
      </interface>
    </interfaces>
  </data> </rpc-reply>

student@student-vm:~$ pyang --help | more
Usage: pyang [options] [<filename>...]

Validates the YANG module in <filename> (or stdin), and all its dependencies.

Options:
  -h, --help            Show this help message and exit 
  -v, --version         Show version number and exit 
  -V, --verbose          
  -e, -- -errors     Print a listing of all error and warning codes and 
                        exit. 
  --print-error-code    On errors, print the error code instead of the error 
                        message. 
  -W WARNING            If WARNING is 'error', treat all warnings as errors, 
                        except any listed WARNING. If WARNING is 'none', do 
                        list not report any warnings. 
  -E WARNING            Treat each WARNING as an error.  For a list of 
                        warnings, use --list-errors. 
  --ignore-error=ERROR  Ignore ERROR.  Use with care.  For a list of errors, 
                        use --list-errors. 
  --ignore-errors       Ignore all errors.  Use with care. 
  --canonical           Validate the module(s) according to the canonical YANG 
                        order. 
  --max-line-length=MAX_LINE_LEN 
  --max-identifier-length=MAX_IDENTIFIER_LEN 
  -t TRANSFORMS, --transform=TRANSFORMS 
                        Apply transform TRANSFORM.  Supported transforms are: 
  -f FORMAT, --format=FORMAT 
                        Convert to FORMAT.  Supported formats are: yang, yin, 
                        dsdl, depend, identifiers, jsonxsl, uml, tree, jstree, 
                        capability, sample-xml-skeleton, omni, jtox, name 
  -o OUTFILE, --output=OUTFILE 
                        Write the output to OUTFILE instead of stdout. 
  -F FEATURES, --features=FEATURES 
                        Features to support, default all. 
                        <modname>:[<feature>,]* 
  --max-status=MAXSTATUS 
                        Max status to support, one of: current, deprecated, 
                        obsolete 
  --deviation-module=DEVIATION 
                        Deviation module 
  -p PATH, --path=PATH  :-separated search path for yin and yang modules 
  --plugindir=PLUGINDIR 
                        Load pyang plugins from PLUGINDIR 
  --strict              Force strict YANG compliance. 
  --lax-quote-checks    Lax check of backslash in quoted strings. 
  --lax-xpath-checks    Lax check of XPath expressions. 
  --trim-yin            In YIN input modules, trim whitespace in textual 
                        arguments. 
  -L, --hello           Filename of a server's hello message is given instead 
                        of module filename(s). 

< . . . output omitted . . . >

student@student-vm:~$ pyang $HOME/RFC/ietf-interfaces.yang -f tree -p $HOME/RFC/
module: ietf-interfaces
  +--rw interfaces 
  |  +--rw interface* [name] 
  |     +--rw name                        string 
  |     +--rw description?                string 
  |     +--rw type                        identityref 
  |     +--rw enabled?                    boolean 
  |     +--rw link-up-down-trap-enable?   enumeration {if-mib}? 
  |     +--ro admin-status                enumeration {if-mib}? 
  |     +--ro oper-status                 enumeration 
  |     +--ro last-change?                yang:date-and-time 
  |     +--ro if-index                    int32 {if-mib}? 
  |     +--ro phys-address?               yang:phys-address 
  |     +--ro higher-layer-if*            interface-ref 
  |     +--ro lower-layer-if*             interface-ref 
  |     +--ro speed?                      yang:gauge64 
  |     +--ro statistics 
  |        +--ro discontinuity-time    yang:date-and-time 
  |        +--ro in-octets?            yang:counter64 
  |        +--ro in-unicast-pkts?      yang:counter64 
  |        +--ro in-broadcast-pkts?    yang:counter64 
  |        +--ro in-multicast-pkts?    yang:counter64 
  |        +--ro in-discards?          yang:counter32 
  |        +--ro in-errors?            yang:counter32 
  |        +--ro in-unknown-protos?    yang:counter32 
  |        +--ro out-octets?           yang:counter64 
  |        +--ro out-unicast-pkts?     yang:counter64 
  |        +--ro out-broadcast-pkts?   yang:counter64 
  |        +--ro out-multicast-pkts?   yang:counter64 
  |        +--ro out-discards?         yang:counter32 
  |        +--ro out-errors?           yang:counter32 
  x--ro interfaces-state 
     x--ro interface* [name] 
        x--ro name               string 
        x--ro type               identityref 
        x--ro admin-status       enumeration {if-mib}? 
        x--ro oper-status        enumeration 
        x--ro last-change?       yang:date-and-time 
        x--ro if-index           int32 {if-mib}? 
        x--ro phys-address?      yang:phys-address 
        x--ro higher-layer-if*   interface-state-ref 
        x--ro lower-layer-if*    interface-state-ref 
        x--ro speed?             yang:gauge64 
        x--ro statistics 
           x--ro discontinuity-time    yang:date-and-time 
           x--ro in-octets?            yang:counter64 
           x--ro in-unicast-pkts?      yang:counter64 
           x--ro in-broadcast-pkts?    yang:counter64 
           x--ro in-multicast-pkts?    yang:counter64 
           x--ro in-discards?          yang:counter32 
           x--ro in-errors?            yang:counter32 
           x--ro in-unknown-protos?    yang:counter32 
           x--ro out-octets?           yang:counter64 
           x--ro out-unicast-pkts?     yang:counter64 
           x--ro out-broadcast-pkts?   yang:counter64 
           x--ro out-multicast-pkts?   yang:counter64 
           x--ro out-discards?         yang:counter32 
           x--ro out-errors?           yang:counter32 

student@student-vm:~$ pyang $HOME/RFC/ietf-interfaces.yang -f sample-xml-skeleton -p RFC/ --tree-depth=5
<?xml version='1.0' encoding='UTF-8'?>
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"> 
    <interface> 
      <name/> 
      <description/> 
      <type/> 
      <link-up-down-trap-enable/> 
      <admin-status/> 
      <oper-status/> 
      <last-change/> 
      <if-index/> 
      <phys-address/> 
      <higher-layer-if> 
        <!-- # entries: 0.. --> 
      </higher-layer-if> 
      <lower-layer-if> 
        <!-- # entries: 0.. --> 
      </lower-layer-if> 
      <speed/> 
      <statistics> 
        <discontinuity-time/> 
        <in-octets/> 
        <in-unicast-pkts/> 
        <in-broadcast-pkts/> 
        <in-multicast-pkts/> 
        <in-discards/> 
        <in-errors/> 
        <in-unknown-protos/> 
        <out-octets/> 
        <out-unicast-pkts/> 
        <out-broadcast-pkts/> 
        <out-multicast-pkts/> 
        <out-discards/> 
        <out-errors/> 
      </statistics> 
    </interface> 
  </interfaces> 
  <interfaces-state xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces"> 
    <interface> 
      <name/> 
      <type/> 
      <admin-status/> 
      <oper-status/> 
      <last-change/> 
      <if-index/> 
      <phys-address/> 
      <higher-layer-if> 
        <!-- # entries: 0.. --> 
      </higher-layer-if> 
      <lower-layer-if> 
        <!-- # entries: 0.. --> 
      </lower-layer-if> 
      <speed/> 
      <statistics> 
        <discontinuity-time/> 
        <in-octets/> 
        <in-unicast-pkts/> 
        <in-broadcast-pkts/> 
        <in-multicast-pkts/> 
        <in-discards/> 
        <in-errors/> 
        <in-unknown-protos/> 
        <out-octets/> 
        <out-unicast-pkts/> 
        <out-broadcast-pkts/> 
        <out-multicast-pkts/> 
        <out-discards/> 
        <out-errors/> 
      </statistics> 
    </interface> 
  </interfaces-state> 
</data>

student@student-vm:~/$ export PYBINDPLUGIN=`/usr/bin/env python -c 'import pyangbind; import os; print ("%s/plugin" % os.path.dirname(pyangbind.__file__))' `

student@student-vm:~$ more ietf_interfaces.py 
# -*- coding: utf-8 -*-
from operator import attrgetter
from pyangbind.lib.yangtypes import RestrictedPrecisionDecimalType
from pyangbind.lib.yangtypes import RestrictedClassType
from pyangbind.lib.yangtypes import TypedListType
from pyangbind.lib.yangtypes import YANGBool
from pyangbind.lib.yangtypes import YANGListType
from pyangbind.lib.yangtypes import YANGDynClass
from pyangbind.lib.yangtypes import ReferenceType
from pyangbind.lib.base import PybindBase
from collections import OrderedDict
from decimal import Decimal
from bitarray import bitarray
import six

# PY3 support of some PY2 keywords (needs improved)
if six.PY3:
  import builtins as __builtin__ 
  long = int 
elif six.PY2:
  import __builtin__ 

<... output omitted ...>

>>> dir(ietf_interfaces)
['Decimal', 'OrderedDict', 'PybindBase', 'ReferenceType', 'RestrictedClassType', 'RestrictedPrecisionDecimalType', 'TypedListType', 'YANGBool', 'YANGDynClass', 'YANGListType', '__builtin__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'attrgetter', 'bitarray', 'ietf_interfaces', 'long', 'six', 'yc_interface_ietf_interfaces__interfaces_interface', 'yc_interface_ietf_interfaces__interfaces_state_interface', 'yc_interfaces_ietf_interfaces__interfaces', 'yc_interfaces_state_ietf_interfaces__interfaces_state', 'yc_statistics_ietf_interfaces__interfaces_interface_statistics', 'yc_statistics_ietf_interfaces__interfaces_state_interface_statistics']

spaces.
>>> print(json.dumps(interfaces.get(), indent=4))
{
    "interfaces": { 
        "interface": { 
            "GigabitEthernet1": { 
                "name": "GigabitEthernet1",
                "description": "MGMT Interface",
                "type": "", 
                "enabled": 1,
                "link-up-down-trap-enable": "", 
                "admin-status": "", 
                "oper-status": "", 
                "last-change": "", 
                "if-index": 0, 
                "phys-address": "", 
                "higher-layer-if": [], 
                "lower-layer-if": [], 
                "speed": 0, 
                "statistics": { 
                    "discontinuity-time": "", 
                    "in-octets": 0, 
                    "in-unicast-pkts": 0, 
                    "in-broadcast-pkts": 0, 
                    "in-multicast-pkts": 0, 
                    "in-discards": 0, 
                    "in-errors": 0, 
                    "in-unknown-protos": 0, 
                    "out-octets": 0, 
                    "out-unicast-pkts": 0, 
                    "out-broadcast-pkts": 0, 
                    "out-multicast-pkts": 0, 
                    "out-discards": 0, 
                    "out-errors": 0 
                } 
            }, 
            "GigabitEthernet2": { 
                "name": "GigabitEthernet2",
                "description": "ISP Interface",
                "type": "", 
                "enabled": 1,
                "link-up-down-trap-enable": "", 
                "admin-status": "", 
                "oper-status": "", 
                "last-change": "", 
                "if-index": 0, 
                "phys-address": "", 
                "higher-layer-if": [], 
                "lower-layer-if": [], 
                "speed": 0, 
                "statistics": { 
                    "discontinuity-time": "", 
                    "in-octets": 0, 
                    "in-unicast-pkts": 0, 
                    "in-broadcast-pkts": 0, 
                    "in-multicast-pkts": 0, 
                    "in-discards": 0, 
                    "in-errors": 0, 
                    "in-unknown-protos": 0, 
                    "out-octets": 0, 
                    "out-unicast-pkts": 0, 
                    "out-broadcast-pkts": 0, 
                    "out-multicast-pkts": 0, 
                    "out-discards": 0, 
                    "out-errors": 0 
                } 
            }, 
            "GigabitEthernet3": { 
                "name": "GigabitEthernet3",
                "description": "Parked Interface",
                "type": "", 
                "enabled": 0,
                "link-up-down-trap-enable": "", 
                "admin-status": "", 
                "oper-status": "", 
                "last-change": "", 
                "if-index": 0, 
                "phys-address": "", 
                "higher-layer-if": [], 
                "lower-layer-if": [], 
                "speed": 0, 
                "statistics": { 
                    "discontinuity-time": "", 
                    "in-octets": 0, 
                    "in-unicast-pkts": 0, 
                    "in-broadcast-pkts": 0, 
                    "in-multicast-pkts": 0, 
                    "in-discards": 0, 
                    "in-errors": 0, 
                    "in-unknown-protos": 0, 
                    "out-octets": 0, 
                    "out-unicast-pkts": 0, 
                    "out-broadcast-pkts": 0, 
                    "out-multicast-pkts": 0, 
                    "out-discards": 0, 
                    "out-errors": 0 
                } 
            } 
        } 
    }, 
    "interfaces-state": { 
        "interface": {} 
    } 
}

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/pt1043/article/details/164004250

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--