Python网络自动化:使用脚本批量模拟不同厂商设备配置

前言

  • 随着虚拟化和云化时代到来,业务部署速度快,网络自动化变得越来越重要了。
  • 网络编程和自动化是简化网工的配置、管理、监控和操作等相关工作的一大利器,可以大幅提高工程师部署和运维效率。
  • 以下均为本人实际工作中遇到的一些问题:
    1. 网络中设备多:主管网络中500台不同厂家的网络设备
    2. 操作繁琐、重复:全网统一配置syslog命令、定期的备份
    3. 效率低:如果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命令(文本文档已修改)

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python网络自动化:使用脚本批量模拟不同厂商设备配置

    发表评论