4、自动化作业平台:作业编排引擎、脚本管理、批量执行与回滚

自动化作业平台,说白了就是运维的「流水线工厂」。

我做了这么多年金融云运维,最深的体会就是:手工操作是万恶之源。你想想看,凌晨三点做版本发布,几十台机器要挨个登录、敲命令、等结果。手一抖,命令敲错了,或者漏了一台机器,那就是事故。

所以,作业平台的核心价值就三个字:标准化。把重复的操作变成模板,把人工执行变成自动调度,把不可控变成可回滚。

核心目标: 让运维人员从「人肉执行器」变成「流程设计师」。

4.1 作业编排引擎:把操作串成剧本

作业编排引擎,你可以把它理解成一个「剧本编辑器」。

我习惯把一次运维操作拆解成若干个「原子步骤」。比如「重启应用」这个操作,它其实包含:检查进程状态 → 停止服务 → 等待进程退出 → 启动服务 → 检查端口监听 → 验证业务接口。这六个步骤,缺一不可。

编排引擎要支持什么?我个人觉得,有向无环图(DAG)是必须的。为什么?因为步骤之间可能有依赖关系。比如「启动服务」必须在「停止服务」之后,但「检查端口」和「验证接口」可以并行跑。

我的经验: 在金融场景下,编排引擎一定要支持「条件分支」。比如「如果进程停止失败,则跳过启动步骤,直接告警」。我曾经见过一个项目,因为没做条件判断,进程没杀掉就强行启动,结果双进程冲突,业务中断了20分钟。

下面是一个简单的作业编排示例,用YAML描述一个「应用发布」流程:

version: '2.0'
workflow:
  name: app_deploy
  steps:
    - id: pre_check
      type: script
      target: all
      script: check_app_status.sh
      on_failure: abort
    - id: stop_app
      type: script
      target: all
      script: stop_app.sh
      depends_on: [pre_check]
      on_failure: rollback
    - id: deploy_package
      type: file_transfer
      target: all
      source: /pkg/app_v2.0.tar.gz
      dest: /opt/app/
      depends_on: [stop_app]
    - id: start_app
      type: script
      target: all
      script: start_app.sh
      depends_on: [deploy_package]
    - id: health_check
      type: script
      target: all
      script: health_check.sh
      depends_on: [start_app]
      on_failure: rollback

你看,这个编排里,每个步骤都有明确的依赖和失败处理策略。这就是金融级运维需要的严谨性。

4.2 脚本管理:别让脚本散落一地

我记得刚入行那会儿,大家的脚本都放在自己的笔记本里,或者服务器上的某个角落。今天张三改了一版,明天李四又改了一版,最后谁都不知道线上跑的是哪个版本。这太可怕了。

脚本管理,要解决三个问题:版本控制、权限管控、语法校验

管理维度 具体要求 金融场景下的特殊考量
版本控制 集成Git,每次修改留痕,支持回退到任意历史版本 审计要求:必须记录谁在什么时间修改了什么内容
权限管控 按角色分权:脚本查看、编辑、执行、审批权限分离 生产环境脚本必须经过「双人复核」才能上线
语法校验 上传时自动执行shellcheck、python语法检查 我曾经因为一个脚本里漏了个引号,导致批量执行时所有机器都报错
参数化 支持脚本参数模板,执行时动态传入变量 比如IP地址、端口号、环境名称等,不要硬编码在脚本里
避坑指南: 我曾经见过一个团队,把数据库密码直接写在脚本里,然后上传到脚本管理平台。结果平台被扫描到,密码泄露了。所以,脚本管理平台一定要支持「敏感信息脱敏」,比如用变量占位符 ${DB_PASSWORD},执行时从密钥管理系统动态获取。

4.3 批量执行:从「一台一台」到「一键搞定」

批量执行,听起来简单,但坑特别多。

我总结过批量执行的三个核心能力:并发控制、执行策略、结果采集

  • 并发控制: 金融系统讲究「优雅」。你不能一下子对100台机器同时执行重启,那叫「雪崩式攻击」。我建议设置「并发度」,比如每次只操作10台,等这10台确认正常了,再操作下一批。这叫「滚动执行」。
  • 执行策略: 支持「全量执行」、「灰度执行」、「指定IP执行」。灰度执行特别重要,先拿一台非核心机器试试水,没问题再推全量。
  • 结果采集: 执行完不是终点,你得知道每台机器执行成功还是失败。我习惯让平台自动采集「标准输出」、「标准错误」、「返回码」,并且支持实时查看执行日志。

下面是一个批量执行的结果展示示例:

+----------------+--------+------------------+------------------+
| 目标机器        | 状态   | 执行耗时          | 错误信息          |
+----------------+--------+------------------+------------------+
| 10.0.1.10      | 成功   | 2.3s             | -                |
| 10.0.1.11      | 成功   | 2.1s             | -                |
| 10.0.1.12      | 失败   | 5.0s             | 进程停止超时      |
| 10.0.1.13      | 成功   | 2.4s             | -                |
+----------------+--------+------------------+------------------+

嗯,这里要注意:失败不等于回滚。有些失败是预期内的,比如某台机器网络抖动导致超时,重试一次就好了。但有些失败是致命的,比如脚本执行报错,这时候就需要触发回滚流程。

4.4 回滚机制:最后的救命稻草

做运维的,谁还没经历过回滚呢?

我个人认为,没有回滚方案的操作,就是赌博。金融系统尤其如此,一旦出问题,影响的是真金白银。

回滚机制要支持两种模式:

  1. 自动回滚: 在编排引擎里定义好「回滚步骤」。比如发布失败时,自动执行「停止新版本 → 恢复旧版本包 → 启动旧版本 → 验证」。整个过程不需要人工介入。
  2. 手动回滚: 提供「一键回滚」按钮,运维人员确认后,平台自动执行预定义的回滚脚本。
关键点: 回滚不是简单的「反向操作」。比如数据库表结构变更,你回滚代码容易,但回滚数据库结构就麻烦了。所以,回滚方案一定要在操作前就设计好,而不是出事了再想。

我曾经遇到过一个案例:某次版本发布,新版本改了数据库字段类型。发布后发现性能问题,需要回滚。但回滚脚本只恢复了代码,没恢复数据库结构。结果旧版本代码读不了新格式的数据,直接报错。从那以后,我要求所有涉及数据库变更的操作,必须同时准备「向前迁移脚本」和「向后回滚脚本」。

4.5 知识体系总览

下面这张图,是我对自动化作业平台核心模块的总结。你可以看到,编排引擎是大脑,脚本管理是弹药库,批量执行是手脚,回滚机制是安全气囊。四者缺一不可。

自动化作业平台核心架构 作业编排引擎 脚本管理 批量执行 回滚机制 版本控制 权限管控 并发控制 结果采集 自动回滚 手动回滚 Git集成 · 语法校验 · 参数化 灰度执行 · 滚动执行 · 日志 预定义回滚步骤 · 一键恢复

好了,关于自动化作业平台的核心内容,我就讲这么多。说白了,就是让机器替人干活,而且干得比人更稳、更快、更可追溯。你想想看,当你的团队从「每天熬夜发版本」变成「喝着咖啡点一下执行按钮」,那种感觉,真的很爽。

最后一个小建议: 刚开始搭建作业平台时,别贪多求全。先挑一个最痛、最频繁的操作场景(比如应用重启),把它做成一个完整的作业。跑通了,再慢慢扩展。我见过太多团队,一上来就想搞个大而全的平台,结果半年过去了,连一个能用的作业都没跑起来。

公众号:蓝海资料掘金营,微信deep3321