From 019c009700840a90785911306df7b5bb9b3749a7 Mon Sep 17 00:00:00 2001 From: panjunlan Date: Sun, 22 Feb 2026 10:00:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8=E5=88=9B?= =?UTF-8?q?=E5=BB=BAlogs=E5=92=8Coutput=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++----- config/config.yaml | 6 +++--- config/settings.py | 21 +++++++++------------ utils/logger.py | 19 ++++++------------- 4 files changed, 22 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index ae6a7bc..744b0d6 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,9 @@ Vmware 虚拟机自动化程序:自动化导出虚拟机和快照信息,自 - [x] 最后删除 15 天前的 snapshot,并同时记录删除的 snapshot 日志信息 - [x] 设置计划任务,每周六(或 每15 天)执行一次 - [ ] 增加排除不能删除的 snapshots 信息,用红色底填充标识 -- [ ] Outlook 邮箱发送统计超过 15 天的 snapshots 信息(即要删除的快照列表) -- [ ] 需要控制每台 vCenter 不可以同时删除超过 4 个快照 -- [ ] 删除前后发送邮件通知 -- [ ] 多线程删除 +- [ ] 删除快照前/后发送邮件通知 +- [ ] 多线程删除(控制每台 vCenter 不可以同时删除超过 4 个快照) +- [ ] 使用数据库保存管理节点账号密码(加密) @@ -446,7 +445,7 @@ WORKDIR /removeweeklysnapshot/ # 复制代码 COPY ./ /removeweeklysnapshot/ # 安装必要的软件和 python 库 -RUN apt-get update && apt-get install procps tzdata -y && pip install -r requirements.txt && chmod +x /removeweeklysnapshot/main.py && mkdir output +RUN apt-get update && apt-get install procps tzdata -y && pip install -r requirements.txt && chmod +x /removeweeklysnapshot/main.py # 容器内执行启动程序 CMD ["python3", "/removeweeklysnapshot/main.py"] EOF diff --git a/config/config.yaml b/config/config.yaml index 2fb7592..9d57d1c 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -25,8 +25,8 @@ management_nodes: # 全局策略配置 global: - disable_ssl_verify: true + disable_ssl_verify: true # ESXi连接特殊配置(禁用SSL验证,ESXi默认自签证书) snapshot_retention_days: 15 # 可选,默认值 15 天 # excel_output_path: ./vm_snapshots_report.xlsx # 可选,使用默认值,如:/logs/2026-02-20_14-00-21-VMsSnapShots_report.xlsx -# 'excel_output_path',: ./vm_snapshots_report.xlsx # 可选,使用默认值,如:/logs/2026-02-20_14-00-21-VMsSnapShots_report.xlsx -# ESXi连接特殊配置(禁用SSL验证,ESXi默认自签证书) +# yaml_output_path: ./yaml_snapshots_report.yaml # 可选 + diff --git a/config/settings.py b/config/settings.py index 0f62c2f..e81c9e0 100644 --- a/config/settings.py +++ b/config/settings.py @@ -1,4 +1,4 @@ -import yaml, os +import os, yaml from datetime import datetime from utils.logger import logger @@ -15,10 +15,8 @@ def load_config(): # vCenter/ESXi节点列表 "MANAGEMENT_NODES": raw_config.get('management_nodes', []), "SNAPSHOT_RETENTION_DAYS": int(global_config.get('snapshot_retention_days', 15)), - # "EXCEL_OUTPUT_PATH": global_config.get('excel_output_path', f'/logs/{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}-VMsSnapShots_report.xlsx'), - # "LOG_FILE_PATH": global_config.get('log_file_path', f'/logs/{datetime.now().strftime('%Y%m%d_%H%M%S')}-VMsSnapShots_cleanup.logs'), "EXCEL_OUTPUT_PATH": global_config.get('excel_output_path', f'/logs/{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}-VMsSnapShots_report.xlsx'), - "EXCEL_OUTPUT_PATH": global_config.get('excel_output_path', f'D:\\PycharmProjects\\RemoveWeeklySnapshot\\output\\vm_snapshots_report-{datetime.now().strftime('%Y-%m-%d')}.xlsx'), - "YAML_OUTPUT_PATH": global_config.get('yaml_output_path', f'D:\\PycharmProjects\\RemoveWeeklySnapshot\\output\\old_snapshots-{datetime.now().strftime('%Y-%m-%d')}.yaml'), + "EXCEL_OUTPUT_PATH": global_config.get('excel_output_path', os.path.join(DATA_DIR, f'vm_snapshots_report-{datetime.now().strftime('%Y-%m-%d')}.xlsx')), + "YAML_OUTPUT_PATH": global_config.get('yaml_output_path', os.path.join(DATA_DIR, f'old_snapshots-{datetime.now().strftime('%Y-%m-%d')}.yaml')), "DISABLE_SSL_VERIFY": global_config.get('disable_ssl_verify', True), } @@ -42,6 +40,11 @@ def load_config(): logger.error(f"❌ 加载配置失败: {str(e)}") raise + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取项目根目录 +DATA_DIR = os.path.join(BASE_DIR, 'output') # 获取导出数据的文件根目录 +os.makedirs(DATA_DIR, exist_ok=True) # 自动创建目录 + # 配置文件路径 CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'config.yaml') # 加载配置并导出全局变量 @@ -50,7 +53,6 @@ MANAGEMENT_NODES = config["MANAGEMENT_NODES"] SNAPSHOT_RETENTION_DAYS = config["SNAPSHOT_RETENTION_DAYS"] EXCEL_OUTPUT_PATH = config["EXCEL_OUTPUT_PATH"] YAML_OUTPUT_PATH = config["YAML_OUTPUT_PATH"] -#LOG_FILE_PATH = config["LOG_FILE_PATH"] DISABLE_SSL_VERIFY = config["DISABLE_SSL_VERIFY"] @@ -59,8 +61,6 @@ if __name__ == "__main__": print("\n【全局配置】") print(f" 快照保留天数: {config['SNAPSHOT_RETENTION_DAYS']}") print(f" Excel输出路径: {EXCEL_OUTPUT_PATH}") - #print(f" 日志文件路径: {LOG_FILE_PATH}") - print(f" 禁用SSL验证: {config['DISABLE_SSL_VERIFY']}") # 打印管理节点 nodes = config['MANAGEMENT_NODES'] @@ -68,10 +68,7 @@ if __name__ == "__main__": for i, node in enumerate(nodes, 1): print(f"\n 节点[{i}]:") - print(f" 类型: {node.get('type')}") - print(f" 名称: {node.get('name')}") print(f" 地址: {node.get('host')}") print(f" 用户: {node.get('user')}") print(f" 密码: {'*' * len(node.get('password', ''))}") - # print(f" 密码: {node.get('password', '')}") # 直接打印出密码 - print(f" 最大并发删除: {node.get('max_delete_concurrent')}") \ No newline at end of file + # print(f" 密码: {node.get('password', '')}") # 直接打印出密码 \ No newline at end of file diff --git a/utils/logger.py b/utils/logger.py index 55e1349..0074c6e 100644 --- a/utils/logger.py +++ b/utils/logger.py @@ -1,9 +1,4 @@ -import os, logging -from datetime import datetime - -# 获取项目根目录(假设 logger.py 在 utils/ 目录下) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -LOG_DIR = os.path.join(BASE_DIR, 'logs') +import os, datetime, logging def get_logger(): @@ -19,13 +14,11 @@ def get_logger(): # 定义日志格式 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') - # 自动创建日志目录 - os.makedirs(LOG_DIR, exist_ok=True) - # 日志文件路径 - log_file = os.path.join( - LOG_DIR, - f'{datetime.now().strftime("%Y-%m-%d")}-vm_snapshot_cleanup.log' - ) + BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取项目根目录 + LOG_DIR = os.path.join(BASE_DIR, 'logs') # 获取日志文件根目录 + os.makedirs(LOG_DIR, exist_ok=True) # 自动创建目录 + + log_file = os.path.join(LOG_DIR, f'{datetime.now().strftime("%Y-%m-%d")}-removeweeklysnapshot.log') # 日志文件路径 # 文件处理器(写入日志文件) file_handler = logging.FileHandler(log_file, encoding='utf-8')