实验背景
在网络设备数量超过千台甚至上万台的大型企业网中,难免会遇到某些设备的管理IP地址不通、SSH连接失败的情况,设备数量越多,这种情况发生的概率越高。这个时候如果你想用Python批量配置所有的设备,很可能你的脚本运行了还不到一半就因为中间某一个连接不通的设备而停止了。此时我们想要跳过异常的设备而去处理剩下的设备。
实验准备
将LSW2的ssh密码改为123,模拟验证失败,连接LSW4的接口关闭,模拟不可达。
创建一个ip.txt的文本用于存放ip地址,创建本次实验脚本lab9.py
实验目的
创建一个带有try…except…异常处理语句的脚本来批量在交换机SW2~SW5上执行 更改stp模式为STP的命令,让脚本在SW3、SW4分别因为用户名和密码不匹配,以及连通性出现故障的情况下,依然可以不受干扰,进而完成剩余的配置。并形成两个文件,分别记录验证失败、不可达的ip地址。
实验拓扑
将ensp的LSW1与本地虚拟网卡loopback0进行桥接,模拟将自己的电脑桥接到以下拓扑网络中。
实验脚本
import netmiko
from netmiko import ConnectHandler
import getpass
username=input('Username:')
password=getpass.getpass('Password:')
iplist=open('ip.txt','r')
f1=open('验证失败.txt','a+')#用于存放验证失败设备的ip地址
f2=open('不可达.txt','a+') #用于存放不可达设备的ip地址
for line in iplist.readlines():
try:
ip=line.strip()
SW={
'device_type':'huawei',
'ip':ip,
'username':username,
'password':password,
}
connect=ConnectHandler(**SW)
print('\n-----------------------成功登录到交换机:'+ip+'------------------')
config_commands=['stp mode mstp','dis stp | include CIST Global Info']
print(connect.send_config_set(config_commands))
connect.save_config()
except netmiko.ssh_exception.NetmikoAuthenticationException:
print('\n------------------------------------------------------------------')
print(ip+'用户验证失败!') #将验证失败的ip地址写入文件
print('------------------------------------------------------------------\n')
f1.write(ip+'\n')
except netmiko.ssh_exception.NetmikoTimeoutException:
print('\n------------------------------------------------------------------')
print('\n'+ip+'不可达!') #将不可达的ip地址写入文件
print('------------------------------------------------------------------\n')
f2.write(ip+'\n')
iplist.close()
f1.close()
f2.close()
当SSH登录交换机时,如果用户名和密码不正确,Python会报错:“netmiko.ssh_exception.NetmikoAuthenticationException”。
当不可达时,python会报错:
“netmiko.ssh_exception.NetmikoTimeoutException”
实验结果
注:getpass在Windows命令集中才能得到支持,如果在IDLE中运行,密码依然明文可见,但是在文件目录当中双击运行代码lab9.py或在cmd中运行都是可以正常隐藏密码。
不可达和验证失败的ip地址都已记录到文件里去了。