这是这个系列第二篇
本文将仅简单介绍使用xlsx导入设备信息,并使用netmiko配置
目录
- 环境
- 设备信息表格式
- 单线程
- 代码
- 解释
- 代码逻辑分析
- 函数解析
 
- 逻辑调用图
- 逻辑说明
 
 
- 遇到的问题
- 写在最后
环境

 所有设备均能与我执行Python脚本的环境互通,同时均拥有独立的ip
 所有设备已经配置好ssh,username python,password 123。同时已经全部测试ssh能顺利使用
设备信息表格式
以下表格格式,是九净老师文章中给出,请各位根据现网自行设计
文件名为inventory.xlsx
| ip | device_type | username | password | timeout | conn_timeout | backup_cmd | 
|---|---|---|---|---|---|---|
| 192.168.100.11 | cisco_ios | python | 123 | 180 | 20 | show current-configuration | 
| 192.168.100.12 | cisco_ios | python | 123 | 180 | 20 | show current-configuration | 
| 192.168.100.13 | cisco_ios | python | 123 | 180 | 20 | show current-configuration | 
| 192.168.100.14 | huawei | python | 123 | 180 | 20 | display current-configuration | 
| 192.168.100.15 | huawei | python | 123 | 180 | 20 | display 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()
解释
代码逻辑分析
该代码实现了一个批量备份网络设备配置的功能,主要包括读取设备信息、连接设备并执行配置备份命令、将结果写入文件。
函数解析
-  get_batch_backup_dev_infos(filename='inventory.xlsx'):- 功能: 从Excel文件中读取网络设备的基本信息及其配置备份命令。
- 参数: - filename: Excel文件名,默认是- inventory.xlsx。
 
- 返回值: 返回一个元组列表,每个元组包含设备信息(字典)和对应的备份命令(字符串)。
- 逻辑: - 使用pandas读取Excel文件,将其转换为字典列表。
- 遍历字典,提取每个设备的备份命令并将其从字典中删除,最终将设备信息和命令组成元组,添加到结果列表中。
 
- 使用
 
-  network_device_backup(dev, cmd='display current-configuration'):- 功能: 连接网络设备并执行配置备份命令,结果写入以设备IP或host命名的文本文件中。
- 参数: - dev: 设备信息字典。
- cmd: 备份命令,默认是华为的- display current-configuration。
 
- 逻辑: - 使用netmiko的ConnectHandler连接设备,执行命令并获取输出。
- 将输出写入以设备名称命名的.txt文件,使用UTF-8编码。
 
- 使用
 
-  batch_backup(inventory_file='inventory.xlsx'):- 功能: 执行整个备份流程。
- 参数: - inventory_file: 设备信息文件名。
 
- 逻辑: - 调用get_batch_backup_dev_infos读取设备信息。
- 遍历设备信息,调用network_device_backup进行配置备份。
 
- 调用
 
-  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  |            |
|        +-----------------------+             |
|                                          |
+------------------------------------------+
逻辑说明
- batch_backup()函数是整个程序的入口,负责调用设备信息获取和备份功能。
- 在 get_batch_backup_dev_infos()中,程序读取Excel文件并解析成设备信息和备份命令的元组列表。
- 通过循环遍历每个设备的信息,调用 network_device_backup(),连接设备并执行备份命令。
- 备份结果被保存到本地文件,确保每个设备的配置能够被有效备份和记录。
遇到的问题
- pandas读入数据默认数据类型
pandas从表格中读入信息时,如果这个单元格内是纯数字,pandas会为这个字典中k/v的v赋值为int类型
 但ConnectHandler类中,对password、username、ip等参数的要求都是string。如果不指定数据类型或修改数据类型的话,就会报错。
可以通过这个方式解决:
# 指定某一列的数据类型为string
df = pd.read_excel(filename, sheet_name='Sheet1',dtype={'password': str})
- session_log不可用
 在网络自动化01那篇文章中,我有提到过设备信息中有一个参数是session_log,可以用来记录这次ConnectHandler类所创建的对象通过ssh隧道执行的所有操作的内容,并打印到session_log指定的文件中
 但在这篇文章使用的设备信息表xlsx,如果添加了session_log就会报错。
 我最终没有解决,所以我在表格中去除了这个字段。
写在最后
这是第二篇,写的比较简单,但在真实测试这个脚本时,就遇到了两个问题。
 所以实践出真知,请大家务必多实践。