实验背景
大型企业网络设备规模庞大,数量可达成千上万的级别,实际运维中常会发生个别网元因设备故障、链路断开、防火墙策略拦劫、用户名密码配置不对等造成 SSH 连接失败的情况,即网元脱管。前面的几个实验,我们均没有考虑到这个场景,都是假设要操作的设备都是正常可控的。不烦试一下,之前的实验拓扑中,任一删掉一条链路,或者关掉一台 Layer3Switch,或者改个登录密码,都会发现 python 脚本会卡主后报错,脚本停止不在执行。本实验我们用 Python 中的 try, except 异常处理语句,来解决这个问题
实验拓扑
【SSH 客户端】Win10 虚拟网卡,IP 为 192.168.11.2/24,桥接到云彩,Python所在。
【透明交换机】SW1(启动即可,无需配置,给云彩扩展端口使用)。
【SSH 操作对象】L3Sx,IP为 192.168.11.1x/24,本实验模拟 L3S2 的链路断开,L3S3 的登录密码错误。
实验目的
创建一个带有 try,except 异常处理语句的 python 脚本来批量在交换机 L3S1 到 L3S5 上执行 display clock 命令。按照拓扑,模拟 L3S2 出现链路故障,L3S3 用户名密码不匹配,所写 Python 脚本可跳过“故障网元”,继续执行
实验准备
L3S2 的 GE0/0/1 进行 shutdown,模拟上联链路故障(拓扑端口也变红。)
L3S3 的用户 python 密码由 123 改为 456。
我们把【实验4】脚本拿过来试跑一下,在 ip.txt 先剔除掉 L3S3 (192.168.11.13)的信息,针对性的观察断链了的 L3S2。
【实验4】脚本试跑结果,主要针对 L3S2 的不可达异常情况。
接着,我们把【实验4】脚本拿过来再试跑一下,在 ip.txt 先剔除掉 L3S2 (192.168.11.12)的信息,针对性的观察断链了的 L3S3。
【实验4】脚本试跑结果,主要针对 L3S3 的认证异常情况。
实验前检查
交换机 Layer3Switch-1 到 Layer3Switch-5,除 Layer3Switch-2 和 Layer3Switch-3 我们做了场景模拟外,其它 3 台我们需要再检查一下连通性,登录认证等信息,这里从简。
Python 代码
代码
@弈心
大神在视频和书中都逐条做了详细解释,如需要请移步阅读,强烈建议看视频中的代码解释。这里我将其代码中的思科指令修改成华为指令,让实验能在华为设备来跑起来。
import paramiko
import time
import getpass
import sys
import socket
username = input("Username: ")
password = getpass.getpass("Password: ")
ip_file = sys.argv[1]
cmd_file = sys.argv[2]
# 存放认证失败的设备信息
switch_with_authentication_issue = []
# 存放网络不通的设备信息
switch_not_reachable = []
iplist = open(ip_file,'r')
for line in iplist.readlines():
try:
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,look_for_keys=False)
print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
print('已经成功登陆交换机 ' + ip)
command = ssh_client.invoke_shell()
cmdlist = open(cmd_file,'r')
cmdlist.seek(0)
for line in cmdlist.readlines():
each_command = line.strip()
command.send(each_command + '\n')
time.sleep(0.5)
cmdlist.close()
output = command.recv(65535).decode('ASCII')
print(output)
except paramiko.ssh_exception.AuthenticationException:
print(ip + "用户验证失败!")
switch_with_authentication_issue.append(ip)
except socket.error:
print(ip + "目标不可达!")
switch_not_reachable.append(ip)
iplist.close()
ssh_client.close()
print('\n 下列交换机用户验证失败:')
for i in switch_with_authentication_issue:
print(i)
print('\n 下列交换机不可达:')
for i in switch_not_reachable:
print(i)
实验过程
我们把 ip.txt 列表倒回成所有网元 IP。
我们直接 在CMD 上进入目录执行,运行过程截图如下。
实验结果检查
其实没什么好检查的,因为配有配置,不过我们可以查看一下日志。display logbuffer ,查看是否有执行了 display clock 命令,时间点是否对得上。应该是模拟器的原因导致没看到想出现的现象。