当前位置:首页>python>用ChatGPT帮你写Python自动化运维脚本(完整演示)

用ChatGPT帮你写Python自动化运维脚本(完整演示)

  • 2026-10-11 08:19:41
用ChatGPT帮你写Python自动化运维脚本(完整演示)

用ChatGPT帮你写Python自动化运维脚本(完整演示)

作为一名运维工程师,你是否还在手动登录服务器、一条条执行命令?是否还在深夜对着报错信息发呆?是时候让AI替你干活了!


前言:AI + 运维 = 效率革命

2025年之后,越来越多的运维工程师开始把ChatGPT当作自己的"编程助手"。它不仅能写代码,还能帮你调试、优化、加注释、写文档。

今天我用完整的实战演示,带你看清楚:怎么用ChatGPT一步步生成可用的Python运维脚本。

全文涵盖4个真实运维场景:

  1. 批量检测服务器存活状态
  2. 自动清理日志文件
  3. 磁盘使用率预警
  4. 定时备份配置文件

每个场景都有:提示词 → ChatGPT输出 → 实际代码 → 运行效果,学完即用!


第一步:学会写对"提示词"

很多人用ChatGPT写脚本,写出来的代码要么太简单,要么根本跑不了。问题不在AI,在于你没说清楚需求。

一个好的运维脚本提示词,需要包含以下要素:

【角色】你是一名有10年经验的Linux运维工程师【任务】帮我写一个Python脚本,实现:[具体功能]【环境】Python 3.x,运行在CentOS 7上【要求】  - 加上详细注释  - 有异常处理  - 输出结果带时间戳  - 代码风格符合PEP8规范

记住这个模板,后面每个场景都用它!


场景一:批量检测服务器存活状态

我的提示词

你是一名有10年经验的Linux运维工程师。帮我写一个Python脚本,功能是:批量ping一组IP地址,判断哪些服务器在线、哪些离线,结果输出到控制台并保存到check_result.txt文件中。要求:- 支持从servers.txt文件中读取IP列表(每行一个IP)- 使用多线程,提高检测速度- 输出格式:[时间戳] IP地址 - 在线/离线- 有异常处理- 代码注释详细

ChatGPT生成的脚本

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""批量服务器存活检测脚本功能:从文件读取IP列表,多线程ping检测,结果输出到文件作者:ChatGPT生成 / 运维优化"""import osimport subprocessimport threadingfrom datetime import datetime# 结果存储列表(线程安全需加锁)results = []lock = threading.Lock()defping_host(ip):"""    ping单个IP地址,判断是否在线    :param ip: 目标IP地址    """try:# Windows用-n,Linux/Mac用-c        param = "-n"if os.name == "nt"else"-c"        command = ["ping", param, "1", "-W", "1", ip]# subprocess.run执行命令,capture_output捕获输出        result = subprocess.run(            command,            capture_output=True,            text=True,            timeout=3        )        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")if result.returncode == 0:            status = "✅ 在线"else:            status = "❌ 离线"        line = f"[{timestamp}] {ip} - {status}"# 加锁,防止多线程写入冲突with lock:            results.append(line)            print(line)except subprocess.TimeoutExpired:        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")        line = f"[{timestamp}] {ip} - ⚠️ 超时"with lock:            results.append(line)            print(line)except Exception as e:        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")        line = f"[{timestamp}] {ip} - ❌ 错误: {e}"with lock:            results.append(line)            print(line)defmain():"""主函数:读取IP列表,创建线程池并发检测"""# 从文件读取IP列表try:with open("servers.txt", "r", encoding="utf-8") as f:            ip_list = [line.strip() for line in f if line.strip()]except FileNotFoundError:        print("❌ 错误:servers.txt 文件不存在!")return    print(f"📋 共读取到 {len(ip_list)} 个IP,开始检测...\n")# 创建线程列表    threads = []for ip in ip_list:        t = threading.Thread(target=ping_host, args=(ip,))        threads.append(t)        t.start()# 等待所有线程完成for t in threads:        t.join()# 将结果写入文件with open("check_result.txt", "w", encoding="utf-8") as f:        f.write("\n".join(results))    print(f"\n✅ 检测完成!结果已保存到 check_result.txt")if __name__ == "__main__":    main()

使用方法

  1. 创建 servers.txt,每行写一个IP:
192.168.1.1192.168.1.2192.168.1.1008.8.8.8
  1. 运行脚本:python check_server.py

  2. 查看结果文件 check_result.txt


场景二:自动清理过期日志文件

日志积累是运维的老大难。手动删?容易误删。定时任务?写起来麻烦。用ChatGPT写一个带保护机制的清理脚本!

我的提示词

帮我写一个Python脚本,自动清理/var/log目录下超过7天的.log文件。要求:- 删除前先打印要删除的文件列表,让用户确认- 支持"试运行"模式(dry-run),只显示不删除- 记录操作日志到cleanup.log- 异常处理完善

ChatGPT生成的脚本

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""日志文件自动清理脚本功能:清理指定目录下超过N天的.log文件,支持试运行模式"""import osimport timeimport loggingfrom datetime import datetime, timedeltafrom pathlib import Path# 配置参数(可修改)LOG_DIR = "/var/log"# 要清理的目录DAYS_TO_KEEP = 7# 保留天数DRY_RUN = True# True=试运行模式(不实际删除)OPERATION_LOG = "cleanup.log"# 操作记录文件# 配置日志记录logging.basicConfig(    filename=OPERATION_LOG,    level=logging.INFO,    format="%(asctime)s - %(levelname)s - %(message)s",    datefmt="%Y-%m-%d %H:%M:%S")defget_expired_logs(directory, days):"""    获取超过指定天数的.log文件列表    :param directory: 目标目录    :param days: 保留天数    :return: 过期文件列表(Path对象)    """    expired_files = []    cutoff_time = time.time() - days * 86400# 86400秒 = 1天try:        log_path = Path(directory)# 递归查找所有.log文件for log_file in log_path.rglob("*.log"):if log_file.is_file():# 获取文件最后修改时间                file_mtime = log_file.stat().st_mtimeif file_mtime < cutoff_time:                    expired_files.append(log_file)except PermissionError as e:        print(f"⚠️ 权限不足,无法访问部分目录:{e}")        logging.warning(f"权限不足:{e}")except Exception as e:        print(f"❌ 扫描目录时出错:{e}")        logging.error(f"扫描错误:{e}")return expired_filesdefclean_logs(expired_files, dry_run=True):"""    清理过期日志文件    :param expired_files: 要清理的文件列表    :param dry_run: 是否为试运行模式    """ifnot expired_files:        print("✅ 没有找到需要清理的日志文件!")return# 计算总大小    total_size = sum(f.stat().st_size for f in expired_files)    total_mb = total_size / 1024 / 1024    print(f"\n📋 发现 {len(expired_files)} 个过期日志文件,共占 {total_mb:.2f} MB:")    print("-" * 60)for f in expired_files:        size_kb = f.stat().st_size / 1024        mtime = datetime.fromtimestamp(f.stat().st_mtime).strftime("%Y-%m-%d %H:%M")        print(f"  {f}  [{size_kb:.1f} KB, 修改时间: {mtime}]")    print("-" * 60)if dry_run:        print(f"\n🔍 [试运行模式] 以上文件将被删除(实际未删除)")        print("💡 将 DRY_RUN = False 后重新运行,即可执行实际删除")        logging.info(f"试运行:发现 {len(expired_files)} 个过期文件,共 {total_mb:.2f} MB")return# 实际删除前再次确认    confirm = input(f"\n⚠️ 确认删除以上 {len(expired_files)} 个文件?(输入 yes 确认): ")if confirm.lower() != "yes":        print("❌ 已取消删除操作")return# 执行删除    deleted_count = 0    failed_count = 0for f in expired_files:try:            f.unlink()  # 删除文件            print(f"  ✅ 已删除:{f}")            logging.info(f"已删除:{f}")            deleted_count += 1except Exception as e:            print(f"  ❌ 删除失败:{f} - {e}")            logging.error(f"删除失败:{f} - {e}")            failed_count += 1    print(f"\n✅ 完成!成功删除 {deleted_count} 个文件,失败 {failed_count} 个")    logging.info(f"清理完成:成功 {deleted_count},失败 {failed_count}")defmain():    print(f"🧹 日志清理脚本启动")    print(f"📂 目标目录:{LOG_DIR}")    print(f"📅 保留最近 {DAYS_TO_KEEP} 天的日志")    print(f"🔍 运行模式:{'试运行(不删除)'if DRY_RUN else'实际删除'}\n")    logging.info(f"脚本启动 - 目录:{LOG_DIR}, 保留天数:{DAYS_TO_KEEP}, 试运行:{DRY_RUN}")# 获取过期文件列表    expired_files = get_expired_logs(LOG_DIR, DAYS_TO_KEEP)# 执行清理    clean_logs(expired_files, DRY_RUN)if __name__ == "__main__":    main()

场景三:磁盘使用率预警

磁盘快满了没人知道,直到系统崩了才发现——这种事运维人都经历过。来一个自动预警脚本,磁盘超80%自动发警报!

提示词

帮我写一个Python脚本,监控Linux服务器所有磁盘分区的使用率,当使用率超过80%时,发送预警信息(先打印到控制台,后续可扩展为发邮件/企业微信)。需要:- 显示所有分区的使用情况- 支持自定义告警阈值- 格式化输出,美观易读

ChatGPT生成的脚本

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""磁盘使用率监控预警脚本功能:检测所有磁盘分区使用率,超过阈值时预警"""import shutilimport osfrom datetime import datetime# 告警阈值(百分比)ALERT_THRESHOLD = 80defget_disk_usage():"""获取所有磁盘分区的使用情况"""    disk_info = []# 读取/proc/mounts获取所有挂载点try:with open("/proc/mounts", "r") as f:            mounts = f.readlines()except FileNotFoundError:# Windows兼容处理import string        mounts = [f"{d}:\\"for d in string.ascii_uppercase if os.path.exists(f"{d}:\\")]for mount in mounts:try:                usage = shutil.disk_usage(mount)                total_gb = usage.total / (1024**3)                used_gb = usage.used / (1024**3)                free_gb = usage.free / (1024**3)                percent = (usage.used / usage.total) * 100                disk_info.append({"mount": mount,"total": total_gb,"used": used_gb,"free": free_gb,"percent": percent                })except:passreturn disk_info# Linux处理    checked = set()for line in mounts:        parts = line.split()if len(parts) < 2:continue        mount_point = parts[1]# 跳过虚拟文件系统if any(skip in mount_point for skip in ["/proc", "/sys", "/dev", "/run"]):continueif mount_point in checked:continue        checked.add(mount_point)try:            usage = shutil.disk_usage(mount_point)            total_gb = usage.total / (1024**3)            used_gb = usage.used / (1024**3)            free_gb = usage.free / (1024**3)            percent = (usage.used / usage.total) * 100            disk_info.append({"mount": mount_point,"total": total_gb,"used": used_gb,"free": free_gb,"percent": percent            })except (PermissionError, OSError):passreturn disk_infodefprint_disk_report(disk_info):"""    格式化输出磁盘使用报告    :param disk_info: 磁盘信息列表    """    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")    print("=" * 65)    print(f"  磁盘使用率报告  |  检测时间:{timestamp}")    print("=" * 65)    print(f"{'挂载点':<20}{'总容量':>8}{'已使用':>8}{'剩余':>8}{'使用率':>7}{'状态'}")    print("-" * 65)    alerts = []for disk in disk_info:# 根据使用率设置状态标识if disk["percent"] >= ALERT_THRESHOLD:            status = "🚨 告警"            alerts.append(disk)elif disk["percent"] >= 70:            status = "⚠️ 注意"else:            status = "✅ 正常"# 使用率进度条        bar_len = 20        filled = int(bar_len * disk["percent"] / 100)        bar = "█" * filled + "░" * (bar_len - filled)        print(f"{disk['mount']:<20} "f"{disk['total']:>6.1f}G "f"{disk['used']:>6.1f}G "f"{disk['free']:>6.1f}G "f"{disk['percent']:>6.1f}% "f"{status}")        print(f"  [{bar}] {disk['percent']:.1f}%")    print("=" * 65)# 打印告警信息if alerts:        print(f"\n🚨 【磁盘告警】发现 {len(alerts)} 个分区使用率超过 {ALERT_THRESHOLD}%!")for disk in alerts:            print(f"   ⚠️  {disk['mount']} 使用率已达 {disk['percent']:.1f}%,剩余空间仅 {disk['free']:.1f}GB!")        print("\n💡 建议立即清理日志、归档历史数据,或扩容磁盘!")else:        print(f"\n✅ 所有分区使用率正常(阈值:{ALERT_THRESHOLD}%)")defmain():    disk_info = get_disk_usage()if disk_info:        print_disk_report(disk_info)else:        print("❌ 无法获取磁盘信息")if __name__ == "__main__":    main()

场景四:定时备份配置文件

生产环境的配置文件是命根子。用Python写一个自动备份脚本,每次备份自动打包+加时间戳!

提示词

帮我写一个Python脚本,自动备份指定的配置文件到backup目录,要求:- 支持备份多个文件/目录- 自动打包成tar.gz格式,文件名包含时间戳- 只保留最近5个备份,自动删除旧的- 备份成功后打印摘要信息

ChatGPT生成的脚本

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""配置文件自动备份脚本功能:将指定文件/目录打包备份,自动管理备份数量"""import osimport tarfileimport shutilfrom datetime import datetimefrom pathlib import Path# ========== 配置区域(按需修改)==========# 要备份的文件/目录列表BACKUP_SOURCES = ["/etc/nginx/nginx.conf","/etc/mysql/my.cnf","/etc/ssh/sshd_config",# "/home/user/app/config",  # 可以是目录]# 备份存放目录BACKUP_DIR = "/backup/configs"# 最多保留几个备份MAX_BACKUPS = 5# ========================================defcreate_backup(sources, backup_dir):"""    创建备份文件(tar.gz格式)    :param sources: 要备份的文件/目录列表    :param backup_dir: 备份存放目录    :return: 备份文件路径    """# 确保备份目录存在    Path(backup_dir).mkdir(parents=True, exist_ok=True)# 生成带时间戳的备份文件名    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")    backup_filename = f"config_backup_{timestamp}.tar.gz"    backup_path = os.path.join(backup_dir, backup_filename)    print(f"📦 开始备份,目标文件:{backup_filename}")    backed_up = []    skipped = []# 创建tar.gz压缩包with tarfile.open(backup_path, "w:gz") as tar:for source in sources:            source_path = Path(source)if source_path.exists():                tar.add(source, arcname=source_path.name)                backed_up.append(source)                print(f"  ✅ 已备份:{source}")else:                skipped.append(source)                print(f"  ⚠️ 跳过(不存在):{source}")return backup_path, backed_up, skippeddefcleanup_old_backups(backup_dir, max_backups):"""    清理旧的备份文件,只保留最新的N个    :param backup_dir: 备份目录    :param max_backups: 最大保留数量    """    backup_files = sorted(        Path(backup_dir).glob("config_backup_*.tar.gz"),        key=lambda f: f.stat().st_mtime,        reverse=True# 最新的排在前面    )# 删除超出数量的旧备份    old_backups = backup_files[max_backups:]for old_file in old_backups:        old_file.unlink()        print(f"  🗑️  已删除旧备份:{old_file.name}")return len(old_backups)defget_file_size(filepath):"""获取文件大小(友好格式)"""    size = os.path.getsize(filepath)if size < 1024:returnf"{size} B"elif size < 1024 * 1024:returnf"{size/1024:.1f} KB"else:returnf"{size/1024/1024:.2f} MB"defmain():    print("=" * 55)    print("  🗂️  配置文件自动备份脚本")    print(f"  📅 备份时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")    print("=" * 55)# 执行备份    backup_path, backed_up, skipped = create_backup(BACKUP_SOURCES, BACKUP_DIR)# 清理旧备份    print(f"\n🧹 检查旧备份(保留最新 {MAX_BACKUPS} 个)...")    deleted_count = cleanup_old_backups(BACKUP_DIR, MAX_BACKUPS)# 打印备份摘要    file_size = get_file_size(backup_path)    print("\n" + "=" * 55)    print("📊 备份摘要:")    print(f"  💾 备份文件:{os.path.basename(backup_path)}")    print(f"  📦 文件大小:{file_size}")    print(f"  ✅ 成功备份:{len(backed_up)} 个文件")    print(f"  ⚠️  跳过:{len(skipped)} 个文件")    print(f"  🗑️  清理旧备份:{deleted_count} 个")    print("=" * 55)    print("\n✅ 备份完成!")if __name__ == "__main__":    main()

进阶技巧:让ChatGPT帮你调Bug

写完脚本运行报错了怎么办?把报错信息直接扔给ChatGPT!

提示词模板:

我在运行以下Python脚本时遇到了报错,请帮我分析原因并给出修复方案:【报错信息】(粘贴完整的错误信息)【相关代码】(粘贴出错的代码片段)【运行环境】Python 3.x,CentOS 7,root权限

ChatGPT会直接告诉你:

  • 报错原因是什么
  • 具体是哪一行有问题
  • 修改后的代码是什么

总结:AI辅助运维的正确姿势

通过今天4个场景的实战演示,我们可以总结出几个关键点:

技巧
说明
提示词要具体
说清楚运行环境、Python版本、具体功能需求
要求加注释
让ChatGPT给每个函数写注释,方便后续维护
要求异常处理
生产环境不允许脚本崩溃,一定要加try-except
分场景提问
复杂需求拆成小模块,逐个让AI生成再组合
让AI解释代码
不懂的代码让它逐行解释,边用边学

ChatGPT不会替代运维工程师,但会让不懂Python的运维人能写脚本,让会写脚本的运维人效率翻倍。


写在最后

如果你还没有开始用AI辅助运维,从今天的这4个脚本开始吧!

复制 → 改配置 → 运行,5分钟就能跑起来。

有任何问题,欢迎在评论区留言,或者直接把报错信息扔给ChatGPT,它比你想象的聪明多了😄


🌟 觉得有用就点个赞!你的支持是我持续输出干货的动力~

📱 关注公众号,每周分享运维技术干货和AI工具使用技巧


作者:成都银河教育 | 网络运维技术讲师涵盖:华为/华三网络 | Linux运维 | MySQL/Oracle | 安全技术 | 云计算

最新文章

随机文章