背景
最近工作中遇到一个需求,即一台48口的交换机,接入多台IP地址均为192.168.1.1的光猫和一台测试用PC,需要对这些光猫逐一进行web端自动化测试。
问题
因为每一台光猫的IP一样,所以需要区分出到底访问的是哪台光猫。一开始是使用逐一关断(shutdown/no shutdown)交换机端口的方式进行测试(打开要测试光猫对应的交换机端口,关闭其他端口),但后来发现这样效率很低,端口打开后,网络的连接建立比较久,故决定采用vlan划分的方式进行。
思路
- 登录连接交换机
- 进入配置
- 指定端口
- 对光猫连接端口批量划分vlan,测试PC对应端口vlan根据测试需要进行自动化切换(需要测试哪台光猫就设置与那台光猫相同的vlan),代码参见下文。
- write(保存)
批量划分vlan方法
需要将1-47口设为vlan 1000~1046
手动设置1口vlan为1000的命令如下(在cmd终端执行):
telnet 192.168.100.254
admin
en
admin
con
interface gigabitEthernet 0/1
switchport access vlan 1000
批量的设置可以参考以下链接:
测试时自动切换第48口vlan代码
# coding=utf-8
# -*-coding:gbk-*-
__author__ = 'Tank_Li'
import telnetlib, traceback
def vlanSetting(vlanNum):
print("登录交换机, 针对测试光猫位置划分vlan")
# 连接Telnet服务器
host = "192.168.100.254" # 交换机本身的ip, 项目中最好写在配置文件中
tn = telnetlib.Telnet(host, timeout=3000)
try:
# 输入登录账号
tn.read_until(b"Password:", 3)
tn.write(b'admin\n')
# enable
tn.read_until(b"Ruijie>", 3)
tn.write(b'en\n')
# 再次输入登录密码
tn.read_until(b"Password:", 3)
tn.write(b'admin\n')
# 配置终端
tn.read_until(b"Ruijie#", 3) # 题主使用的交换机是锐捷的(和思科类似),注意区分
tn.write(b'con\n')
# 指定端口
tn.read_until(b"Ruijie(config)#", 3)
tn.write(b'interface gigabitEthernet 0/48' + b'\n') # 48口固定为PC连接的端口
# 划分vlan
tn.read_until(b"Ruijie(config-if-GigabitEthernet 0/48)#", 3)
tn.write(b'switchport access vlan '+ vlanNum + b'\n') # 参数vlanNum需要与光猫位置作映射,比如"1":"1000"
except Exception:
print.exception(traceback.print_exc())
return False
finally:
tn.close()
if __name__ == '__main__':
vlanSetting(vlanNum)
注意绕坑
如果是人工配置vlan,可以在cmd窗口一次性粘贴所有配置命令(上面的划分vlan方法),但python自动化实现的话则不可以,必须先要建立telnet连接。至于原因,亲爱的读者,你知道吗?