Python - 网络自动化(利用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命令(文本文档已修改)

  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值