NetDevOps入门与实践
上QQ阅读APP看书,第一时间看更新

为什么要写这本书

清晨,我们做的第一件事是什么?睁开眼。睁开眼看手机里的朋友圈是否有更新,昨晚下的单是否已经安排送货,今天的天气是否依旧晴朗。而这些信息的更新都是通过互联网传递到你的手机上。在很多人眼里,手机有电而没有网络是一件非常痛苦的事情。互联网在中国的发展也就是20来年的事,但它已经渗透到了我们工作、学习和生活的方方面面。网络是新时代的基础设施,无论上面有多么丰富多彩的应用软件,它们都离不开网络。这些年,应用软件的迭代速度非常快。而网络在这几十年中却没有发生多大的变化(虽然网络带宽一直在指数级增长)。特别是网络工程师们日常的工作似乎还是和10年前甚至20年前一样。虽然,这几年SDN(Software Defined Networks)在快速发展,但是物理网络仍然没有发生多大的变化。大量的网络工程师还是通过Telnet或SSH登录到网络设备上,然后一条一条地敲击各种各样的命令。应用软件越来越多,应用软件生命周期越来越短。这对网络提出了很多的挑战,网络工程师的工作压力也是直线上升。这几年随着上层应用DevOps思想的发展,网络自动化的需求也在不断提升。那些安分守己的传统网络工程师面临着转型的痛苦。

我是一个和网络打交道20来年的传统网络工程师,但我一直是一个不安分守己且会偷懒的人。早在我大学期间,为了和同寝室的同学一起玩一款叫“红色警戒”的游戏而接触了网络。从两台电脑之间使用串口互联进行对战,到使用同轴电缆后8个同学可以在一个地图中互相厮杀,再到1999年通过双绞线接入互联网。那个时候,几个寝室的双绞线都汇聚到了我们寝室,我不知不觉也成了96级化学系的网络管理员。日常的“工作”就是帮同学看看网络怎么不通了;谁的IP地址又和谁冲突了;如何从其他同学的电脑里复制一些电脑游戏等。活脱脱就是一个小型网吧的工作人员。随着1999年学校寝室接入了互联网,出于对“工作”的热情,我开始用Linux自己搭建一些服务,比如DHCP、DNS、FTP、BBS等。慢慢又干起了系统管理员的“工作”。

在千禧年(2000年)的毕业季,我的第一份工作是在一家大型的纺织公司做系统管理员和DBA。这份工作和化学没有任何的关系。而日常的工作就是帮助新员工开账号,每天备份那些数据库的数据到磁带中。为了减少自己日常的工作就开始写一些自动化的脚本。其实,当时就是为了每天能偷点懒。开一个账号,懒得去点那么多次的鼠标。每天的备份任务,懒得去一个个地核对和比较,而是让脚本自己去核对,自己去比较,然后把检查后的结果发送E-mail给我。

2003年考完CCIE后到一家为中国电信服务的系统集成公司。在这家公司有幸参与了中国电信CN2(ChinaNet2)的建设工作。在网络建设的初期有大量的设备配置需要增加和修改。纯手工的操作让我觉得痛苦不堪,此时又萌生了“偷懒”的思想。我开始用Python、Perl等语言写了一些脚本用于设备配置的生成和修改。当时设备并没有丰富的API接口,大部分都是用Telnet模拟登录来操作设备。

2007年我进入了Juniper工作,在这里接触了更多的网络自动化的内容,也写了很多自动化脚本来操作网络设备。比如,2008年考完JNCIE后,有幸做了一年多的中国区JNCIE考官。JNCIE的考官除了要发卷子外,还需要负责给考生判卷。也是为了“偷点懒”写了一些自己用的脚本提高判卷的效率。2009年开始学习JUNOScript(一种可以运行在JUNOS上的脚本语言),用JUNOScript来实现一些特殊的功能或者对命令进行重新格式化的输出。2010年后由于需要经常参加设备的测试,开始使用Python等语言对JUNOS设备基于NETCONF协议进行操作。

2014年到2016年,我先后在两家互联网公司做网络工程师,负责网络的规划与运维工作。由于互联网公司自身的产品迭代速度很快,对网络的适配性也提出了更多的需求。虽然在互联网公司有很多的程序员,但大部分的程序员对网络和网络设备的理解远逊于网络工程师。这就导致了网络自动化的开发工作比较难推进。因此,我结合自己的编程能力和对网络的理解开始用代码去实现网络自动化的任务。

从2016年到现在,我一直在Cisco工作。在这里我接触到了DevNet(https://developer.cisco.com)。在DevNet的网站上我看到和学习了很多关于基础网络设备的编程知识。在2016年,Cisco发布了思科全数字化网络架构(思科DNA),这个平台不仅提供了实现全数字化的路线图,而且为网络工程师提供了网络自动化和网络安全的途径。这个平台的很多理念和架构为我写这本书提供了很多的帮助。

在这20来年的时间里,我积累了一些使用程序来操作网络设备的经验。一方面是想把这些经验分享给大家;另一方面也是想帮助那些想转型的传统网络工程师。这就是我写这本书的初衷。另外,我还想告诉广大的网络工程师们开发一个小工具用来管理设备其实并没有那么难。对于我这样一个非软件专业的人而言并没有觉得吃力,反而在开发中获得了更多的自信,也偷了“懒”。

最后,希望这本书能给广大的网络工程师在转型过程中带来一些帮助,也希望大家能少走弯路。

本书特色

首先,本书是专门针对网络工程师而写的。书中关于Bash和Python的基本语法部分使用了网络工程师更加熟悉的内容,并且提供了一些网络设备上的运行情况。

其次,本书的重点是如何编写和网络设备相关的代码。因此,在书中提供了很多关于如何处理网络设备输出的文本的例子,以及处理网络相关的数据。

最后,本书并不是一本纯粹讲解编程的书,而是一本从理论到实践的综合书籍。

读者对象

❑ 网络架构师

❑ 网络运维工程师

❑ 网络运维开发人员

❑ 网络与系统管理人员

❑ 网络规划与设计人员

❑ 网络专业在校学生

如何阅读本书

本书分为五篇,共计14章内容。

第一篇为概念篇,这一篇主要讲述什么是NetDevOps,以及如何开始NetDevOps实践之路,包括如下2章内容。

第1章 从SDN开始谈起,讲解在SDN的大背景下,传统的网络都发生了什么变化,而这些变化给传统网络工程师带来了哪些影响。最后介绍了什么是NetDevOps, NetDevOps需要我们学习什么样的技能才能胜任。

第2章 在业务快速迭代的推动下,传统IP网络的自动化需求在不断增强。大量的网络工程师面临着新的挑战。这章介绍如何从零开始逐步过渡到NetDevOps。这章将重点讲解4个话题:首先,在NetDevOps开始之前需要做什么;其次,在进行NetDevOps开发时,如何选择开发语言;再次,一些常见的NetDevOps开源工具或平台如何选择;最后,在进行NetDevOps时,对网络设备有哪些要求。

第二篇为基础篇,这一篇主要介绍了如何构建NetDevOps的工作环境以及在这些环境中的常用工具,包括如下4章内容。

第3章 介绍在Linux环境下,如何使用Linux下的工具登录网络设备,以及使用SSH工具建立一些SSH的隧道。

第4章 介绍在Linux环境下,如何使用一些工具获取网络设备的信息,以及获取网络的可达信息,涵盖SNMP、traceroute、ping等工具。

第5章 使用Linux中三大文本处理利器(grep、awk和sed)来处理网络设备输出的文本内容。这些文本内容包括命令行的输出、设备的配置以及设备的日志信息等。这些工具可以帮助网络工程师快速地获取相关的数据和信息。

第6章 在NetDevOps的实践过程中,我们需要搭建一些基础的服务。这些服务包括TFTP、DNS和DHCP等。在微模块流行的时代,网络工程师使用Docker可以快速地构建起这些基础服务。

第三篇为提高篇,这一篇将开始介绍编程相关的内容。这一篇都是编程的一些基础知识,包括如下3章内容。

第7章 这一章主要介绍Linux环境或网络设备上的Bash编程基础知识。通过Bash基本语法并结合一些工具,我们可以和设备进行简单的交互或处理一些数据。

第8章 这一章主要介绍Python的编程知识。本书的大部分编程内容都是基于Python语言的。因此,这一章是后续章节的基础。这一章关于Python的基本语法是专门为网络工程师重新编写的。使用的例子将是网络工程师比较熟悉的内容。

第9章 我们在和网络设备进行交互或者进行网络相关的编程时,经常需要处理一些常用的数据类型,这些数据类型包括JSON、XML、YAML和YANG。熟练掌握这些数据类型的处理是编程的基础。在这章,我们将介绍上述这四种数据类型的常用处理方法。

第四篇为实践篇,这一篇将通过一些实际的例子来介绍,包括如下3章内容。

第10章 NetDevOps必然需要和网络设备进行交互,从而获得我们需要的数据。本章将介绍三种常见的连接网络设备的方法,它们分别是:命令行登录、NETCONF以及REST。

第11章 连接到网络设备后就可以获取很多的信息,其中通过命令行获取的数据大部分是半结构化的数据。这些半结构化的数据需要进行结构化处理。这一章将通过几个Python的模块来处理这些数据。

第12章 我们在处理网络相关数据时,有两种常见且特殊的数据需要处理,它们分别是网络地址和网络拓扑数据。同样,我们将通过几个Python的模块来处理这些数据。

第五部分为案例篇,这一篇将介绍3个常见的案例来帮助大家更好地了解和掌握NetDevOps的相关内容,包括如下两章内容。

第13章 众所周知,绝大多数的网络设备都会有配置文件,获取和管理这些配置文件是NetDevOps工作的基础。通过程序化的方式自动地获取这些配置就打通了程序和网络设备之间的通道,这是后续获取更多信息的基础。另外,网络设备的配置文件也是最需要且被优先管理的内容,这些内容的版本管理也是非常重要的。本章将通过网络设备的配置管理案例来描述如何多厂家、并发地与网络设备进行数据交互。

第14章 网络运维与管理的独特之处是,该工作是基于网络拓扑的。获取和处理网络拓扑是基本功能。该章通过两个小的案例来介绍,它们分别是:基于ISIS协议来获取网络拓扑并进行简单的网络拓扑分析;使用BGP协议进行简单的网络流量调度。

其中,本书的第2章、第8章、第9章、第10章、第11章是重点。如果你有一定的Python编程基础,那么可以参考第9章及之后的章节,这些章节提供了Python用于网络管理与维护常用的一些模块,这些模块可以提高你的工作效率。如果你是一位传统的网络工程师且对编程和Linux环境不是十分了解,请从本书的开头读起。笔者希望通过本书的内容能循序渐进地带领大家走上NetDevOps之路。

勘误和支持

由于笔者的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者朋友有更多的宝贵意见,欢迎你发送邮件到netdevops@hotmail.com联系我。本书的大部分代码示例都放在GitHub上,其地址为https://github.com/netdevops-engineer/newbie_book。期待能够得到大家的真挚反馈,在技术之路上互勉共进。

特别致谢

这里要特别感谢毛厚君先生,他是这本书的第一位读者,不但给了我很多的宝贵建议,而且帮我润色了全书的文字。如果没有他的帮助我想是很难完成这本书的。

致谢

在本书的写作过程中得到了很多同事和朋友的支持与帮助。没有你们的支持与帮助,本书将难以如期完成。

在本书的写作过程中需要实验环境,感谢徐晓东先生为我提供了便利。

感谢思科同事们的支持和鼓励,他们是方芳女士、徐志骏先生、杨骏先生、刘佳女士等。

感谢身在美国的朋友杨文嘉先生提供了关于Arista产品和技术的相关信息。

最后,我要特别感谢我的家人,我为写作这本书,牺牲了很多陪伴他们的时间,但也正因为有了他们的付出与支持,我才能坚持写下去。

谨以此书献给我最亲爱的人,以及众多的网络工程师朋友们!

余欣