用 Python 编写可靠的自动化运维脚本
【摘要】 面向运维自动化,讲解 Python 脚本的健壮性设计:重试、超时、幂等、日志与可观测,让脚本在复杂网络环境下稳定运行。运维脚本和开发脚本最大的区别是「它跑在生产环境,且常常在坏环境里跑」。一条能跑的脚本,和一条「可靠」的脚本之间,隔着幂等、重试、超时、可观测这四道坎。1. 幂等。 脚本重跑必须安全。「创建资源」先查「有没有已存在」,「装软件」先判断版本,「发配置」用「先比对再改」。幂等是自动...
面向运维自动化,讲解 Python 脚本的健壮性设计:重试、超时、幂等、日志与可观测,让脚本在复杂网络环境下稳定运行。
运维脚本和开发脚本最大的区别是「它跑在生产环境,且常常在坏环境里跑」。一条能跑的脚本,和一条「可靠」的脚本之间,隔着幂等、重试、超时、可观测这四道坎。
1. 幂等。 脚本重跑必须安全。「创建资源」先查「有没有已存在」,「装软件」先判断版本,「发配置」用「先比对再改」。幂等是自动化能放心重试的前提,做不到幂等的脚本,故障时只能手动干。
2. 网络调用必带重试 + 超时。 裸 requests.get 一次失败就崩是运维脚本大忌。用 urllib3.Retry 或封装一层:
import requests
s = requests.Session()
s.mount("https://", requests.adapters.HTTPAdapter(
max_retries=urllib3.Retry(total=3, backoff_factor=1,
status_forcelist=[502,503,504])))
r = s.get(url, timeout=10) # 超时是硬需求,防挂死
3. 可观测。 脚本自己得留痕。结构化日志(JSON 或带时间戳)落到本地 + 上报,别只打 stdout(跑批完就没了)。失败要带上下文:哪一步、什么参数、什么返回。
4. 原子与事务。 改配置前先备份,操作到一半失败能回滚。数据库 DDL 包在事务里,文件操作用「写临时文件 + rename」。
5. 防御外部输入。 脚本接参数、读配置、收网络响应,都当成不可信输入处理,校验类型和边界。
经验法则: 一条好的运维脚本,满足「能幂等重跑 + 每步能留痕 + 失败能定位」。上线前问自己三遍:网络抖了会怎样?跑到一半崩了会怎样?半夜 3 点无人值守出错了,我能从日志还原现场吗?答得上来,脚本才算可靠。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)