前言
- 随着虚拟化和云化时代到来,业务部署速度快,网络自动化变得越来越重要了。
- 网络编程和自动化是简化网工的配置、管理、监控和操作等相关工作的一大利器,可以大幅提高工程师部署和运维效率。
- 以下均为本人实际工作中遇到的一些问题:
- 网络中设备多:主管网络中500台不同厂家的网络设备
- 操作繁琐、重复:全网统一配置syslog命令、定期的备份
- 效率低:如果500台设备都需要刷syslog命令或者是定期备份配置,将需要大量的时间(如果有5000台?5w台呢?)
Idea
- 个人浅见:编程实际上就是画一个圈,把事物圈住。而这个“圈”的名字叫逻辑。
需求
- 通过遍历excel表格、文本文档获取登录所需信息以及配置
- 代码尽量体现模块化以及面向对象的思想
实现
- 通过模拟器分别模拟不同厂商之间的设备,并且配置好路由、SSH等。
- 提前规划好设备需要登陆的信息,如IP、Port、Username、Password、Device等,并进行批量的读取后登录。
- 创建文本并保存登录后需要执行的配置命令(另外两个分别是dis vlan 20、dis vlan 30 由于是华为的模拟器,只能识别华为的命令)。
代码部分
import paramiko
import time
import pandas as pd
class Devnet: # 创建一个类
def __init__(self, ip, port, username, password): # init一个初始化对象
self.ip = ip
self.port = port
self.username = username
self.password = password
self.session = None
self.vty = None
def transport(self): # 建立SSH连接
ssh_session = paramiko.SSHClient() # 创建一个SSH对象
ssh_session.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机
ssh_session.connect(hostname=self.ip,
port=self.port,
username=self.username,
password=self.password
)
self.session = ssh_session
def open_vty(self): # 激活terminal,并且当作对象去接受
self.vty = self.session.invoke_shell()
def huawei_config(self): # 华为设备的配置方法
try:
self.transport()
self.open_vty()
except Exception:
return print(f"{self.ip} SSH 连接失败!")
with open("huawei.txt", mode="r", encoding="utf-8") as f:
for i in f.readlines():
self.vty.send(i)
time.sleep(0.5)
return self.vty.recv(65535).decode("utf-8")
def cisco_config(self): # 思科设备的配置方法
try:
self.transport()
self.open_vty()
except Exception:
return print(f"{self.ip} SSH 连接失败!")
with open("cisco.txt", mode="r", encoding="utf-8") as f:
for i in f.readlines():
self.vty.send(i)
time.sleep(0.5)
return self.vty.recv(65535).decode("utf-8")
def h3c_config(self): # 新华三设备的配置方法
try:
self.transport()
self.open_vty()
except Exception:
return print(f"{self.ip} SSH 连接失败!")
with open("h3c.txt", mode="r", encoding="utf-8") as f:
for i in f.readlines():
self.vty.send(i)
time.sleep(0.5)
return self.vty.recv(65535).decode("utf-8")
df = pd.read_excel("Excel.xlsx") # 读取Excel表格,并以字典的形式存在在列表中
name = []
for index, row in df.iterrows():
row = row.fillna("")
row = dict(row)
name.append(row)
if __name__ == "__main__":
while True: # 写入一个有条件的死循环,对保存表格信息的列表进行判断并执行相对应的操作
if len(name) > 0:
if name[0]["device"] == "huawei":
r = Devnet(name[0]["ip"], name[0]["port"], name[0]["username"], name[0]["password"]).huawei_config()
time.sleep(0.5)
print(r)
del name[0]
elif name[0]["device"] == "cisco":
r = Devnet(name[0]["ip"], name[0]["port"], name[0]["username"], name[0]["password"]).cisco_config()
time.sleep(0.5)
print(r)
del name[0]
elif name[0]["device"] == "h3c":
r = Devnet(name[0]["ip"], name[0]["port"], name[0]["username"], name[0]["password"]).cisco_config()
time.sleep(0.5)
print(r)
del name[0]
else:
break
验证
二次验证,模拟刷syslog命令(文本文档已修改)