干过运维或者经常跟电脑打交道的人,应该都有过这种体验:明明是一天里最耗时、最没技术含量的活儿——批量改文件名、整理报表、盯着日志找报错、定时备份数据——却偏偏最磨人。我前几年有段时间负责一堆服务器的日常维护,每天下午四点准时开始手动跑检查脚本,盯着屏幕看输出,一跑就是一个多小时,还不算中途因为某个机器网络抖动导致的中断重试。后来我把这套流程彻底改成自动化脚本,下班前十分钟看一眼汇总报告就行,整个人轻松了一大截。
这篇文章就围绕“自动化与脚本”这个主题,聊聊我是怎么从手动操作转向脚本自动化的,包括核心思路、工具选型、实操过程,还有那些文档里不会写但实际一定会踩的坑。不管你是运维、开发、测试,还是经常和数据打交道的运营同学,只要手头有重复性工作,这篇文章都能给你一个可以直接复制的落地方案。
1. 内容整体设计与思路拆解
1.1 自动化脚本解决的核心问题:重复、耗时、易错
先说结论:自动化脚本最适合处理的任务,往往有三个共同特征——重复、耗时、易错。这三个特征通常同时出现,反复执行同样的步骤,每次都要集中注意力,偶尔一次走神就会漏掉关键步骤。
举个例子,我刚入行那年做过一段时间的数据整理,每天从好几个系统里导出Excel,然后手动合并、清洗空值、统一日期格式、生成透视表。刚开始还能忍,到第三个月实在受不了了。因为这种活儿有个特别坑的地方:人在重复劳动中会“机械疲劳”,明明已经做了几十遍的事情,可能一次小小的分心就导致合并错位,而且这种错误往往要等下游同事反馈才发现,届时排查成本特别高。
而脚本自动化的核心价值就体现在这里:把人的注意力从“怎么执行”中解放出来,转而聚焦在“怎么定义规则”上。同样一个小时,手动操作能做一轮,但写脚本可能只需要前二十分钟编码,后面四十分钟机器自动跑完,还能自动输出检查日志。时间上不一定是质的飞跃,但结果的可复现性和正确率是手动操作完全没法比的。
1.2 方案选型:为什么我建议从“最笨的脚本”开始
很多人一提到自动化,第一反应就是上平台、上框架,比如各种任务调度系统、自动化测试平台、流程编排引擎。我不反对这些,但我在实际项目里有一个很深的体会:如果你的问题用手写脚本就能解决,那就先别上重武器。
原因有三点:
- 学习成本低,见效快:一段几十行的脚本就能解决单项任务,不需要去理解整个体系的配置逻辑。对于很多临时性、周期性的需求,这种“快刀斩乱麻”的方式效率最高。
- 依赖少,好维护:脚本只依赖解释器和标准库,而平台化方案往往涉及服务端部署、客户端代理、权限体系、网络策略等一整套配套。后期维护脚本的成本远低于维护一套平台。
- 灵活度高,贴近现场:脚本可以直接写进运维流程,也可以丢给定时任务调度,甚至还能在故障现场临时加参数跑一遍。这种灵活性是固化流程的平台很难提供的。
我之前也跟风折腾过一套开源的任务调度系统,花了三天才把环境搭起来,后来发现我们团队的核心需求不过是“每天跑几个脚本、失败要报警、日志要留存”,完全用不到那么复杂的分布式调度能力。于是果断放弃,把脚本沉淀到一个目录里,用系统自带的定时任务管理起来,所有维护动作退化为编辑文本文件。
1.3 设计原则:解耦、可重试、可观测
在动手写自动化脚本之前,我给自己定了几条设计原则,这几年下来觉得非常有用:
- 解耦:每个脚本只解决一类问题,不做大杂烩。比如“数据采集”和“数据清洗”必须分成两个脚本,方便单独重跑和定位问题。
- 可重试:脚本必须具备幂等性,即重复执行不会产生重复的副作用。这一点对于定时任务尤其重要,因为调度系统可能因为网络问题重跑任务,一旦脚本不是幂等的,灾难性后果很容易出现。
- 可观测:每一步关键操作都要有日志输出,或者至少要能在失败时推断出“卡在哪一步”。我见过太多生产事故是因为脚本没日志,报错信息完全无法定位。
这三条原则听起来很简单,但真正在脚本里落实到位的人并不多。后面我在实操章节会结合具体代码展示如何落地。
2. 脚本语言选型与运行环境准备
2.1 各主流脚本语言的适用场景对比
“自动化与脚本”最基础的问题就是:用哪门语言?我这些年陆续用过Shell、Python、PowerShell、Node.js,各有各的适用场景,这里直接给一份对比表,方便你根据自己的环境做选择。
| 语言 | 擅长领域 | 优点 | 短板 | 推荐指数(通用场景) |
|---|---|---|---|---|
| Bash/Shell | Linux文件操作、进程管理、定时任务 | 环境自带、语法简单、搭配cron天作之合 | 跨平台差、复杂逻辑难写、文本处理容易踩坑 | 4星 |
| Python | 数据处理、API对接、Web爬取、复杂的业务逻辑 | 生态最全、可读性强、跨平台 | 环境依赖管理麻烦、启动速度比Shell慢 | 5星 |
| PowerShell | Windows系统管理、Active Directory、Office 365 | 微软官方支持、Windows平台覆盖面广 | 跨平台支持一般、语法冗长、学习曲线陡 | 3星 |
| Node.js | 前端工具链、高并发IO、与前端项目强绑定 | 异步能力强、可直接复用npm生态 | 处理CPU密集型任务一般 | 3星 |
我给大多数人的建议是:跑在Linux上、逻辑简单,用Shell;逻辑复杂、需要处理各种格式的数据,用Python;Windows环境下管理微软系组件,用PowerShell。
2.2 Python环境配置中的典型问题(基于常见实践的注)
选Python的朋友,我强烈建议从一开始就规范环境管理,不然后面会非常痛苦。我见过太多人直接往系统Python环境里pip install,结果装到一半发现和系统自带版本冲突,不得不重装系统Python。正确的做法是使用虚拟环境。
# 创建项目目录 mkdir ~/auto-scripts && cd ~/auto-scripts # 创建并激活虚拟环境 python3 -m venv venv source venv/bin/activate # 安装依赖 pip install requests pandas为什么要这么做?因为虚拟环境把项目依赖隔离在一个独立目录里,不同脚本之间哪怕依赖版本冲突,也不会互相影响。我有个项目用了pandas老版本,另一个项目需要新版本,如果不隔离,光解决依赖冲突就得半天。
2.3 运行环境加固:日志、超时与异常捕获
脚本运行的稳定性,很大程度取决于环境层面做了多少防护。这里有三个环境级的经验想分享:
- 超时控制:所有网络请求必须设置超时时间。Python的requests库默认不会超时,一旦对端服务卡住,你的脚本就卡在那里,定时任务也跟着停摆。设置
timeout=(connect_timeout, read_timeout)是底线。
import requests resp = requests.get( "https://api.example.com/data", timeout=(5, 30) # 连接超时5秒,读取超时30秒 )异常分类捕获:不要只用一个裸
except Exception。应该按异常类别分开处理,比如网络异常(DNS解析失败、连接超时)要重试,数据格式异常(解析失败、字段缺失)要发告警,而不是一视同仁当错误处理。日志输出规范:给日志加上时间戳和脚本名,至少做到“看日志能知道程序执行到哪一步”。后面常见问题章节里我会专门说日志怎么打更高效。
3. 实操过程:一个完整的批量文件处理脚本从零到上线
3.1 需求定义:从一段模糊描述到可执行的脚本
我一直认为,写自动化脚本最难的环节不是敲代码,而是把模糊的需求变成清晰可执行的逻辑。这里用一个真实项目举例,需求是这样一段描述:
“每个工作日早上,需要把昨天所有服务器产生的日志文件(分散在多台机器的不同目录)归档到一台备份机器上,按日期和服务器名分类,然后把归档结果做成一张Excel表格发给团队群。”
这个需求初看不复杂,但拆解一下,至少有这些关键点需要明确:
- 日志文件从哪里来?是每台机器上的固定目录吗?文件名格式统一吗?
- 归档的方式是复制还是移动?源文件要不要保留?
- 按日期和服务器名分类,日期以什么时区为准?
- Excel表格需要包含哪些字段?是否需要统计文件数量、大小?
- 失败重试的阈值是什么?哪些场景要人工介入?
我在实际工作中会先花半小时把这些细节确认清楚,再动手写代码。明确的需求定义,能避免后面反复改代码的窘境。
3.2 代码实现:核心逻辑与步骤拆解
假设我们确定的需求是:日志源在每台机器上的/var/log/myapp/目录,文件名格式app-20250101.log,归档时移动到备份机器/backup/2025年01月/服务器名/,并把文件列表汇总成Excel。
下面是核心实现片段,分成三个脚本,每个脚本只负责一件事:
脚本1:本地日志移动及重命名(每台源机器执行)
#!/bin/bash # 归档指定日期的日志文件到本地staging目录 TARGET_DATE=${1:-$(date -d "yesterday" +%Y%m%d)} STAGING=/data/staging cd /var/log/myapp || exit 1 # 匹配当天的日志文件 FILES=$(ls app-${TARGET_DATE}*.log 2>/dev/null) if [ -z "$FILES" ]; then echo "[WARN] 未找到 ${TARGET_DATE} 的日志文件,检查文件命名是否正确" exit 0 fi mkdir -p "${STAGING}/${HOSTNAME}" for f in $FILES; do mv "$f" "${STAGING}/${HOSTNAME}/${HOSTNAME}-${f}" echo "[INFO] 已移动 ${f}" done这个脚本用的是Shell,因为它只涉及文件操作,逻辑简单,不需要Python这种重量级工具。有一个小细节:移动后文件名加上了主机名前缀,避免多台机器文件合并时互相覆盖,这个小习惯帮我在后期排查时省了大力气。
脚本2:汇总文件列表到Excel(备份机器执行)
#!/usr/bin/env python3 """生成归档日志的清单Excel""" import csv import glob import os from datetime import datetime # 归档根目录 ARCHIVE_ROOT = "/backup" OUTPUT_CSV = "/report/archive_report.csv" rows = [] for root, dirs, files in os.walk(ARCHIVE_ROOT): for name in files: full_path = os.path.join(root, name) stat = os.stat(full_path) rows.append({ "归档路径": full_path, "文件大小KB": round(stat.st_size / 1024, 2), "归档时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "服务器名": root.split("/")[2], "文件名": name, }) with open(OUTPUT_CSV, "w", newline="") as fp: writer = csv.DictWriter(fp, fieldnames=["服务器名", "文件名", "文件大小KB", "归档路径", "归档时间"]) writer.writeheader() writer.writerows(rows) print(f"[INFO] 已生成 {len(rows)} 条归档记录")实际项目中我把Excel生成换成了CSV,因为团队里有人用Excel软件直接打开CSV也能看到数据,不用额外引入pandas依赖。
脚本3:编排入口(主干脚本)
#!/bin/bash # 在主控机器上调度所有步骤 set -e # 任何一步失败即退出 echo "===== 开始归档任务 $(date) =====" # 步骤1:通过SSH在源机器上执行收集脚本 for host in server01 server02 server03; do echo "正在处理: ${host}" ssh user@${host} "bash /scripts/collect_and_move.sh" done # 步骤2:将各机器staging目录拉取到备份机 for host in server01 server02 server03; do scp -r user@${host}:/data/staging/* /backup/ done # 步骤3:生成CSV报表 python3 /scripts/gen_report.py # 步骤4:发送通知(发送逻辑略) echo "===== 归档任务完成 ====="这里有一个设计要点:编排脚本用Shell,核心业务逻辑用Python,两者各司其职。你问为什么不用Python写全流程?因为Shell对Launcher类任务的表达更简单(进程管理、ssh调用),而Python对数据处理更强大。混搭不是坏事,关键是明确边界。
3.3 定时任务调度:cron配置与常见坑
归档任务设计成每个工作日执行,最简单的方式就是Linux系统的cron定时任务。以下是我使用的配置:
# 工作日早上8点执行,例如:周一到周五 0 8 * * 1-5 /opt/scripts/main.sh >> /var/log/auto-scripts/archiver.log 2>&1第一眼看起来没问题,但实际跑起来会遇到几个很经典的坑:
- 环境变量缺失:cron执行时用的PATH环境变量非常简陋,很多路径不在里面。所以脚本里所有命令行工具(ssh、scp、python3)都尽量用绝对路径,或者在脚本开头统一source
/etc/profile。 - 输出重定向:必须在cron命令里写明日志输出位置,否则脚本的输出会被吞掉,出问题完全不知情。上面配置里的
>> /var/log/auto-scripts/archiver.log 2>&1就是干这个的。 - 时区问题:cron的时间默认服务器本地时区。如果服务器时区设置不对,你的“早上8点”可能不是你以为的早上8点。我有一台机器在UTC时区,写任务时特意换算过。
- cron服务状态:别以为配置完就万事大吉。某些精简版系统的cron服务默认没启动,需要用
systemctl status crond或systemctl status cron检查。
还有一个建议:cron任务不要太密集。两个任务之间要留足够的间隔时间,避免上游任务还没跑完,下游任务就启动了。我一般至少间隔五到十分钟,并且下游任务以“上游产物存在”为前提校验。
3.4 失败重试与告警闭环
自动化脚本不能只跑成功的那种情况。我在编这个归档任务时,额外加了两层保障:
跨机器操作的校验:从executor机器通过ssh执行远端脚本后,必须检查ssh的退出码和远端脚本的返回码。
set -e能保证bash遇到非0返回码就退出,但如果ssh命令超时,退出码会异常,这一点容易被忽略。所以远端执行统一用了ssh -o ConnectTimeout=5 -o BatchMode=yes参数,BatchMode确保不会卡在密码输入上。失败告警:在编排脚本最后加一个检查,判断日志文件是否生成、CSV报表行数是否为零值,一旦异常就调用alert接口发出消息。不要只信“任务跑完”就以为成功,要检查结果是否符合预期。
4. 常见问题与排查技巧实录
4.1 脚本执行结果与预期不符时的排查方法
我在社区里看到最多的问题就是“脚本明明执行成功,但输出结果不对”。这类问题通常跟以下几个因素有关:
- 编码问题:日志文件里如果有非UTF-8编码的中文,Python在读取时可能会抛错或乱码。我的经验是统一在文件开头声明编码:
# 读取非UTF-8文件 with open(file, "r", encoding="utf-8", errors="ignore") as f: content = f.read()errors="ignore"这个参数能避免因为某个字节异常导致整段文件无法读取。
路径分隔符不一致:Windows用
\,Linux用/。跨平台脚本如果硬编码分隔符,必然出错。标准做法是使用os.path.join()拼接路径,而不是手动拼字符串。静默跳过数据:比如
glob.glob()用了不匹配的通配符,匹配结果为空,代码不报错,但结果为空。这时候要把匹配数量打印出来,一眼就能看出来有没有匹配到。
4.2 定时任务不执行时的排查清单
如果你配置的cron任务到点没跑,按下面的顺序排查效率最高:
- 看cron服务状态:
systemctl status crond或service cron status,确认服务在运行。 - 看cron日志:在
/var/log/cron中搜索脚本名,查看是否有“CMD”和“FAILED”记录。 - 看脚本日志:如果cron日志显示执行了但没输出,检查脚本日志文件是否有内容,以及大小是否异常(比如日志被权限问题阻挡)。
- 手动直接跑一遍:用命令行执行脚本,观察是否报错。如果命令行能跑通,cron却不能,十有八九是环境变量问题。
- 检查时间戳时区:用
date查看服务器当前时间,确认时区正确。
4.3 脚本运行慢的排查思路
自动化脚本最怕的不是报错,而是“慢到让人怀疑人生”。排查慢问题时,先从这三个角度入手:
- 网络等待:如果脚本里循环请求外部API,重点看每次请求的响应时间。常见问题是没有设置合理的重试策略,失败后指数退避间隔过长。
- IO瓶颈:大量小文件读写会很慢。一个几千个文件的目录,用
os.walk()逐个stat会非常吃力。改进方式是先做好文件根据时间过滤,然后整批处理。 - 串行改并行:如果任务本身可以拆分,就用线程池或者进程池并行处理。比如批量压缩分片文件,用
concurrent.futures.ProcessPoolExecutor效果立竿见影。
import concurrent.futures import subprocess files = ["chunk01.gz", "chunk02.gz", ...] def compress_one(f): subprocess.run(["gzip", f], check=True) with concurrent.futures.ProcessPoolExecutor(max_workers=4) as pool: pool.map(compress_one, files)并行是把双刃剑,CPU密集型任务建议进程池,IO密集型任务用线程池就好。并行数量不必太多,过度并行反而让系统上下文切换开销暴增。
4.4 日志管理与滚动策略
脚本日志如果没人管,迟早占满磁盘。我至少要求每个脚本的日志保留七天的轮转。最简单的方式是结合Linux的logrotate,或者自己写个小函数控制日志大小。
function log_msg() { local msg="$1" echo "$(date '+%Y-%m-%d %H:%M:%S') ${msg}" >> "${LOG_FILE}" # 日志超过20M就轮转 if [ $(stat -c%s "${LOG_FILE}" 2>/dev/null || echo 0) -gt 20971520 ]; then mv "${LOG_FILE}" "${LOG_FILE}.old" fi }这个函数虽然简单,但能防止单个脚本长期运行导致日志无限膨胀。实际项目中,我会把这个函数抽到一个公共文件里,所有脚本统一source。
4.5 高频踩坑合集:安全性、幂等性与并发冲突
- 脚本中硬编码敏感信息:我已经记不清看过多少人的脚本里直接写了数据库密码、API Token。任何脚本里严禁硬编码凭据,环境变量或服务密钥管理工具是底线做法。
- 幂等性设计缺失:脚本重复执行会产生重复结果。比如“归档文件”如果用copy而不是move,重复执行会导致报表里出现同一文件的多条记录。解决思路是:移动改为“检查目标文件是否存在,存在则跳过或强制覆盖并记录”。
- 并发冲突:同一个脚本被多个定时任务同时触发,可能导致文件写入冲突。解决方式是使用锁文件,或使用
flock命令确保同一时刻只有一个实例运行。
# 通过文件锁避免重复执行 exec 9>/var/lock/archiver.lock if ! flock -n 9; then echo "已有实例正在运行,本次跳过" exit 1 fi这套flock用法我几乎每个重要脚本都会加,成本只有三行,但避免了非常多的生产事故。
5. 高级扩展:脚本也能做的“稍微复杂”的事
5.1 用Python与Excel打交道:自动化报表
开头提到Excel自动化,这里给一个轻量级的做法。日常报表需求,不需要重型的Excel库,直接用CSV就能满足九成场景。但如果非要做.xlsx格式,推荐openpyxl。
from openpyxl import Workbook wb = Workbook() ws = wb.active ws.title = "归档明细" ws.append(["服务器", "日期", "大小KB"]) ws.append(["server01", "2025-01-01", 512.3]) list_of_rows = [ ["server02", "2025-01-01", 300.1], ["server03", "2025-01-01", 1024.7], ] for row in list_of_rows: ws.append(row) wb.save("/report/archive.xlsx")坦白讲,openpyxl功能比Excel VBA丰富得多,比如合并单元格、样式调整、图表生成都能做。但我的经验是:报表越简单越稳定,复杂的格式调整容易在自动化流程中出乱子。如果确实需要花哨的样式,先用openpyxl画好模板,再让脚本“填写数据”而不是“生成整个文件”。
5.2 用API接口构建自动化闭环
脚本自动化到了一定程度,就会开始和外部系统打交道。比如:
- 调用监控平台的API拉取服务器状态
- 调用工单系统的API创建自动恢复失败后的工单
- 调用企业微信/钉钉的机器人接口推送任务结果
这里有一个重要原则:不要每次都反射地写一套API调用逻辑,封装成通用模块才是正道。我个人的实践是建一个common_requests.py,统一处理认证、超时、重试、日志,其他脚本直接调用。
# common_requests.py import requests import time def api_request(url, method="GET", retries=3, **kwargs): """带重试机制的请求封装""" kwargs.setdefault("timeout", (5, 30)) for attempt in range(retries): try: resp = requests.request(method, url, **kwargs) resp.raise_for_status() return resp.json() except (requests.ConnectionError, requests.Timeout) as e: time.sleep(2 ** attempt) # 指数退避 if attempt == retries - 1: raise这个模块在团队里被复用了不知道多少次,新增一个接口对接时只需写调用逻辑,不需要重复踩网络异常的坑。
5.3 日志解析与告警过滤的经典案例
自动化脚本还有一个高频场景是监控日志文件。比如程序崩溃前通常会打出一堆错误日志,但错误日志里也有“可忽略”的,如何过滤出真正需要关注的级别?
我写过一个小脚本,专门做一个动作:扫描应用日志,统计错误关键字(如“OutOfMemoryError”“Connection refused”“FATAL”)出现的次数,超过阈值则触发告警,低于阈值则仅仅记录。这个思路能有效避免“狼来了”效应。
REPORTED_KEYWORDS = { "OutOfMemoryError": 1, "Connection refused": 3, "FATAL": 1, } log_file = "/var/log/myapp/error.log" counts = {} with open(log_file, "r") as f: for line in f: for keyword in REPORTED_KEYWORDS: if keyword in line: counts[keyword] = counts.get(keyword, 0) + 1 alerts = [] for keyword, threshold in REPORTED_KEYWORDS.items(): if counts.get(keyword, 0) >= threshold: alerts.append(f"{keyword}: {counts[keyword]}") if alerts: print(f"[ALERT] 触发告警: {', '.join(alerts)}")这个脚本的价值不在于复杂,而在于“定义了真正需要关注的等级”,有效避免自动化告警变成噪声。很多系统的告警之所以被无视,就是因为没做这类“收敛”。
6. 自动化脚本的管理与可持续演进
6.1 脚本目录的规范布局
脚本一旦多了,如果没有规范布局,维护成本会急剧上升。我建议一套比较通用的目录规划方案:
/opt/auto-scripts/ ├── bin/ # 所有可执行脚本,按业务子目录组织 │ ├── archive/ │ ├── report/ │ └── monitor/ ├── conf/ # 全局配置文件(JSON/YAML) ├── lib/ # Python模块存放处 ├── logs/ # 日志输出目录 ├── data/ # 临时数据文件 └── README.md # 每个脚本的简要说明特别强调一下README这个文件:每一个自动化脚本都要有一个三行的说明——功能、依赖、用法。否则半年后根本记不清这个脚本是干嘛用的,维护成本会变成灾难。
6.2 版本管理与发布流程
脚本本质上也是代码,同样需要版本管理。我一直用Git管理所有脚本,每次改动都走提交加注释。具体做法:
cd /opt/auto-scripts git init git add . git commit -m "feat: 归档脚本支持按周维度压缩"可能有人觉得运维脚本改个版本还要走Git有点小题大做,但我在处理一次线上故障时,就是因为脚本版本管理混乱,“修改了一个看似无关的配置导致另一个任务失效”的事情发生后,彻底明白了版本回溯的重要性。脚本部署不是“改一行就完”,要能回溯、能对比、能回滚。
6.3 从脚本走向自动化体系
当脚本积累到一定程度,你会发现很多脚本之间其实存在依赖关系:A脚本的产出是B脚本的输入,C脚本需要等B跑完才能启动。这种时候,有两种演进路径:
- 路径一:加强编排脚本。在现有基础上,把脚本依赖关系显式写进一个“总调度脚本”,按依赖顺序依次调用,每一步结果不通过就终止后续。
- 路径二:引入工具。比如轻量级的自动化工具如Make、Snakemake,或者更专业的任务编排工具。但这条路径的前提是团队规模、任务复杂度已经足够大,值得引入。
我个人的建议是:在脚本数量少于十个之前,坚决不做大平台化。先把脚本本身的质量搞好,维护规范化,比什么都强。等脚本确实多了,再迁到更强大的调度平台时才不痛苦——因为迁移时只需要关心“平台API怎么对接”,不需要分心去修脚本的质量问题。
6.4 脚本安全的几个重要习惯
最后重点强调安全,这部分很少人认真对待,但后果非常严重:
- 权限最小化:给脚本执行用户只分配完成任务所需的最小权限,不要用root。很多脚本只是读取日志、移动文件,普通用户配合目录权限就够了。
- 输入校验:如果脚本接收外部传入的参数(命令行参数、配置文件、API回调),务必做合法性校验。恶意的路径注入可能在脚本中造成意想不到的结果。
- 定期审计:为关键脚本的改动加上审计记录,明确变更人、变更时间、变更原因。这在大一点的环境中尤为重要,因为在故障排查时,你通常需要知道“这段逻辑是谁在什么时候改的”。
- 敏感信息外置:使用配置文件或环境变量保存凭据,配置文件仅管理员可读,并加入
.gitignore,防止提交进仓库。
6.5 关于脚本后续扩展的几个真实建议
从我自己的实际操作体会来看,自动化脚本这件事的投入产出比极高。刚开始写总觉得不如手动快,但坚持两三个月后,仓库里沉淀下来的脚本基本上能覆盖日常工作80%以上的重复操作,剩余20%是那种极低频、没规则可言的临时任务,这些手动处理也没问题。
如果你正准备开始做自动化,我给出的建议很简单:从当前最痛的那个重复任务起步,把它写好,加上日志,配好定时任务,下一周再看效果。不用一上来就规划一个庞大体系,让脚本自己去证明价值,你自然会有动力继续完善它。
至于那些已经写好脚本的朋友,我建议你回头检查一下自己的脚本是否符合“可重试、可观测、有报警”三条底线。如果都满足,再继续考虑更多花活;如果有一条不满足,建议先把这条补上。很多时候,一个自动化系统最大的成本不在初始开发,而在于后期维护,而维护的舒适度,几乎完全取决于当初写代码时有没有多花十分钟加上确认逻辑、日志和重试机制。