使用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复杂讲解

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. 总结与展望

相关推荐
maosheng11463 小时前
RHCSA的第一次作业
linux·运维·服务器
猿界零零七3 小时前
pip install mxnet 报错解决方案
python·pip·mxnet
旺仔.2914 小时前
Linux 信号详解
linux·运维·网络
Hoshino.414 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
不只会拍照的程序猿5 小时前
《嵌入式AI筑基笔记02:Python数据类型01,从C的“硬核”到Python的“包容”》
人工智能·笔记·python
恒创科技HK5 小时前
通用型云服务器与计算型云服务器:您真正需要哪些配置?
运维·服务器
Jay_Franklin5 小时前
Quarto与Python集成使用
开发语言·python·markdown
吴佳浩 Alben6 小时前
GPU 生产环境实践:硬件拓扑、显存管理与完整运维体系
运维·人工智能·pytorch·语言模型·transformer·vllm
Oueii6 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
播播资源6 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos