SRv6实践项目(四):基于YANG的配置下发

news2025/1/16 2:06:48

 在本章节,主要是了解YANG是什么,以及基于YANG下发配置的工作原理:

1.什么是YANG

在介绍之前,为了给大家一个最直观的感受,我们打开yang工具,它被打包成一个容器了,可以轻松的使用,可以看到,docker run了一个yang工具容器:

make yang-tools

 当我们打开一个范例demo-port.yang和它的yml格式文件,我们可以看见它的一个格式:

pyang -f tree demo-port.yang
  • 里面的对象有的可读可写,有的只读
  • 加了一个*的表示这个对象是个序列
  • 在yang的树叶上可以看到,每一个叶子成员(leaf)都是最基本的单元,他们有被定义一些值,比如number或者boolean这些
  • 文件中,我们可以看到一个模型,就是一颗以树组织的结构,里面描述了每个节点是什么(description),每个节点的属性是什么以及这个属性基于什么属性(description,base)
  • 也包括了一些节点的其他信息(namespace,description)
  • 对于序列节点(list)它的每个成员的属性是什么(key),通过基本的属性(type)以及对属性的定义(typedef )可以得到任何属性,一些节点可能还有一些可重用的属性(grouping),定义时只需要使用(uses)即可
  • 在yang中,一个模型可以被理解为多个成员(container)的集成,每个成员包括了自身的一些属性等等

module demo-port {

    // YANG Boilerplate 
    yang-version "1";
    namespace "https://opennetworking.org/yang/demo";
    prefix "demo-port";
    description "Demo model for managing ports";
    revision "2019-09-10" {
      description "Initial version";
      reference "1.0.0";
    }

    // Identities and Typedefs
    identity SPEED {
      description "base type for port speeds";
    }

    identity SPEED_10GB {
      base SPEED;
      description "10 Gbps port speed";
    }

    typedef port-number {
      type uint16 {
        range 1..32;
      }
      description "New type for port number that ensure the number is between 1 and 32, inclusive";
    }


    // Reusable groupings for port config and state 
    grouping port-config {
        description "Set of configurable attributes / leaves";
        leaf speed {
            type identityref {
                base demo-port:SPEED;
            }
            description "Configurable speed of a switch port";
        }
    }

    grouping port-state {
        description "Set of read-only state";
        leaf status {
            type boolean;
            description "Number";
        }
    }

    // Top-level model definition
    container ports {
      description "The root container for port configuration and state";
        list port {
            key "port-number";
            description "List of ports on a switch";

            leaf port-number {
                type port-number;
                description "Port number (maps to the front panel port of a switch); also the key for the port list";
            }

            // each individual will have the elements defined in the grouping
            container config {
                description "Configuration data for a port";
                uses port-config; // reference to grouping above
            }
            container state {
                config false; // makes child nodes read-only
                description "Read-only state for a port";
                uses port-state; // reference to grouping above
            }
        }
    }
}

 让我来做个总结,YANG模型以一种树形结构描述了一个类的全面的性质,但是你一定很好奇,它只是描述了一个东西它应该有哪些属性,定义了这个属性是什么类型,比如,我们用一个YANG去描述一个网络设备,要对这个设备进行操作需要知晓设备的各个属性全貌,以及哪些是只读的(state),哪些是可以改的(config),但是,要对这个设备进行具体的操作,我们需要有值啊,所以,我们要对YANG定义出来的模型,为数据附上这些值。

bash-4.4# pyang -f tree \
    -p ietf \
    -p openconfig \
    -p hercules \
    openconfig/interfaces/openconfig-interfaces.yang \
    openconfig/interfaces/openconfig-if-ethernet.yang  \
    openconfig/platform/* \
    openconfig/qos/* \
    openconfig/system/openconfig-system.yang \
    hercules/openconfig-hercules-*.yang  | less

小插曲:在这里,我们可以看看openconfig-interfaces.yang的长相,openconfig-interfaces.yang是网络中对接口配置的一个模型描述,很长很长,可以看到里面有一些参数,比如in_pkts进数据包和enable使能。

 2.基于YANG的数据编码

刚刚我们知道,以面向对象的角度比喻:YANG它只是定义了一个类的格式,没有给他赋值,为了给这个类具体的值,我们需要实例化它,它被实例化出来的对象,它可以以XML的形式存在,也可以以JSON的形式存在,这无所谓,只要它的数据遵循类的规范即可。

pyang -f sample-xml-skeleton demo-port.yang

把YANG转换成xml的格式会是这样的(但是还是没有赋值):

 转成DSDL格式会是这样的: 

pyang -f dsdl demo-port.yang | xmllint --format -

接下来,我们将研究使用协议缓冲区(protobuf)对数据进行编码,protobuf编码是一种比XML更紧凑的二进制编码,并且可以为几十种语言自动生成库。我们可以使用ygot的proto_generator从我们的YANG模型中生成protobuf消息

proto_generator -output_dir=/proto -package_name=tutorial demo-port.yang

生成了两文件,一个用来紧凑的描述demo_port,一个用来描述属性

  • /proto/tutorial/demo_port/demo_port.proto
  • /proto/tutorial/enums/enums.proto
less /proto/tutorial/demo_port/demo_port.proto

less /proto/tutorial/enums/enums.proto

3.基于YANG的gNMI下发配置

在第二节中,我们知道了基于YANG的数据编码格式,在本小节中,我们讨论如何通过基于YANG的配置,操作数据平面。

首先make start打开我们的mininet,然后我们需要让两个主机ping通,不知道如何ping通的,可以回到上一个博客查看。

现在,我们来到gNMI client CLI,通过它实现对数据平面的配置,首先看看它的数据以及组织形式,这里的get只是总览一下数据平面中leaf1的信息。

util/gnmi-cli --grpc-addr localhost:50001 get /

 上面的命令没有对数据编码进行修正,通过以下指令进行解码

util/gnmi-cli --grpc-addr localhost:50001 get / | util/oc-pb-decoder | less

 在这里,我们看到了request中,我们要看的数据的类型是可config的,用的解码是PROTO

 

 现在来看看leaf1的eth3的接口的信息

util/gnmi-cli --grpc-addr localhost:50001 get \
    /interfaces/interface[name=leaf1-eth3]/config

 请求部分,可以看到客户端是如何请求的,请求的数据组织格式:

有3个信息,使能:true,健康监测:GOOD,loopback模式:false(它不是一个环回接口,它是一个实体接口,要转发到别的主机上的)

 

 接下来,我们订阅一些数据,我们用到如下指令:

util/gnmi-cli --grpc-addr localhost:50001 \
    --interval 1000 sub-sample \
    /interfaces/interface[name=leaf1-eth3]/state/counters/in-unicast-pkts
  •  util/gnmi-cli:gNMI的命令行
  • --grpc-addr localhost:50001 grpc的服务器也就是在leaf1的BMV2
  • --interval 1000 sub-sample 1000毫秒一次收集信息
  • /interfaces/interface[name=leaf1-eth3]/state/counters/in-unicast-pkts 记录接口leaf1-eth3它的状态栏中关于计数器的部分,这个计数器专门指的是in-unicast-pkts,顾名思义,进来leaf1-eth3的单播数据包

现在,每秒都在更新一次数据,因为我们订阅了它:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

完美解决丨1. **`SyntaxError: invalid syntax`**

SyntaxError: invalid syntax 因为没有符合语法要求,导致报错。 解决办法: 语法错误的原因主要是代码的风格,例如: 左括号或者右括号没有配对;左括号或者右括号没有放在语句的正确位置;缺少冒号&#xff1…

Window10下安装DPDK

由于我装的是vs2019,打开Visual Studio Installer,在可选下,选择Windows 10 SDK,点击修改。 右键此电脑属性,查看Windows10版本。 安装WDK,打开网址https://learn.microsoft.com/zh-cn/windows-hardware/…

计算机系统-链接

例行前言: 本篇不是学习课程时的笔记,是重看这本书时的简记。对于学习本课程的同学,未涉及的内容不代表考试不涉及,部分省略的部分是在该课程的讨论课中学习的(PIC,放出了我在讨论课中的PPT作为参考),核心…

Sentinel使用

文章目录 一. 初识Sentinel1. 雪崩问题及解决方案2. 服务保护技术对比3. Sentinel介绍和安装4. 微服务整合Sentinel 二. 限流规则1. 快速入门2. 流控模式3. 流控效果4. 热点参数限流 三. 隔离与降级—调用方保护方案1. FeignClinet整合sentinel2. 线程隔离(舱壁模式…

vue3中的单文件组件<script setup>和setup函数区别 详解

文章目录 简介基本语法变量和方法多的使用注册组件动态组件使用外部文件方法组件通信props与defineProps、emitdefineEmitsdefineExpose 获取 attrs、slots 和useAttrs、useSlots 方法与普通的 < script > 一起使用v-bind() CSS变量注入style的新特性之global对await异步…

行业认可,知道创宇入选安全牛第十版全景图30个细分领域

近日&#xff0c;国内网络安全领域专业媒体安全牛正式发布了第十版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;&#xff0c;知道创宇凭借过硬的技术实力及成熟的市场应用获得行业认可&#xff0c;入围10项一级安全分类共计30项二级细分领域&#xf…

ASEMI代理ADI亚德诺AD8130ARZ-REEL7车规级芯片

编辑-Z AD8130ARZ-REEL7芯片参数&#xff1a; 型号&#xff1a;AD8130ARZ-REEL7 −3dB带宽&#xff1a;250MHz 0.1 dB平坦度的带宽&#xff1a;25MHz 斜率&#xff1a;930V/μs 建立时间&#xff1a;20ns 上升和下降时间&#xff1a;1.5ns 输出超速恢复&#xff1a;30n…

访学案例分享|经济学老师获英国两高校邀请函

D老师所在国内高校鼓励教职员工通过各种渠道公派或者自筹经费出国访学进修。在考虑了学校要求及个人条件后&#xff0c;其决定用自费方式赴英国访学。我们分别获得了英国利兹贝克特大学和邓迪大学的邀请函&#xff0c;最终D老师顺利过签&#xff0c;如期出国。 D老师背景&#…

网络编程【UDP数据报套接字编程】

目录 1.网络编程基础 1.1 为什么需要网络编程&#xff1f; 1.2 什么是网络编程 1.3 网络编程中的基本概念 2.Socket套接字 2.1 分类 3.UDP数据报套接字编程 3.1 DatagramSocket API 3.2 DatagramPacket API 3.3 基于 UDP socket 写一个简单的回显客户端服务器程序&am…

设计模式 -- 桥梁模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

自适应安全、主权云、超级自动化顶级政府技术趋势

根据分析公司 Gartner 的数据&#xff0c;自适应安全、主权云和超级自动化是 2023 年十大政府技术趋势之一。 确定了 2023 年的 10 大政府技术趋势&#xff0c;这些趋势可以指导公共部门领导者在为后数字化政府做准备和不懈地关注任务目标时加速转型。 当前的全球动荡和技术中…

9-2分布迭代次数的15个梯度

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点&#xff0c;AB训练各由11张二值化的图片组成&#xff0c;让A中有3个0&#xff0c;B中全是0&#xff0c;排列组合A的所有可能&#xff0c;统计迭代次数的顺序。 A-B 迭代次数 标准差 势能 标准差势能 11 …

30天学会《Streamlit》(6)

30学会《Streamlit》是一项编码挑战&#xff0c;旨在帮助您开始构建Streamlit应用程序。特别是&#xff0c;您将能够&#xff1a; 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第6天 - 使…

【案例教程】基于RWEQ模型的土壤风蚀模数估算及其变化归因分析实践技术

土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2&#xff0c;占国土总面积的16.7%&#xff0c;严重影响这些地区的资源开发和社会经…

什么是5G?关于5G你需要知道的知识

问&#xff1a;什么是5G&#xff1f; Answer&#xff1a; 5G是第五代移动网络。它是继1G、2G、3G、4G网络之后的新的全球无线标准。5G 支持一种新型网络&#xff0c;旨在将几乎所有人和所有事物连接在一起&#xff0c;包括机器、物体和设备。 5G 无线技术旨在为更多用户…

【MAVEN_Configuration】maven下载配置IDEA配置以及阿里云镜像配置

&#xff03;    下载 MAVNEDownLoad &#xff03; 配置 解压 指定文件夹 系统变量配置 在这里插入图片描述 check cmd 配置settings 本地仓库 阿里云镜像配置 mvn全局jdk <!-- java版本 --> <profile> <id>jdk-1.8</id> <activat…

JavaSE/内部类

前言 在学习Java的过程当中&#xff0c;不难发现Java全是由类与对象构成的&#xff0c;所以在一个类当中定义和使用一个另外一个类是我们学习过程中必须要学会使用的&#xff0c;而这种类&#xff0c;被称之为内部类。 一、实例内部类 class A{void a(){}class B{void a(){}} …

计算机图形学(5):OpenGL光照

参考 介绍 现实世界中的光照是极其复杂&#xff0c;难以计算的&#xff0c;因此OpenGL的光照使用的是简化的模型&#xff0c;其中一个模型被称为冯氏光照模型(Phong Lighting Model)。 冯氏光照模型的主要结构由三个分量组成&#xff1a; 环境(Ambient)光照 漫反射(Diffuse)…

【Docker学习三部曲】—— 入门篇

Docker 入门 Docker 概述 1️⃣ 什么是 docker &#xff1f; Docker 是一种运行应用程序的平台&#xff0c;它可以使应用程序在容器中不受环境差异的影响进行部署和运行。Docker 的流行度越来越高&#xff0c;是因为它可以帮助在不同的开发者和开发团队之间实现代码的共享和…

Linux centos搭建web服务器

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…