下面的这段代码是什么意思啊?

 
 
所以del x[1:4]表示从下标为1的元素开始删除到下标为4-1的元素为止吗?

最近让我写一篇NETCONF在网络运维中实际应用的读者越来越多,趁着最近回沙特后能把KAUST堆满仓库的3850, 9200, 9300等IOS-XE真机设备拿出来做实验,趁这个机会我就写写NETCONF,YANG和ncclient,分为上、下两篇,上篇讲NETCONF和YANG,下篇讲ncclient,包含理论和实战。以后有时间也会讲讲REST和RESTCONF。


2002年6月,互联网架构委员会(Internet Architeture Board,简称IAB)举办了一个主题为Network Management的workshop,邀请了一大帮研发界业内名气响当当的巨佬(大多来自IETF)共同商议讨论彼时普遍使用的网络管理协议,找出它们各自的优势和缺点,并列出一个优秀的网络管理协议必须具备的特征,准备为开发下一代网络管理协议(NextGen

在这个背景下,IETF于2006年12月率先发布了RFC 4741, 也就是NETCONF这个基于XML,用来替代CLI、SNMP的网络配置和管理协议。在随后几年加加改改进行一番修订后,IETF又于2011年6月以RFC 6241作为终稿将其再次发布。

虽然NETCONF年龄不算小,但是倒退10年前你要是问一个网络工程师什么是NETCONF(更别提YANG了),大概率你会看到对方一脸懵逼的把你看着,因为当时主流的思科IOS设备根本就不支持NETCONF,当时的思科对NETCONF并不感冒,而是自己闭门造车分别在2007年和2012年搞出了WSMA(Web Service Management Agent)和onePK这两个API。那些年跟随思科的步伐一路从CCNA,CCNP,CCIE摸爬滚打起来的网工压根就没听说过还有这么一个书上不会教,考试不会考,工作中也基本用不到的非常小众的技术。十年河东十年河西,这些年随着SDN和网络运维自动化技术的强势崛起,NETCONF终于在诞生10多年后在传统计算机网络这个行业里有了一定的曝光率,跟着RESTCONF和gRPC这俩哥们一起站在时代的风口上飞了起来。

关于NETCONF的理论部分网上有很多资料,最权威的肯定还是RFC 6241,这里做一下总结:

/YangModels/yang)上存放着大部分标准(standard)和私有(vendor)的YANG模型,截止2020年9月,标准模型中包含IETF,IEEE,ETSI等国际知名组织和协会制定的YANG模块,私有模型中包含思科,Juniper,华为,诺基亚,富士通在内的厂商自己制定的YANG模块。

我们可以通过git clone来下载上述所有标准和私有的YANG模型及其对应的模块:

下载完毕后,当前目录下多出来了一个名叫yang的子目录,其中yang/standard/ietf/RFC下包含了全部由IETF制定的YANG模块,其中也包含我们上面举例的ietf-interfaces模块(不在截图里)。

你也许会问,怎么和上面我们举例的ietf-interfaces模块内容不一样?这是因为上面的例子中我们是以树形格式(Tree View Format)展开ietf-interfaces模块,而这里用cat查看的是该模块的源代码。我们可以用pyang这个Python模块来以树形格式的形式查看一个YANG模块的具体结构。

Pyang是Python专为YANG开发的一个开源模块,主要有三个功能:1. 用来验证YANG模块代码的准确性,2. 将YANG模块转换成其他格式(比如我们前面讲到的树形格式), 3. 从YANG模块中生成代码。这里我们主要讲下如何使用Pyang来将刚才的ietf-interfaces.yang这个模块转化为树形格式。

首先通过pip下载安装pyang:


讲完理论后来做实验。实验环境很简单,就是一台CENTOS 7主机和一台思科3850的交换机直连。

  • Netconf的传输协议基于SSH,在交换机上必须开启SSH, 并且用户特权级别必须为15。
  1. 首先在交换机上开启NETCONF,方法很简单,在全局模式下输入netconf-yang和netconfg ssh(可选,前面理论部分已经讲了,NETCONF默认使用的是SSH作为安全传输层协议,所以netconf ssh这条命令默认就是开启的,不需要特意配置)即可。其余的交换机初始配置,比如开启SSH和创建特权级别为15的用户请读者自行完成,这里就不讲了。

2. 回到主机,通过SSH访问交换机的830端口:

3. 连接成功后,交换机会回复一个hello包,以及一长串capabilities,也就是该交换机支持的yang model:既有思科的,也有IETF的,由于回显内容过多,下图只截取部分以作演示:

4. 随后我们复制粘贴下列XML代码向交换机回复一个hello包(交换机不会做出任何回应),之后主机和交换机之间的netconf session即建立成功。

  • :表示一条XML指令的开始。
  • xml:表示此文件是XML文件。
  • encoding:字符集编码格式,当前仅支持UTF-8编码。
  • ?>:表示一条XML指令的结束。
    Namespace(XML命名空间)的缩写,在XML里面,元素名称(你可以把它理解为Python中的变量名)是由开发者自己定义的,当将两个不同的文档合并成一个文档,如果两个文档里面使用相同的元素名时,就会发生命名冲突。比如说你和我分别开发了一个XML文档,我用name作为元素名称来描述一个人名,而你也用name作为元素名称来描述一个地名,虽然我俩描述的东西不一样,但是你我定义的元素名称(name)是一样的,当我俩的文档被合并成一个文档时,就会造成冲突,而XML命名空间的作用就是避免XML内元素的冲突。
  • 代表能力集,代表具体的能力,是NETCONF客户端和服务器互相向对方说明自己具备什么能力的作用,这里的urn:ietf:params:netconf:base:1.0表示客户端告诉服务器:我具备使用IETF制定的NETCONF协议的能力。
  • 和Python不一样,XML并没有严格要求缩进,但是为了美观和可读性,一般我们用两个空格或者四个空格做缩进。
  • 注意代码最尾部的]]>]]>,它是NETCONF客户端和NETCONF服务器用来表示消息请求或回复终止的部分(用来告知对方“我话说完了,轮到你了”),并不是XML语言本身的一部分,后面会说明为什么它很重要。

5. 发送下列XML代码向交换机查询Gi1/0/33端口的配置:

随即交换机会回复一个rpc-reply包(下图红框中的部分),后面的内容即我们请求的Gi1/0/33端口的配置信息,包括该端口下的description和IP地址(为空)。

注意复制RPC-REPLY内容时不要把末尾的]]>]]>给一并复制了(前面讲了它们不是XML语言的一部分),不然Code Beautify会报错:

7. 接下来我们用下面这段XML代码来查询交换机的running configuration。请自行尝试这里就不放截图了:

这里我故意没做缩进,就是为了告诉你XML没有严格要求代码缩进。

这里我们使用到了这个前文NETCONF理论部分讲到的基本操作,通常下面会接一个,表示需要修改配置的目标,表示数据集,这里我们要更改的是startup这个数据集(也可以使用running/),后面的表示这里我们使用了前面讲到了的思科私有(Native)YANG模型。

回到交换机上验证Gi1/0/33的配置:

之后回到交换机上验证Gi1/0/33的配置:

关于NETCONF和YANG的理论和实战就讲到这里,可以看到NETCONF这种通过复制粘贴XML代码的操作方式对传统工程师来说很不适应,虽然不太好用,但NETCONF确实是SDN时代网工们必须掌握的技能之一。下篇我将继续讲解ncclient这个Python专为NETCONF客户端开发的第三方模块,看看NETCONF结合Python会不会省事一些。

我要回帖

更多关于 swift代码是什么 的文章

 

随机推荐