您好,欢迎光临有路网!
网络工程师的Python之路:网络运维自动化实战
QQ咨询:
有路璐璐:

网络工程师的Python之路:网络运维自动化实战

  • 作者:王印 著
  • 出版社:电子工业出版社
  • ISBN:9787121398063
  • 出版日期:2020年11月01日
  • 页数:300
  • 定价:¥79.00
  • 猜你也喜欢

    分享领佣金
    手机购买
    城市
    店铺名称
    店主联系方式
    店铺售价
    库存
    店铺得分/总交易量
    发布时间
    操作

    新书比价

    网站名称
    书名
    售价
    优惠
    操作

    图书详情

    内容提要
    众所周知,Python这门编程语言的应用场景十分广泛,人工智能、数据分析、爬虫、Web开发、游戏制作等领域都能看到Python的身影,随着近几年Python的大热,和上述Python应用场景相关的书籍、视频、网站等教学资源随处可见,而市面上Python的基础入门教程更是多如牛毛。遗憾的是,在如此丰富的Python教学资源中,为网络工程师量身打造的计算机网络运维方面的教学书籍却相当匮乏。 本书内容基于思科设备和技术,从网络工程师的角度出发,以截稿前的Python 3.8为主,从Python的安装到基础和进阶知识,再到Python在网络运维中的实战应用和网络工程师必须掌握的Python第三方模块,所有内容均为网络工程师量体裁衣,让完全零基础的网络工程师能够快速上手并掌握Python这门编程语言,将网络运维自动化技术运用在日常工作中,在提高工作效率的同时,提升职场竞争力。 本书所有内容均由作者精选,只讲解对网络工程师有用的Python知识,让读者在网络运维自动化技术学习的道路上少走一些弯路。
    文章节选
    5.1 实验1 大规模批量修改交换机Qos的配置 在第4章的实验2中提到了,要使用Python来批量连接管理IP地址不连续的网络设备,可以把设备的管理IP地址预先写入一个文本文件,然后在代码中使用for循环配合open()函数和readlines()函数逐行读取该文本文件里的管理IP地址,达到循环批量登录多台网络设备的目的。 在成功登录交换机后,我们可以配合command.send()来对网络设备“发号施令”,但在前面的例子中我们都是将要输入的命令预先写在脚本里,比如command.send("conf t\n")、command.send("router eigrp 1\n")和command.send("end\n")等。这种将配置命令预先写在脚本里的方法便于初学者理解和学习,在只有几台设备的实验环境中常用。但是在有成千上万台网络设备需要管理的生产环境中,这种方法显得很笨拙,缺乏灵活性。举例来说,假设生产环境中有不同型号、不同操作系统、不同命令格式的设备各1 000台,比如思科的3750和3850交换机,前者运行的是IOS,后者运行的是IOS-XE。 *近你接到任务,需要分别给这两种交换机批量修改QoS的配置,因为两者的命令格式差异巨大(一个是MLS QoS,一个是MQC QoS),必须反复修改command.send()部分的代码,如果只是简单数条命令还好办,一旦遇到大规模的配置,那么这种方法的效率会很低。 解决这个问题的思路是分别创建两个文本文件,一个用来存放配置3750交换机要用的命令集,另一个用来存放配置3850交换机要用到的命令集,然后在Python脚本里同样通过for循环加open()函数来读取两个文件里的内容,达到分别给所有3750和3850交换机做QoS配置的目的,这样做的好处是无须修改command.send()部分的代码,因为所有的命令行已经在文本文件里预先设置好了。 但是新的问题又来了,每次配备不同型号的设备,都必须手动修改open()函数所打开的配置文本文件及IP地址文件,比如在给3750交换机做配置时,需要open('command_ 3750.txt')和open('ip_3750.txt'), 给3850交换机做配置时,又需要open('command_3850.txt')和open('ip_3850.txt'),这样一来二去修改配置脚本的做法大大缺乏灵活性。如果只有两种不同型号、不同命令格式的设备还能应付,那么当生产环境中同时使用3750(IOS)、3850(IOS-XE)、Nexus 3k/5k/7k/9k(NX-OS)、CRS3/ASR9K(IOS-XR),甚至其他厂商的设备,而又要对所有这些设备同时修改某个共有的配置。比如网络新添加了某台TACACS服务器,要统一给所有设备修改它们的AAA配置;又或者网络新添加了某台NMS系统,要统一给所有设备修改SNMP配置。因为不同OS的���备的配置命令完全不同,这时就能体会到痛苦了。此时我们可以用下面实验中的sys.argv来解决这个问题。 5.1.1 实验背景 本实验将在真机下完成。 假设现在手边有3台管理IP地址在168.100.x /24网段的3750交换机和3台管理IP地址在172.16.100.x/24网段的3850交换机,它们的hostname和管理IP地址分别如下。 3750_1: 192.168.100.11
    3750_2: 192.168.100.22
    3750_3: 192.168.100.33

    3850_1: 172.16.100.11
    3850_2: 172.16.100.22
    3850_3: 172.16.100.33 5.1.2 实验目的 修改所有3750和3850交换机的QoS配置,更改它们出队列(output queue)的队列参数集2(queue-set 2)的缓存(buffers)配置,给队列1、2、3和4分别分配15%、25%、40%和20%的缓存(默认状况下是25%、25%、25%和25%)。 5.1.3 实验准备 (1)首先创建两个名为command_3750.txt和ip_3750.txt的文本文件,分别用来保存我们将要配置3750交换机的QoS命令,以及所有3750交换机的管理IP地址。 [root@CentOS-Python ~]# cat command_3750.txt configure terminal
    mls qos queue-set output 1 buffers 15 25 40 20 end wr mem

    [root@CentOS-Python ~]# cat ip_3750.txt
    192.168.100.11
    192.168.100.22
    192.168.100.33 (2)同理,创建两个名为command_3850.txt和ip_3850.txt的文本文件,分别用来保存我们将要配置3850交换机的QoS命令,以及所有3850交换机的管理IP地址。 [root@CentOS-Python ~]# cat command_3850.txt
    configure terminal
    class-map match-any cos7
    match cos 7
    class-map match-any cos1
    match cos 1
    exit
    policy-map queue-buffer
    class cos7
    bandwidth percent 10
    queue-buffers ratio 15
    class cos1
    bandwidth percent 30
    queue-buffers ratio 25
    exit
    exit
    interface gi1/0/1
    service-policy output queue-buffer
    end
    wr mem

    [root@CentOS-Python ~]# cat ip_3850.txt
    172.16.100.11
    172.16.100.22
    172.16.100.33 (3)在主机上创建实验1的脚本,将其命名为lab1.py。 5.1.4 实验代码 将下列代码写入脚本lab1.py。 import paramiko import time import getpass import sys username = input('username: ') password = getpass.getpass('password: ') ip_file = sys.argv[1] cmd_file = sys.argv[2] iplist = open(ip_file, 'r') for line in iplist.readlines(): ip = line.strip() ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password) print "You have successfully connect to ", ip command = ssh_client.invoke_shell() cmdlist = open(cmd_file, 'r') cmdlist.seek(0) for line in cmdlist.readlines(): command.send(line "\n") time.sleep(1) cmdlist.close() output = command.recv(65535) print (output.decode("ascii")) iplist.close() ssh_client.close 5.1.5 代码分段讲解 (1)因为要用到sys.argv,所以我们导入了sys模块。sys模块是Python中十分常用的内建模块。其余部分的代码都是在前面实验中讲过的,不再赘述。 import paramiko import time import getpass import sys username = input('username: ') password = getpass.getpass('password: ') (2)创建两个变量ip_file和cmd_file,分别对应sys.argv[1]和sys.argv[2]。 ip_file = sys.argv[1] cmd_file = sys.argv[2] argv是argument variable参数变量的简写形式,这个变量的返回值是一个列表,该列表中的元素即我们在主机命令行里运行Python脚本时输入的命令。sys.argv[0] 一般是被调用的.py脚本的文件名,从sys.argv[1]开始就是为这个脚本添加的参数。举个例子,我们现在返回主机,输入下面这条命令。 [root@CentOS-Python ~]# python3.8 lab1.py ip_3750.txt cmd_3750.txt 那么,这时的sys.argv即含有lab1.py、ip_3750.txt、cmd_3750.txt 3个元素的列表。这时sys.argv[0] = lab1.py,sys.argv[1] = ip_3750.txt,sys.argv[2] = cmd_3750.txt。相应地,代码里的ip_file = sys.argv[1] 此时等同于ip_file = ip_3750.txt,cmd_file = sys.argv[2]此时等同于cmd_file = cmd_3750.txt。同理,如果这时我们在主机上执行如下命令。 [root@CentOS-Python ~]# python3.8 lab1.py ip_3850.txt cmd_3850.txt 则此时ip_file = ip_3850.txt,cmd_file = cmd_3850.txt。由此可见,配合sys.argv,我们可以很灵活地选用脚本需要调用的参数(文本文件),而无须反反复复地修改脚本代码。 (3)需要注意的是,在剩下的代码中,我们没有在脚本里预先写好具体的QoS配置命令,取而代之的是通过cmd_file = sys.argv[2]配合cmdlist = open(cmd_file, 'r')和for line in cmdlist.readlines()来读取独立于脚本之外的配置命令文件,可以随意在命令行里选择我们想要的配置命令文件,也就是本实验中的cmd_3750.txt和cmd_3850.txt。 iplist = open(ip_file, 'r') for line in iplist.readlines(): ip = line.strip() ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password) print "You have successfully connect to ", ip command = ssh_client.invoke_shell() cmdlist = open(cmd_file, 'r') cmdlist.seek(0) for line in cmdlist.readlines(): command.send(line "\n") time.sleep(1) cmdlist.close() output = command.recv(65535) print (output.decode("ascii")) iplist.close() ssh_client.close 5.1.6 验证 [root@CentOS-Python ~]# python3.8 lab1.py ip_3750.txt cmd_3750.txt Username: python password: You have successfully connect to 192.168.100.11 3750_1#conf t 3750_1(config)#mls qos queue-set output 1 buffers 15 25 40 20 3750_1(config)#end 3750_1#wr mem Building configuration... [OK] You have successfully connect to 192.168.100.22 3750_2#conf t 3750_2(config)#mls qos queue-set output 1 buffers 15 25 40 20 3750_2(config)#end 3750_2#wr mem Building configuration... [OK] You have successfully connect to 192.168.100.33 3750_3#conf t 3750_3(config)#mls qos queue-set output 1 buffers 15 25 40 20 3750_3(config)#end 3750_3#wr mem Building configuration... [OK] [root@CentOS-Python ~]# python lab1.py ip_3850.txt cmd_3850.txt Username: python password: You have successfully connect to 172.16.100.11 3850_1#configure terminal Enter configuration commands, one per line. End with CNTL/Z. 3850_1(config)#class-map match-any cos7 3850_1(config-cmap)#match cos 7 3850_1(config-cmap)#class-map match-any cos1 3850_1(config-cmap)#match cos 1 3850_1(config-cmap)#exit 3850_1(config)#policy-map queue-buffer 3850_1(config-pmap)#class cos7 3850_1(config-pmap-c)#bandwidth percent 10 3850_1(config-pmap-c)#queue-buffers ratio 15 3850_1(config-pmap-c)#class cos1 3850_1(config-pmap-c)#bandwidth percent 30 3850_1(config-pmap-c)#queue-buffers ratio 25 3850_1(config-pmap-c)#exit 3850_1(config-pmap)#exit 3850_1(config)#interface gi1/0/1 3850_1(config-if)#service-policy output queue-buffer 3850_1(config-if)#end 3850_1#wr mem Building configuration... Compressed configuration from 62654 bytes to 19670 bytes[OK] You have successfully connect to 172.16.100.22 3850_2#configure terminal Enter configuration commands, one per line. End with CNTL/Z. 3850_2(config)#class-map match-any cos7 3850_2(config-cmap)#match cos 7 3850_2(config-cmap)#class-map match-any cos1 3850_2(config-cmap)#match cos 1 3850_2(config-cmap)#exit 3850_2(config)#policy-map queue-buffer 3850_2(config-pmap)#class cos7 3850_2(config-pmap-c)#bandwidth percent 10 3850_2(config-pmap-c)#queue-buffers ratio 15 3850_2(config-pmap-c)#class cos1 3850_2(config-pmap-c)#bandwidth percent 30 3850_2(config-pmap-c)#queue-buffers ratio 25 3850_2(config-pmap-c)#exit 3850_2(config-pmap)#exit 3850_2(config)#interface gi1/0/1 3850_2(config-if)#service-policy output queue-buffer 3850_2(config-if)#end 3850_2#wr mem Building configuration... Compressed configuration from 62654 bytes to 19670 bytes[OK] You have successfully connect to 172.16.100.33 3850_3#configure terminal Enter configuration commands, one per line. End with CNTL/Z. 3850_3(config)#class-map match-any cos7 3850_3(config-cmap)#match cos 7 3850_3(config-cmap)#class-map match-any cos1 3850_3(config-cmap)#match cos 1 3850_3(config-cmap)#exit 3850_3(config)#policy-map queue-buffer 3850_3(config-pmap)#class cos7 3850_3(config-pmap-c)#bandwidth percent 10 3850_3(config-pmap-c)#queue-buffers ratio 15 3850_3(config-pmap-c)#class cos1 3850_3(config-pmap-c)#bandwidth percent 30 3850_3(config-pmap-c)#queue-buffers ratio 25 3850_3(config-pmap-c)#exit 3850_3(config-pmap)#exit 3850_3(config)#interface gi1/0/1 3850_3(config-if)#service-policy output queue-buffer 3850_3(config-if)#end 3850_3#wr mem Building configuration... Compressed configuration from 62654 bytes to 19670 bytes[OK]
    目录
    第1章 Python的安装和使用 1 1.1 安装Python 1 1.1.1 在Windows下安装Python 3.8.2 2 1.1.2 在Linux下安装Python 3.8.2 5 1.2 在Windows下使用Python 3.8.2 8 1.2.1 交互模式 8 1.2.2 脚本模式 10 1.2.3 运行Python脚本 14 1.3 在Linux下使用Python 3.8.2 18 1.3.1 交互模式 19 1.3.2 脚本模式 19 1.3.3 运行Python脚本 22 1.3.4 Shebang符号 22 第2章 Python基本语法 24 2.1 变量 24 2.2 注释 27 2.3 方法和函数 28 2.4 数据类型 30 2.4.1 字符串 30 2.4.2 整数和浮点数 41 2.4.3 列表 45 2.4.4 字典 50 2.4.5 布尔类型 55 2.4.6 集合、元组、空值 57 第3章 Python进阶语法 62 3.1 条件(判断)语句 62 3.1.1 通过比较运算符做判断 63 3.1.2 通过字符串方法 逻辑运算符做判断 64 3.1.3 通过成员运算符做判断 67 3.2 循环语句 69 3.2.1 while语句 69 3.2.2 for语句 72 3.3 文本文件的读/写 75 3.3.1 open()函数及其模式 75 3.3.2 文件读取 76 3.3.3 文件写入 84 3.3.4 with语句 88 3.4 自定义函数 89 3.4.1 函数的创建和调用 90 3.4.2 函数值的返回 91 3.4.3 嵌套函数 93 3.5 模块 93 3.5.1 不带自定义函数的模块 94 3.5.2 带自定义函数的模块 95 3.5.3 Python内建模块和第三方模块 95 3.5.4 from ... import ... 99 3.5.5 if __name__ == '__main__': 99 3.6 正则表达式 100 3.6.1 什么是正则表达式 101 3.6.2 正则表达式的验证 102 3.6.3 正则表达式的规则 103 3.6.4 正则表达式在Python中的应用 110 3.7 异常处理 116 第4章 Python网络运维实验(GNS3模拟器) 122 4.1 实验运行环境 122 4.2 Python中的Telnet和SSH模块 124 4.2.1 Telnetlib 124 4.2.2 Paramiko和Netmiko 131 4.3 实验1 input()函数和getpass模块 143 4.3.1 实验目的 143 4.3.2 实验准备 143 4.3.3 实验代码 145 4.3.4 代码分段讲解 146 4.3.5 验证 148 4.4 实验2 批量登录不同网段的交换机 152 4.4.1 实验目的 152 4.4.2 实验准备 153 4.4.3 实验代码 154 4.4.4 代码分段讲解 155 4.4.5 验证 156 4.5 实验3 异常处理的应用 157 4.5.1 实验目的 159 4.5.2 实验准备 159 4.5.3 实验代码 160 4.5.4 代码分段讲解 162 4.5.5 验证 164 4.6 实验4 Python实现网络设备的配置备份 166 4.6.1 实验目的 166 4.6.2 实验准备 166 4.6.3 实验代码 170 4.6.4 代码分段讲解 171 4.6.5 验证 173 第5章 Python网络运维实战(真机) 176 5.1 实验1 大规模批量修改交换机QoS的配置 176 5.1.1 实验背景 178 5.1.2 实验目的 178 5.1.3 实验准备 178 5.1.4 实验代码 180 5.1.5 代码分段讲解 181 5.1.6 验证 182 5.2 实验2 pythonping的使用方法 185 5.2.1 实验背景 187 5.2.2 实验目的 187 5.2.3 实验思路 187 5.2.4 实验准备 - 脚本1 188 5.2.5 实验代码 - 脚本1 189 5.2.6 脚本1代码分段讲解 190 5.2.7 脚本1验证 192 5.2.8 实验准备 - 脚本2 193 5.2.9 实验代码 - 脚本2 194 5.2.10 脚本2代码分段讲解 196 5.2.11 脚本2验证 200 5.3 实验3 利用Python脚本检查交换机的配置 201 5.3.1 实验背景 201 5.3.2 实验目的 202 5.3.3 实验思路 202 5.3.4 实验准备 - 脚本1 203 5.3.5 实验代码 - 脚本1 204 5.3.6 脚本1代码分段讲解 206 5.3.7 脚本1验证 211 5.3.8 实验准备 - 脚本2 212 5.3.9 实验代码 - 脚本2 213 5.3.10 脚本2代码分段讲解 215 5.3.11 脚本2验证 217 第6章 Python第三方模块详解 218 6.1 JSON 219 6.1.1 JSON基础知识 220 6.1.2 JSON在Python中的使用 221 6.2 正则表达式的痛点 222 6.3 TextFSM和ntc-templates 224 6.3.1 TextFSM的安装 226 6.3.2 TextFSM模板的创建和应用 227 6.3.3 ntc-templates 231 6.4 NAPALM 237 6.4.1 什么是NAPALM 237 6.4.2 NAPALM的优点 238 6.4.3 NAPALM的缺点 240 6.4.4 NAPALM的安装 241 6.4.5 NAPALM的应用 242 6.5 pyntc 248 6.5.1 pyntc和NAPALM的比较 248 6.5.2 pyntc的安装 249 6.5.3 pyntc的应用 250 6.6 netdev(异步并行) 257 6.6.1 同步与异步 258 6.6.2 异步在Python中的应用 258 6.6.3 netdev的安装和应用 262 6.7 Netmiko(多线程) 267 6.7.1 单线程与多线程 268 6.7.2 多线程在Python中的应用 268 6.7.3 多线程在Netmiko中的应用 273

    与描述相符

    100

    北京 天津 河北 山西 内蒙古 辽宁 吉林 黑龙江 上海 江苏 浙江 安徽 福建 江西 山东 河南 湖北 湖南 广东 广西 海南 重庆 四川 贵州 云南 西藏 陕西 甘肃 青海 宁夏 新疆 台湾 香港 澳门 海外