用ChatGPT帮你写Python自动化运维脚本(完整演示)
作为一名运维工程师,你是否还在手动登录服务器、一条条执行命令?是否还在深夜对着报错信息发呆?是时候让AI替你干活了!
前言:AI + 运维 = 效率革命
2025年之后,越来越多的运维工程师开始把ChatGPT当作自己的"编程助手"。它不仅能写代码,还能帮你调试、优化、加注释、写文档。
今天我用完整的实战演示,带你看清楚:怎么用ChatGPT一步步生成可用的Python运维脚本。
全文涵盖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()
使用方法
192.168.1.1192.168.1.2192.168.1.1008.8.8.8
运行脚本:python check_server.py
场景二:自动清理过期日志文件
日志积累是运维的老大难。手动删?容易误删。定时任务?写起来麻烦。用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个场景的实战演示,我们可以总结出几个关键点:
| |
|---|
| 提示词要具体 | |
| 要求加注释 | |
| 要求异常处理 | 生产环境不允许脚本崩溃,一定要加try-except |
| 分场景提问 | |
| 让AI解释代码 | |
ChatGPT不会替代运维工程师,但会让不懂Python的运维人能写脚本,让会写脚本的运维人效率翻倍。
写在最后
如果你还没有开始用AI辅助运维,从今天的这4个脚本开始吧!
复制 → 改配置 → 运行,5分钟就能跑起来。
有任何问题,欢迎在评论区留言,或者直接把报错信息扔给ChatGPT,它比你想象的聪明多了😄
🌟 觉得有用就点个赞!你的支持是我持续输出干货的动力~
📱 关注公众号,每周分享运维技术干货和AI工具使用技巧
作者:成都银河教育 | 网络运维技术讲师涵盖:华为/华三网络 | Linux运维 | MySQL/Oracle | 安全技术 | 云计算