第28章_网络编程与自动化

  • 网络工程领域不断出现新的协议、技术、交付和运维模式。传统网络面临着云计算、人工智能等新连接需求的挑战。企业也在不断追求业务的敏捷、灵活和弹性。在这些背景下,网络自动化变得越来越重要。
  • 网络编程与自动化旨在简化工程师网络配置、管理、监控和操作等相关工作,提高工程师部署和运维效率。本课程定位于指导网络工程师初步了解Python编程实现网络自动化。

1.网络编程与自动化介绍

1.1背景:传统网络运维困境

  • 传统的网络运维工作需要网络工程师手动登录网络设备,人工查看和执行配置命令,肉眼筛选配置结果。这种严重依赖“人”的工作方式操作流程长,效率低下,而且操作过程不易审计。

image-20231209114714860

1.2网络自动化

  • 网络自动化,通过工具实现网络自动化地部署、运行和运维,逐步减少对“人”的依赖。这能够很好地解决传统网络运维的问题。
  • 业界有很多实现网络自动化的开源工具,例如Ansible、SaltStack、Puppet、Chef等。从网络工程能力构建的角度考虑,更推荐工程师具备代码编程能力。

image-20231209114816214

1.3基于编程实现的网络自动化

  • 近几年随着网络自动化技术的兴起,以Python为主的编程能力成为了网络工程师的新技能要求。
  • ython编写的自动化脚本能够很好的执行重复、耗时、有规则的操作。

image-20231209114841213

  • 业界也有很多基于开源工具的网络自动化,例如Ansible、SaltStack、Puppet、Chef等。网络工程师能力构建上更推荐具备代码编程能力。

2.编程语言概述与Python介绍

2.1编程语言

  • 编程语言(Programming Language),是一种用于编写计算机程序的语言,用于控制计算机的行为。
  • 按照语言在执行之前是否需要编译区分,可以将编程语言分为需要编译的编译型语言(Compiled Language),不需要编译的解释型语言(Interpreted Language) 。

image-20231209114926574

  • 计算机语言另一种分类方式(根据语言层次)是机器语言、汇编语言和高级语言。机器语言由0和1组成的指令构成,可以直接被机器识别。由于机器语言晦涩难懂,人们将0和1的硬件指令做了简单的封装,便于识别和记忆(例如MOV、ADD),这就是汇编语言。这两种语言都属于低级语言,其他语言都属于高级语言,例如C、C++、Java、Python、Pascal、Lisp、Prolog、FoxPro、Fortran等都是高级语言。高级语言编写的程序不能直接被计算机识别,必须经过转换成机器语言才能被执行。

2.2计算技术栈与程序执行过程

image-20231209115029083

  • 对于计算机的技术栈和程序执行的过程。左侧是计算的技术栈,我们可以看到硬件的最底层,是物理材料、晶体管来实现门电路和寄存器,再组成CPU的微架构。CPU的指令集是硬件和软件的接口,应用程序通过指令集中定义的指令驱动硬件完成计算。
  • 应用程序通过一定的软件算法完成业务功能。程序通常使用如C/C++/Java/Go/Python等高级语言开发。高级语言需要编译成汇编语言,再由汇编器按照CPU指令集转换成二进制的机器码。
  • 一个程序在磁盘上存在的形式,是一堆指令和数据所组成二进制机器码,也就是我们通常说的二进制文件。

2.3高级编程语言 - 编译型语言

  • 编译型语言:编译型语言的程序在执行之前有一个编译过程,把程序编译成为机器语言的文件。运行时不需要重新翻译,直接使用编译的结果。典型的如C/C++/Go语言,都属于编译型语言。
  • 从源码到程序的过程:源码需要由编译器、汇编器翻译成机器指令,再通过链接器链接库函数生成机器语言程序。机器语言必须与CPU的指令集匹配,在运行时通过加载器加载到内存,由CPU执行指令。

image-20231209115209612

  • 编译型语言编译的时候直接编译成机器可以执行的格式(例如.exe .dll .ocx)。编译和执行是分开的,不能跨平台执行,例如X86程序不能在ARM架构服务器上运行。

2.4高级编程语言 - 解释型语言

  • 解释型语言:解释型语言的程序不需要在运行前编译,在运行程序的时候才逐行翻译。典型的如Java/Python语言,都属于解释型语言。
  • 从源码到程序的过程:解释型语言的源代码由编译器生成字节码,然后再由虚拟机(JVM/PVM)解释执行。虚拟机将不同CPU指令集的差异屏蔽,因此解释型语言的可移植性相对较好。

image-20231209115728117

  • JVM:Java虚拟机。
  • PVM:Python虚拟机。

2.5什么是Python?

  • Python是一门完全开源的高级编程语言。它的作者是Guido Van Rossum。

image-20231209115806919

  • 由于Python具有非常丰富的第三方库,加上Python语言本身的优点,所以Python可以在非常多的领域内使用:人工智能、数据科学、APP、自动化运维脚本等。
  • Python同时也是动态类型语言。动态类型语言是指在程序运行的过程中自动决定对象的类型,不需要声明变量的类型。

2.6Python代码执行过程

image-20231209120022626

  • 对于Python而言,Python源码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行Python代码的时候,Python解释器首先将源代码转换为字节码,然后再由Python虚拟机来执行这些字节码。
  • Python虚拟机(Python VM)不是一个独立的程序,不需要独立安装。

2.7初识Python代码 - 交互式运行

  • Python有两种运行方式,交互式运行和脚本式运行。
  • 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式编写代码。

image-20231209120138678

2.8初识Python代码 - 脚本式运行

  • 脚本模式里的代码可以在各种Python编译器或者集成开发环境上运行。例如Python自带的IDLE、Atom、Visual Studio、Pycharm和Anaconda等。

image-20231209120301769

2.9Python编码规范

  • 编码规范是使用Python编写代码时应遵守的命名规则、代码缩进、代码和语句分割方式等。良好的编码规范有助于提高代码的可读性,便于代码的维护和修改。
  • 例如分号、圆括号、空行和空格的使用规范建议如下:

image-20231209120321809

2.9.1标识符命名

  • Python标识符用于表示常量、变量、函数以及其他对象的名称。
  • 标识符通常由字母、数字和下划线组成,但不能以数字开头。标识符大小写敏感,不允许重名。如果标识符不符合规则,编译器运行代码时会输出SyntaxError语法错误。

image-20231209120351393

  • Python最基本的数据类型有布尔型(True/False)、整数、浮点型、字符串型。
  • Python里的所有数据(布尔值、整数、浮点、字符串,甚至大型数据结构、函数以及程序)都是以对象(object)的形式存在的。这使得Python语言有很强的统一性。运行结果分别为10,20,Richard,2,SyntaxError(语法错误)。
  • 本文不对Python语法做针对介绍,更多Python语法请参考HCIP课程。

2.9.2代码缩进

  • 在Python程序中,代码缩进代表代码块的作用域。如果一个代码块包含两个或更多的语句,则这些语句必须具有相同的缩进量。对于Python而言代码缩进是一种语法规则,它使用代码缩进和冒号来区分代码之间的层次。
  • 编写代码时候,建议使用4个空格来生成缩进。如果程序代码中使用了错误的缩进,则会在运行中发出IndentationError错误信息。

image-20231209120452335

  • if…else…是一个完整的代码块,拥有相同的缩进。
  • print(a)调用参数a,并且和if…else…在一个代码块,需要有相同的缩进。

2.9.3使用注释

  • 注释就是在程序中添加解释说明,能够增强程序的可读性。在Python程序中,注释分为单行注释和多行注释。
  • 单行注释以 # 字符开始直到行尾结束。
  • 多行注释内容可以包含多行,这些内容包含在一对三引号内(’’’…’’’或者”””…”””)。

image-20231209120534181

2.9.4源码文件结构

  • 一个完整的Python源码文件一般包含几个组成部分:解释器和编码格式声明、文档字符串、模块导入和运行代码。
  • 如果会在程序中调用标准库或其他第三方库的类时,需要先使用import或from… import语句导入相关的模块。导入语句始终在文件的顶部。在模块注释或文档字符串(docstring)之后。

image-20231209120610877

  • 解释器声明的作用是指定运行本文件的编译器的路径(非默认路径安装编译器或有多个Python编译器)。Windows操作系统上可以省略本例中第一行解释器声明。
  • 编码格式声明的作用是指定本程序使用的编码类型,以指定的编码类型读取源代码。Python 2 默认使用的是 ASCII 编码 (不支持中文),Python 3 默认支持 UTF-8 编码 ( 支持中文)。
  • 文档字符串的作用是对本程序功能的总体介绍。
  • time为Python内置模块,作用是提供处理时间相关的函数。

2.10Python的函数与模块

  • 函数(Function)是组织好的、可重复使用的一段代码。它能够提高程序的模块化程度和代码利用率。函数使用关键字 def 定义。
  • 模块(Module)是一个保存好的Python文件。模块可以由函数或者类组成。模块和常规Python程序之间的唯一区别是用途不同:模块用于被其他程序调用。因此,模块通常没有main函数。

image-20231209120823402

2.11Python的类与方法

  • 类(Class)是用来描述具有一类相同的属性和方法的集合。类的定义使用关键字 class。
  • 被实例化的类的”函数”被称作方法(Method)。类定义方法时候必须携带 self 关键字,它表示类的实例本身。

image-20231209120858846

  • 对于函数和方法的官方定义:
  • 函数 Function: A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in the execution of the body.
  • 方法 Method: A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self).
  • 更多类的学习,请参考https://docs.python.org/3/tutorial/classes.html。

2.12telnetlib介绍

  • telnetlib是Python标准库中的模块。它提供了实现Telnet功能的类telnetlib.Telnet。
  • 这里通过调用telnetlib.Telnet类里的不同方法实现不同功能。

image-20231209121023264

  • Telnet定义了网络虚拟终端(NVT,Network Virtual Terminal)。它描述了数据和命令序列在Internet上传输的标准表示方式,以屏蔽不同平台和操作系统的差异,例如不同平台上换行的指令不一样。
  • Telnet通信采用带内信令方式,即Telnet命令在数据流中传输。为了区分Telnet命令和普通数据,Telnet采用转义序列。每个转移序列由两个字节构成,前一个字节是(0xFF)叫做IAC(Interpret As Command)“解释为命令”,标识了后面一个字节是命令。EOF也是一种Telnet命令,十进制编码是236。
  • 套接字(socket)是一个抽象层,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
  • 更多可参考https://docs.python.org/3/library/telnetlib.html

3.案例

3.1案例:使用telnetlib登陆设备

案例描述:

  • 现有一台网络设备作为Telnet服务器,需要实现使用Python telnetlib作为Telnet客户端登录此设备。

image-20231209121150292

  • 实现过程分为四个步骤:配置设备Telnet服务。手动验证和查看Telnet登录步骤,作为代码实现的参考。编写和运行Python代码。验证结果。

image-20231209121205781

image-20231209121213212

image-20231209121220676

image-20231209121226739

  • 本案例手工Telnet登录操作以windows为例:首先输入登录命令,telnet 192.168.10.10。因在前序步骤中设备配置Telnet使用密码登录,所以此处回显信息为“Password:”。此时输入密码 Huawei@123 完成验证,成功登录。

image-20231209121239322

image-20231209121250510

  • Python中encode()和decode()函数的作用是,以指定的方式编码格式编码字符串和解码字符串。本例中,password.encode(‘ascii‘) 表示将字符串’Huawei@123’转为为ASCII。此处编码格式遵守telnetlib模块官方要求。
  • Python字符串增加b,b’ str‘ 表示这是字符串是 bytes 对象。本例中,b’Password:’表示将字符串’Password:’转换为bytes类型字符串。此处编码格式遵守telnetlib模块官方要求。
  • 更多Python对象描述,请参考https://docs.python.org/3/reference/datamodel.html#objects-values-and-types。

3.2案例:运行结果对比

image-20231209121324301

4.本章总结

  • 网络自动化是通过工具实现网络自动化的部署、运行和运维,逐步减少对“人”的依赖。可以通过编程语言或者工具实现。
  • Python是一门完全开源的高级编程语言,语法简单,容易学习。拥有丰富的标准库和第三方库,适用于网络工程领域。
  • Python的telnetlib模块提供了实现Telnet功能的类telnetlib.Telnet。可以让您初窥网络编程与自动化世界!