当前位置: 首页 > article >正文

网络自动化02:基于xlsx传入设备信息与所需执行备份配置命令,使用netmiko自动化登录分发

这是这个系列第二篇
本文将仅简单介绍使用xlsx导入设备信息,并使用netmiko配置

目录

  • 环境
  • 设备信息表格式
  • 单线程
    • 代码
    • 解释
      • 代码逻辑分析
        • 函数解析
      • 逻辑调用图
      • 逻辑说明
  • 遇到的问题
  • 写在最后

环境

在这里插入图片描述
所有设备均能与我执行Python脚本的环境互通,同时均拥有独立的ip
所有设备已经配置好ssh,username python,password 123。同时已经全部测试ssh能顺利使用

设备信息表格式

以下表格格式,是九净老师文章中给出,请各位根据现网自行设计
文件名为inventory.xlsx

ipdevice_typeusernamepasswordtimeoutconn_timeoutbackup_cmd
192.168.100.11cisco_iospython12318020show current-configuration
192.168.100.12cisco_iospython12318020show current-configuration
192.168.100.13cisco_iospython12318020show current-configuration
192.168.100.14huaweipython12318020display current-configuration
192.168.100.15huaweipython12318020display current-configuration

单线程

代码

import pandas as pd
from netmiko import ConnectHandler


# 处理excel信息函数
def get_batch_backup_dev_infos(filename='inventory.xlsx'):
    '''
    读取Excel表格加载网络设备基本信息和其配置备份的命令,结果返回一个元组的列表
    :param filename: 表格名称,默认值是inventory.xlsx
    :return: [(<netmiko连接设备所需基本信息的字典>,<配置备份的命令>)]
    示例:
    [({'ip': '192.168.100.11',
       'device_type': 'cisco_ios',
       'username': 'python',
       'password': '123',
       'timeout': 180,
       'conn_timeout': 20},
       'show runn'),
    ]
    '''
    # 读取并将表格加载成字典的列表
    df = pd.read_excel(filename)
    items = df.to_dict(orient='records')
    # 构建返回的结果,dev_infos是一个元组的列表。
    dev_infos = []
    for i in items:
        # 取出配置备份的命令,并用del 将其从字典中删除,使字典仅有设备信息
        backup_cmd = i['backup_cmd']
        del i['backup_cmd']
        # 删除配置备份命令后的字典就是netmiko登录设备所需的信息
        dev = i
        # 构建列表,列表每个元素都是元组。
        #元组由两个部分组成,一部分是设备信息(字典),一部分是需要发送的命令(字符串)
        dev_infos.append((dev, backup_cmd))
    return dev_infos

# 登陆配置脚本
def network_device_backup(dev, cmd='display current-configuration'):
    """
    登录设备执行配置备份的命令,并将设备回显的配置写入一个<设备IP或者host>.txt的文件中,编码格式utf8
    :param dev: 设备的基础信息,类型字典,key与创建netmiko所需的参数对应
    :param cmd: 要执行的配置备份的命令,默认是华为的“display current-configuration”
    :return: None 不返回,只打印
    """
    with ConnectHandler(**dev) as conn:
    	# 假如需要提权
        conn.enable()
        output = conn.send_command(command_string=cmd)
        file_name = '{}.txt'.format(dev['host'])
        with open(file_name, mode='w', encoding='utf8') as f:
            f.write(output)
            print('{}执行备份成功'.format(dev['host']))

# 读取文件函数
def batch_backup(inventory_file='inventory.xlsx'):
	# 执行处理设备信息表的函数
    dev_infos = get_batch_backup_dev_infos(inventory_file)
    for dev_info in dev_infos:
    	# 取出设备信息
        dev = dev_info[0]
        # 取出命令
        cmd = dev_info[1]
        # 将上述两个变量作为参数传入执行netmiko的函数
        network_device_backup(dev, cmd)


if __name__ == '__main__':
    batch_backup()

解释

代码逻辑分析

该代码实现了一个批量备份网络设备配置的功能,主要包括读取设备信息、连接设备并执行配置备份命令、将结果写入文件。

函数解析
  1. get_batch_backup_dev_infos(filename='inventory.xlsx'):

    • 功能: 从Excel文件中读取网络设备的基本信息及其配置备份命令。
    • 参数:
      • filename: Excel文件名,默认是inventory.xlsx
    • 返回值: 返回一个元组列表,每个元组包含设备信息(字典)和对应的备份命令(字符串)。
    • 逻辑:
      • 使用pandas读取Excel文件,将其转换为字典列表。
      • 遍历字典,提取每个设备的备份命令并将其从字典中删除,最终将设备信息和命令组成元组,添加到结果列表中。
  2. network_device_backup(dev, cmd='display current-configuration'):

    • 功能: 连接网络设备并执行配置备份命令,结果写入以设备IP或host命名的文本文件中。
    • 参数:
      • dev: 设备信息字典。
      • cmd: 备份命令,默认是华为的display current-configuration
    • 逻辑:
      • 使用netmikoConnectHandler连接设备,执行命令并获取输出。
      • 将输出写入以设备名称命名的.txt文件,使用UTF-8编码。
  3. batch_backup(inventory_file='inventory.xlsx'):

    • 功能: 执行整个备份流程。
    • 参数:
      • inventory_file: 设备信息文件名。
    • 逻辑:
      • 调用get_batch_backup_dev_infos读取设备信息。
      • 遍历设备信息,调用network_device_backup进行配置备份。
  4. if __name__ == '__main__'::

    • 入口点,调用batch_backup()开始执行备份操作。

逻辑调用图

+------------------------------------------+
|              batch_backup()             |
|                                          |
|  +---------------------------+           |
|  | get_batch_backup_dev_infos|           |
|  | (inventory_file)         |           |
|  +---------------------------+           |
|                  |                          |
|                  v                          |
|        +------------------+                 |
|        | dev_infos: list  |                 |
|        +------------------+                 |
|                  |                          |
|                  v                          |
|           +-------------------+             |
|           | for dev_info in   |             |
|           | dev_infos:        |             |
|           +-------------------+             |
|                  |                          |
|                  v                          |
|          +--------------------+             |
|          | network_device_backup|            |
|          | (dev, cmd)         |             |
|          +--------------------+             |
|                  |                          |
|                  v                          |
|       +--------------------------+           |
|       | ConnectHandler(**dev)   |           |
|       +--------------------------+           |
|                  |                          |
|                  v                          |
|         +---------------------+              |
|         | conn.send_command(cmd)|             |
|         +---------------------+              |
|                  |                          |
|                  v                          |
|        +-----------------------+             |
|        | write output to file  |            |
|        +-----------------------+             |
|                                          |
+------------------------------------------+

逻辑说明

  1. batch_backup() 函数是整个程序的入口,负责调用设备信息获取和备份功能。
  2. get_batch_backup_dev_infos() 中,程序读取Excel文件并解析成设备信息和备份命令的元组列表。
  3. 通过循环遍历每个设备的信息,调用 network_device_backup(),连接设备并执行备份命令。
  4. 备份结果被保存到本地文件,确保每个设备的配置能够被有效备份和记录。

遇到的问题

  1. pandas读入数据默认数据类型

pandas从表格中读入信息时,如果这个单元格内是纯数字,pandas会为这个字典中k/v的v赋值为int类型
但ConnectHandler类中,对password、username、ip等参数的要求都是string。如果不指定数据类型或修改数据类型的话,就会报错。

可以通过这个方式解决:

# 指定某一列的数据类型为string
df = pd.read_excel(filename, sheet_name='Sheet1',dtype={'password': str})
  1. session_log不可用
    网络自动化01那篇文章中,我有提到过设备信息中有一个参数是session_log,可以用来记录这次ConnectHandler类所创建的对象通过ssh隧道执行的所有操作的内容,并打印到session_log指定的文件中
    但在这篇文章使用的设备信息表xlsx,如果添加了session_log就会报错。
    我最终没有解决,所以我在表格中去除了这个字段。

写在最后

这是第二篇,写的比较简单,但在真实测试这个脚本时,就遇到了两个问题。
所以实践出真知,请大家务必多实践。


http://www.kler.cn/a/373403.html

相关文章:

  • Java调用chatgpt
  • 微信公众号(或微信浏览器)获取openId(网页授权)
  • 【隐私计算篇】全同态加密应用场景案例(隐私云计算中的大模型推理、生物识别等)
  • vscode的一些使用心得
  • OpenCV视觉分析之目标跟踪(6)轻量级目标跟踪器类TrackerNano的使用
  • vue3+less使用主题定制(多主题定制)可切换主题
  • Oracle SQL 使用 ROWNUM 分页查询速度太慢的问题及解决方案!
  • apisix高性能网关实现一机一密
  • Java 文件操作详解
  • 双向链表(数据结构与算法)
  • 用for循环实现计算1+1/2!+1/3!+...的前20项之和
  • 初级python代码编程学习----简单的查看当前ip地址的图形化工具
  • Vision-Language Models for Vision Tasks: A Survey阅读笔记
  • linux的用户账号与权限管理
  • Chromium HTML Input 类型password 对应c++
  • Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (二)
  • 租房业务全流程管理:Spring Boot系统应用
  • java项目之高校学科竞赛平台源码(springboot)
  • [mysql]多行子查询(只包含不相关子查询案例)
  • WGCLOUD如何部署在ARM平台
  • MacOS下载安装Logisim(图文教程)
  • Java 使用 aspose-cells 转 Excel 为 PDF 丢失表格线,列过多分页,单元格内容显示不全问题
  • C#二分查找算法
  • 实时特征框架的生产实践|得物技术
  • 【华为HCIP实战课程二十七】中间到中间系统协议IS-IS Hello报文,网络工程师
  • 【rabbitmq】绑定死信队列示例