小白网工的python之路
「Python 网络自动化」Netmiko
实验环境
我的实验环境是GNS3搭建拓扑图,用云桥接到在VMware Workstation 16运行的CentOS 7,
CentOS 7上搭建好了python3.8,
所有交换机已经预配好了SSH服务,ssh登录账号为python,密码为123
拓扑
IP规划
CentOS 7 跑python代码 | 192.168.10.46 |
---|---|
vIOS-L2-1 | 192.168.10.111 |
vIOS-L2-2 | 192.168.10.112 |
vIOS-L2-3 | 192.168.10.113 |
vIOS-L2-4 | 192.168.10.114 |
vIOS-L2-5 | 192.168.10.115 |
实验一 -lab1
实验目的
使用Netmiko登陆第一台交换机
实验准备
1.CentOS 7先下载好netmiko模块:
pip install netmiko
2.在CentOS 7上创建netmiko-lab1.py文件:
python代码
from netmiko import ConnectHandler
sw1 = {
'device_type': 'cisco_ios',
'ip': '192.168.10.111',
'username': 'python',
'password': '123'
}
with ConnectHandler(**sw1) as connect:
print ("已经成功登陆交换机" + sw1['ip'])
- 重点代码解析:
- 首先通过 import 语句从Netmiko导入它的核心对象ConnectHandler()
- 创建一个名为SW1的字典,该字典包含'device_type'、'ip'、'username'和'password'4个必选的键
- 必须通过'device_type'来指定需要登录的设备的类型
执行代码
1.执行脚本前先在S1上开启debug ip ssh,以便我们验证脚本是否真正SSH登录了交换机。
2.执行代码
验证结果
能看到debug日志,说明登陆成功!
至此,我们的实验1成功!
实验二 -lab2
实验目的
通过Netmiko向设备做配置
实验准备
1.先创建一个config-lab2.txt文件,然后写入下列配置命令,
这里我们将vlan1端口的description改为netmiko-lab2.py
int vlan1
description netmiko-lab2.py
2.在CentOS 7上创建netmiko-lab2.py文件:
python代码
from netmiko import ConnectHandler
sw1 = {
'device_type': 'cisco_ios',
'ip': '192.168.10.111',
'username': 'python',
'password': '123'
}
commands = ['interface g0/0', 'description netmiko.py']
with ConnectHandler(**sw1) as connect:
print ("已经成功登陆交换机" + sw1['ip'])
output = connect.send_command('show interface description')
print(output)
output = connect.send_config_set(commands)
print(output)
output = connect.send_config_from_file('config-lab2.txt')
print(output)
output = connect.send_command('show interface description')
print(output)
# output = connect.send_command('wr mem')
# print(output)
- 重点代码解析:
- 本实验中使用了netmiko的三种函数向设备做配置:
- send_command(),send_config_set(),send_config_from_file()[1],详解见注释,弈心老师讲解的通俗易懂
执行代码
验证结果
至此,实验2成功!
实验三 -lab3
实验目的
用Netmiko配合Textfsm或者Genie将回显内容以JSON格式输出,以pprint模块打印出来
参考
- ^Netmiko主要有四种函数向设备做配置:send_command(),send_config_set()以及send_config_from_file(),除此之外还有一个不太常用的send_command_timing(),它们的用法和区别如下: send_command():只支持向设备发送一条命令,通常是show/display之类的查询、排错命令或者wr mem这样保存配置的命令。发出命令后,默认情况下这个函数会一直等待,直到接收到设备的完整回显内容为止(以收到设备提示符为准,比如说要一直等到读取到“S1#"为止),如果在一定时间内依然没读到完整的回显内容,netmiko则会返回一个OSError: Search pattern never detected in send_command: xxxxx的异常。如果想要指定netmiko从回显内容中读到我们需要的内容,则需要用到expect_string参数(expect_string默认值为None),如果send_command()从回显内容中读到了expect_string参数指定的内容,则send_command()依然返回完整的回显内容,如果没读到expect_string参数指定的内容,则netmiko同样会返回一个OSError: Search pattern never detected in send_command: xxxxx的异常,关于expect_string参数的用法会在稍后的实验里演示。 send_config_set(): 向设备发送一条或多条配置命令,注意是配置命令,不是show/display之类的查询命令,因为send_config_set()本身会自动替我们加上一个config terminal命令进入配置模式(以及在命令末尾自动替我们加上一个end命令),在config terminal下除非在show命令前面加上一个do,比如do show ip int brief,否则show命令无效(以上以思科IOS设备为例)。send_config_set()一般配合列表使用。 send_config_from_file(): 在配置命令数量较多的时候,将所有配置命令写入列表显然是比较笨拙的,因为会造成代码过长,不方便阅读,并且在部分厂商的设备上(比如华为)还会出现超时报错的情况。我们可以先将所有的配置命令写入一个配置文件中,然后使用send_config_from_file()去读取该文件的内容帮助我们完成配置。和send_config_set()一样,send_config_from_file()也会自动帮我们添加config terminal和end两个命令,所以在我们的配置文件里无需加入这两个命令。 send_command_timing(): 和send_command()一样,只支持向设备发送一条show/display命令。区别是在用send_command()输入一条show命令后,send_command()会一直等待,直到接收到设备的完整回显内容为止(以收到设备提示符为准)。send_command_timing()则会自己去“猜”什么时候停止运行,它的原理是如果没有从设备收到更多新的回显内容后,它会继续等待2秒钟,然后自动停止运行,并且不会抛出任何异常。send_command_timing()里有一个叫做delay_factor的参数,默认为1,如果将它修改为2,则send_command_timing()会等待4秒钟,修改为3,则等待6秒,修改为4,等待8秒。。以此类推,因为send_command_timing()不会抛出OSError: Search pattern never detected in send_command: xxxxx这个异常,它是send_command()的一个良好的替代方案。有时候在输入show tech-support或者show log(logging buffer特别大,日志特别长的那种)这种回显内容巨多的命令时,即使输入了term len 0来取消分屏显示,设备在返回回显内容时依然会有停顿,有时停顿时间会大于2秒钟,这样就会导致截屏不完整,必须手动去调整delay_factor这个参数。