Python批量备份华为设备配置到FTP服务器

ops/2024/10/18 5:48:27/

Excel表格存放交换机信息:

备份文件夹效果图:

Windows系统配置计划任务定时执行python脚本:

Program/script:C:\Python\python.exe

Add arguments (optional):      D:\Python_PycharmProjects\JunLan_pythonProject1\Python_CodeFile\netmiko\Batch_backup_Huawei_switch_configuration_to_FTP.py

完整Python代码:

python">'''
该代码用于批量备份网络设备配置。通过读取Excel表格中的设备IP地址和登录凭据,使用netmiko库连接设备并备份配置。
具体实现方法包括:读取Excel表格中的设备IP地址和登录凭据;使用netmiko库连接设备;使用send_command_timing()方法下发交换机命令获,将获取的配置上传到FTP服务器。
注意事项:1、FTP服务器的IP地址、用户名和密码需要提前配置好;2、ftp命令中的文件名不能包含空格或其他特殊字符。3、ftp命令中的文件名不能超出64个文字。
'''from netmiko import ConnectHandler, NetmikoTimeoutException, NetmikoAuthenticationException
from openpyxl import load_workbook
from rich.progress import track
from datetime import datetime
import socket, osdef read_excel_data():  # 设定一个函数来读取Excel数据file_path = r'D:\Network_Backup\IT_assets.xlsx'  # 在函数内部定义Excel文件路径workbook = load_workbook(filename=file_path)  #  加载Excel文件sheet = workbook["Huawei"]  # 指定名为"Huawei"的工作表# 获取各列数据ips = [cell.value for cell in sheet['C'][1:]]   # 获取IP地址列数据,从第二行开始names = [cell.value for cell in sheet['D'][1:]]  # 获取设备名称列数据username_col = [cell.value for cell in sheet['E'][1:]]  # 获取用户名列数据password_col = [cell.value for cell in sheet['F'][1:]]  # 获取密码列数据return ips, names, username_col, password_col   #  返回获取到的数据def ssh_connection():ips, names, username_col, password_col = read_excel_data()  #  调用(执行)函数读取Excel数据,赋予变量,这里使用相同的变量名num_switches = min(len(ips), len(names), len(username_col), len(password_col))  # 获取交换机数量,确定循环次数,以较短的数据范围为准ftp_host = '10.1.74.23'  # FTP 服务器的 IP 地址ftp_username = 'ftpbackup'  # FTP 服务器的用户名ftp_password = 'qbk>c]0a'  # FTP 服务器的密码success_count = 0  #  初始化成功计数器failure_count = 0  #  初始化失败计数器backup_dir = os.path.join(r'D:\Network_Backup', f"{datetime.now().strftime('%Y%m%d')}") #  创建备份目录,以当前日期命名log_file_path = os.path.join(backup_dir, "Huawei_backup_summary.log")  #  创建日志文件,保存连接错误信息output_data_file = os.path.join(backup_dir, "Huawei_output_data.txt")  # 创建输出数据文件,即回显内容保存的文件if not os.path.exists(backup_dir):  #  判断是否存在该文件夹os.makedirs(backup_dir)         # 不存在则创建文件夹new_folder_name = os.path.basename(backup_dir)  # 获取新创建的文件夹名称# print(f"New folder created: {new_folder_name}")with open(log_file_path, 'a') as log_file:  # 使用 'a' 模式以追加方式打开日志文件with open(output_data_file, 'a') as data_file:  #  使用 'a' 模式以追加方式打开数据文件,即用来保存回显内容for i in track(range(num_switches), description="Running..."):   # 遍历交换机,使用 track 函数显示进度条try:ip = ips[i]          #  获取 IP 地址name = names[i]      # 获取交换机名称username = username_col[i]    # 获取当前索引i对应的用户名信息password = password_col[i]    # 获取当前索引i对应的密码信息now = datetime.now()        # 获取当前日期和时间now_time = now.strftime("%Y%m%d_%H%M%S")  # 格式化为年月日_时分秒new_name_huawei = f"{name.replace(' ', '')}_{ip}_{now_time}_vrpcfg.zip"  # 使用交换机名称、IP地址和当前时间生成新的文件名,其中name.replace将有空格的字符串替换为空字符串。put = 'put vrpcfg.zip ' + new_name_huaweidevice = { 'device_type': 'huawei_ssh', # 指定连接的类型'ip': ip,   # 从excel文件中获取IP地址'username': username,  # 从excel文件中获取用户名'password': password,  # 从excel文件中获取用户名'conn_timeout': 20,   # 连接超时时间默认为10秒,大多数情况下 15 秒足以应对网络传输中的大多数问题。}with ConnectHandler(**device) as net_connect:  #  连接交换机output = net_connect.send_command_timing('save ')  # 保存配置output += net_connect.send_command_timing('y')     # 确认保存配置output += net_connect.send_command_timing(f'ftp {ftp_host}')  # 在交换机上执行连接 FTP 命令output += net_connect.send_command_timing(ftp_username)       # 输入FTP服务器用户名output += net_connect.send_command_timing(ftp_password)       # 输入FTP服务器密码output += net_connect.send_command_timing(f'cd {new_folder_name}')   # 切换到新创建的文件夹output += net_connect.send_command_timing(put)  # 执行 put 命令保存配置文件到 FTP 服务器,命令格式:put 本地(交换机)文件名 远程文件名output_data = f"Device {ip} ({name}):\n{output}\n"  # 将执行输出的内容转换为字符串,赋予给变量# print(output_data)if "226 Successfully transferred" in output_data:  # 判断配置文件是否成功传输到FTP服务器success_count += 1  # 统计成功计数器加1print(f"File transfer successful for device {ip} {name}")else:failure_count += 1print(f"File transfer failed for device {ip} {name}")log_file.write("File transfer failed for device {ip} {name}")data_file.write(put + "\n\n" + output_data + "\n" + "-" * 200 + "\n")  # 将执行输出的内容写入到文件中except Exception as e:        # 捕获 NetmikoTimeoutException 异常,该异常通常在尝试连接设备超时时抛出error_message = f"An error occurred while processing Device {ip} ({name}): {str(e)}\n"# print(error_message, end="")   # 不希望打印错误可注释log_file.write(error_message + "\n" + "-" * 200 + "\n")  # 将错误信息追加写入到日志文件中failure_count += 1  # 当捕获到异常时,增加失败计数except NetmikoTimeoutException as timeout_e:            # 当与网络设备建立SSH连接时,如果超过预设的超时时间仍未成功,则会捕获此异常并打印相关错误信息。error_message = f"Timeout occurred while connecting to Device {ip} ({name}): {str(timeout_e)}"log_file.write(error_message + "\n" + "-" * 200 + "\n")  # 将错误信息追加写入到日志文件中failure_count += 1  # 当捕获到异常时,增加失败计数except NetmikoAuthenticationException as auth_e:            # 当提供的用户名或密码无法通过网络设备的验证时,将捕获此异常并输出认证失败的具体信息。error_message = f"Authentication failed for Device {ip} ({name}): {str(auth_e)}"log_file.write(error_message + "\n" + "-" * 200 + "\n")  # 将错误信息追加写入到日志文件中failure_count += 1  # 当捕获到异常时,增加失败计数except socket.timeout as sock_timeout:            # 这是在底层网络通信过程中遇到超时时抛出的异常,在进行网络连接时(例如:TCP连接阶段),如果等待响应的时间超过了设置的超时值,那么就会触发此异常,并打印相应的超时信息。error_message = "Socket timeout occurred while connecting to Device {ip} ({name})."log_file.write(error_message + "\n" + "-" * 200 + "\n")  #  将错误信息追加写入到日志文件中failure_count += 1  # 当捕获到异常时,增加失败计数except KeyboardInterrupt:  # 捕获用户手动中断(如按 Ctrl+C)print("\nProgram interrupted by user.")breaksummary_message = "\nSummary:\nSuccessfully processed {} devices.\n{} devices failed to be processed.\n".format(success_count, failure_count)log_file.write(summary_message + "\n" + "-" * 200 + "\n")  # 将成功和失败的数量写入到日志文件中# print(summary_message) #  打印成功和失败的数量if __name__ == "__main__":ssh_connection()  # 调用(执行)函数进行 SSH 连接和配置文件下载# print(num_switches)


http://www.ppmy.cn/ops/39233.html

相关文章

源码拾贝三则

目录 一 一种枚举类型的新型使用方式 二 Eigen库中的LDLT分解 三 Eigen中的访问者模式 一 一种枚举类型的新型使用方式 ///D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xiosbase enum _Iostate { // consta…

Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)

1 漏洞描述 CVE-2020-1938 是 Apache Tomcat 中的一个严重安全漏洞,该漏洞涉及到 Tomcat 的 AJP(Apache JServ Protocol)连接器。由于 AJP 协议在处理请求时存在缺陷,攻击者可以利用此漏洞读取服务器上的任意文件,甚至…

Java自定义注解:从定义到解析,再到AOP切面与日志打印应用

目录 一、注解定义二、注解解析三、自定义注解结合AOP切面四、自定义注解用于日志打印五、区别总结六、应用场景总结 在Java开发中,注解是一种强大的元编程工具,它可以帮助我们提升代码的可读性和功能性。本文将深入探讨如何创建和使用自定义注解&#x…

vue3中实现内容溢出隐藏以及显示提示属性

使用:show-overflow-tooltip"true" <el-table :data"serviceList" style"width: 100%"><el-table-column align"center" label"序号" prop"index" width"80" fixed /><el-table-column …

recycleview和banner新闻列表轮播图

说明&#xff1a;最近碰到一个需求&#xff0c;弄一个新闻列表和轮播图&#xff0c;在首页显示&#xff0c;并且需要json解析&#xff0c;图片下载&#xff0c;轮播图和新闻列表一起滑动 ui效果图&#xff1a; 文件说明&#xff1a; step1:引用依赖包 图片下载 json解析 轮播…

TypeError: __init__() got an unexpected keyword argument ‘logger‘

TypeError: __init__() got an unexpected keyword argument logger 执行python程序报错&#xff0c;博主出现这个问题最后解决办法是通过升级python到最新版3.12解决的。记住安装python时&#xff0c;要让它帮你配置好环境变量&#xff0c;如果默认不配置的话&#xff0c;还是…

掌握Ansible命令——提高自动化运维效率

目录 一、Ansible命令 1.定义 2.组成 3.命令格式 4.选项 5.示例 二、常用命令解释 1.ansible-doc 2.ansible-galaxy 3.ansible-playbook 4.ansible-pull 5.ansible-vault 三、高频使用的命令 1.Ping主机 2.执行命令 3.安装软件包 4.管理文件 5.管理服务 6.获…

使用sqlmodel实现唯一性校验

代码&#xff1a; from sqlmodel import Field, Session, SQLModel, create_engine# 声明模型 class User(SQLModel, tableTrue):id: int | None Field(defaultNone, primary_keyTrue)# 不能为空&#xff0c;必须唯一name: str Field(nullableFalse, uniqueTrue)age: int | …