使用python netmiko模块批量配置Cisco、华为、H3C路由器交换机(支持 telnet 和 ssh 方式)

0. 当前环境

  • 外网电脑Python版本:3.8.5(安装后不要删除安装包,以后卸载的时候用这个)
  • 外网电脑安装netmiko第三方库:cmd中输入pip install netmiko
  • 内网电脑环境:无法搭建python环境,需外网电脑完成后打包成exe使用
    • 外网电脑cmd中输入:cd C:\USERS\Admin\DESKTOP\批量配置
    • 外网电脑cmd中回车后接着输入:pyinstaller -F telnet.py
  • Windows下如何使用tree命令生成目录树
  • 未打包的文件结构图
C:\USERS\Admin\DESKTOP\批量配置(注:文件夹存放位置和文件夹名称无所谓)
│  config_cisco.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│  config_h3c.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│  config_huawei.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│  resource.xlsx(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│  telnet.py(注:名称随便起)
│ 
  • 打包后的文件结构图
C:\USERS\Admin\DESKTOP\批量配置(注:文件夹存放位置和文件夹名称无所谓)
│  config_cisco.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│  config_h3c.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│  config_huawei.txt(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│  resource.xlsx(注:根据下面的代码来说,这个文件必须写这个名字,改名的同时需要改掉代码里的)
│  telnet.spec(打包exe产生的)
│
├─build(打包exe产生的)
│  └─telnet
│      │  Analysis-00.toc
│      │  base_library.zip
│      │  EXE-00.toc
│      │  PKG-00.toc
│      │  PYZ-00.pyz
│      │  PYZ-00.toc
│      │  telnet.pkg
│      │  warn-telnet.txt
│      │  xref-telnet.html
│      │
│      └─localpycs
│              pyimod01_archive.pyc
│              pyimod02_importers.pyc
│              pyimod03_ctypes.pyc
│              pyimod04_pywin32.pyc
│              struct.pyc
│
└─dist(打包exe产生的)
       telnet.exe(最后内网使用的是这个exe文件,只用把这个exe复制出来,使用就好)

1. python环境搭建

2. 相关文件和代码

2.1 resource.xlsx

  • 表头和表中内容如图所示(以H3C设备为例)
    • Cisco设备的type:cisco_ios
    • H3C设备的type:hp_comware
    • Huawei设备的type:huawei
      在这里插入图片描述

2.2 config_h3c.txt

  • 只需要直接开始敲命令就好,不用输入en进入特权模式然后conf t(针对Cisco),也不用输入保存命令
    在这里插入图片描述

2.3 telnet.py

  • 华为设备的保存命令比较特别,其他设备可以按照代码中的华为保存命令自己调整
from netmiko import ConnectHandler, exceptions
from openpyxl import load_workbook
import time
date = time.strftime('%Y%m%d', time.localtime()) #赋予date变量
# 读取excel内设备列表信息
def check_and_get_dev_list(filename, sheet_name):
    excel_information = []
    sheet_header = []
    wb = load_workbook(filename)
    sh = wb[sheet_name]
    # 获取最大行数
    row = sh.max_row
    # 获取最大列数
    column = sh.max_column
    data = []
    # 获取表头写入列表中方便调用
    for data_1 in range(1, column+1):
        get_sheet_header = sh.cell(row=1, column=data_1).value
        sheet_header.append(get_sheet_header)
    # 第一行为表头, 此处 row +1 是pyton循环时不读取最后一个数
    for row_1 in range(2, row + 1):
        # 存储一行信息
        sheet_data_1 = dict()
        # 逐行读取表中的数据
        for b in range(1, column + 1):
            cell = sh.cell(row=row_1, column=b).value
            # 将数据已字典形式写入 sheet_data_1 中
            # if cell != None:
            sheet_data_1[sheet_header[b-1]] = cell
        excel_information.append(sheet_data_1)
    for i in excel_information:
        if i['ip'] != None:
            data.append(i)
    return data
 
#获取excel数据并整合成dev字典
def get_dev():
    res = check_and_get_dev_list('./resource.xlsx', 'Sheet1')
    devices = []
    for i in res:
        if i['protocol'] == 'telnet':
            i['type'] = i['type']+'_telnet'
        dev = {'device_type':i['type'],
               'host': i['ip'],
               'username': i['username'],
               'password': i['password'],
               'secret': i['enpassword'],
               'port': i['port'],}
        devices.append(dev)
    return devices

# 批量配置交换机
def devices_add_conf(devices=''):
    # 循环登录设备添加配置
    for dev in devices:
        try:
            with ConnectHandler(**dev) as connect:
                print('\n----------成功登录到:' + dev['host'] + '----------')
                connect.enable()
                if 'cisco_ios' in dev['device_type']:
                    output = connect.send_config_from_file('config_cisco.txt')
                    print(output)
                    save_output = connect.save_config()
                    print(save_output)
                elif 'huawei' in dev['device_type']:
                    output = connect.send_config_from_file('config_huawei.txt')
                    print(output)
                    save_output = connect.save_config(cmd='save',confirm=True,confirm_response='y')
                    print(save_output)
                    save_output = connect.save_config(cmd='y',confirm=True)
                    print(save_output)
                    save_output = connect.save_config(cmd='\n',confirm=True)
                    print(save_output)
                elif 'hp_comware' in dev['device_type']:
                    output = connect.send_config_from_file('config_h3c.txt')
                    print(output)
                    save_output = connect.save_config()
                    print(save_output)
                else:
                    print('error')
        # 连接异常处理
        except exceptions.NetmikoAuthenticationException:
            e1 = open(f'{date}.txt','a')
            print(date,dev['host'],'[Error 1] 登录验证失败!\n',file = e1)
            e1.close
            continue
        except exceptions.NetmikoTimeoutException:
            e2 = open(f'{date}.txt','a')
            print(date,dev['host'],'[Error 2] 超时,目标不可达!\n',file = e2)
            e2.close
            continue
        except exceptions.ReadTimeout:
            e3 = open(f'{date}.txt','a')
            print(date,dev['host'],'[Error 3] 读取超时,请检查enable密码是否正确!\n',file = e3)
            e3.close
            continue
        except:
            e4 = open(f'{date}.txt','a')
            print(date,dev['host'],'[Error 4] Unknown error.\n',file = e4)
            e4.close
            continue
    return 1
# 运行主程序
if __name__ == '__main__':
    dev = get_dev()
    devices_add_conf(devices=dev)

3. 使用H3C模拟器简单测试

  • 可以使用H3C模拟器进行简单测试(相当于电脑和模拟器中的两个交换机在同一网段)
  • 模拟器中的两个交换机配置telnet
telnet server enable
local-user h3c class manage
	password simple h3c123456789
	service-type telnet
	authorization-attribute user-role network-operator
	authorization-attribute user-role level-15
line vty 0 4
	authentication-mode scheme
	user-role network-admin
	user-role network-operator 
  • 通过电脑的cmd可以telnet连接到这两个交换机

在这里插入图片描述

4. 验证

5. 参考文献——netmiko的使用

5.1 netmiko简单使用

5.2 netmiko复杂讲解

  • device_type
'device_type': 'huawei_serial',  # 指定设备类型,串口方式登陆,默认连接COM1,波特率9600
'device_type': 'huawei_telnet',  # 指定设备类型,该类型适用于huawei设备,telnet方式
'device_type': 'huawei',  # 该类型适用于huawei设备,ssh方式

5.3 使用netmiko后保存交换机配置

5.4 使用netmiko后的输出显示(目前没有该方面的困扰,程序能跑起来就很不错了😂)

6. 如用的参考文献

  • 好像学了点什么,但确实这次没用上

6.1 import paramiko

6.2 import telnetlib/telnetlib3

6.2.1 简单(import telnetlib)

6.2.2 复杂(import telnetlib3)

6.3 奇怪的python用法(如用,感觉用处不大)

7. 总结与展望

在这里插入图片描述

  • 41
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python 是一种高级编程语言,可以用于自动化任务,在配置 Cisco 交换机时也可以使用 Python批量配置。 首先,我们需要安装必要的 Python 模块,如 Paramiko 和 Netmiko,这些模块可以帮助我们建立 SSH 连接并发送命令。 接下来,我们需要编写 Python 脚本来批量配置 Cisco 交换机。可以将交换机的 IP 地址、用户名和密码等信息存储在一个文件中,然后使用 Python 读取这些信息并建立 SSH 连接。 在连接建立后,我们可以使用 Netmiko 提供的方法来发送配置命令。可以通过编写一个循环来遍历每个交换机配置信息,并在每个交换机上执行特定的命令来对其进行配置。例如,可以使用命令行模式下的 "config terminal" 进入交换机配置模式,然后发送一系列的命令来配置 VLAN、端口、IP 地址等设置。 脚本的最后一步是关闭 SSH 连接,并在操作完成后打印出执行结果。这样,我们就可以通过运行这个 Python 脚本来批量配置多个 Cisco 交换机了。 总的来说,Python 是一种功能强大的编程语言,可以方便地批量配置 Cisco 交换机。通过使用 Paramiko 和 Netmiko 这样的 Python 模块,我们可以实现 SSH 连接和命令发送。这种自动化的方法可以节省时间和精力,并确保交换机的一致性配置。 ### 回答2: Python是一种强大的编程语言,可以用于大规模自动化配置CISCO交换机使用Python编写一个脚本来批量配置CISCO交换机可以大大提高配置的效率和准确性。 首先,我们需要安装Python网络设备操作库,如Netmiko,Paramiko或NAPALM。它们使Python能够通过SSHTelnetCISCO交换机进行通信并执行命令。 接下来,我们可以通过读取一个文本文件来获取要配置CISCO交换机的IP地址、用户名和密码等信息。例如,我们可以将这些信息存储在一个名为"devices.txt"的文本文件中,每行一个设备,包括设备IP地址、用户名和密码。 在脚本中,我们可以使用循环来迭代读取设备信息,并针对每个设备进行配置。 我们可以使用以下代码来连接CISCO交换机并执行配置命令: ``` from netmiko import ConnectHandler # 读取设备信息 with open('devices.txt', 'r') as file: devices = file.readlines() # 迭代配置每个设备 for device in devices: # 拆分设备信息 ip, username, password = device.strip().split(',') # 根据设备类型,创建设备字典 device_dict = { 'device_type': 'cisco_ios', 'ip': ip, 'username': username, 'password': password, } # 连接设备 connection = ConnectHandler(**device_dict) # 执行配置命令 connection.send_config_from_file('cisco_config.txt') # 保存配置更改 connection.save_config() # 断开连接 connection.disconnect() ``` 在上述代码中,我们使用`netmiko`库中的`ConnectHandler`类来连接CISCO交换机。我们首先读取设备信息,然后通过迭代每个设备来连接并执行配置命令。在这个例子中,我简单地从一个名为"cisco_config.txt"的文件中读取配置命令,你可以根据实际需求修改。 通过运行这个脚本,我们可以批量配置CISCO交换机,从而节省时间和精力,提高工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清梦daydream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值