19.4.7 自动化变更与审批联动

自动化变更与审批联动的核心目标是将变更申请、风险评估、审批流转与执行编排打通,形成可控、可追溯、可回滚的闭环。平台需定义统一的变更模型(变更类型、影响范围、风险等级、窗口期、回滚方案、验收标准),并与任务编排引擎绑定,实现“审批通过即触发、审批驳回即终止”。

原理草图(审批、执行、审计联动):

文章图片

变更模型与审批联动示例(YAML 模型 + 审批回调触发):

# /opt/change/change-20240501.yaml
id: CHG-20240501-001
type: standard         # standard/emergency/routine
service: api-gateway
env: prod
risk: medium
window: "2024-05-01 02:00-03:00"
owner: ops_a
plan:
  exec_job: rundeck/job/rolling-restart
  parameters:
    batch: 20%
    delay: 60
rollback:
  exec_job: rundeck/job/rollback-restart
acceptance:
  - check: "http 200率 > 99.5%"
  - check: "P95 < 200ms"
# 1) 生成变更单并提交审批(示例:调用内部审批API)
curl -X POST http://approve.local/api/v1/change \
  -H 'Content-Type: application/yaml' \
  --data-binary @/opt/change/change-20240501.yaml

# 2) 审批通过后回调执行引擎(示例:Rundeck Webhook)
curl -X POST http://rundeck.local/api/40/job/trigger \
  -H 'Content-Type: application/json' \
  -d '{"jobId":"rolling-restart","argString":"-batch 20% -delay 60"}'

# 3) 验收证据采集(示例:Prometheus指标快照)
curl -G http://prom.local/api/v1/query \
  --data-urlencode 'query=rate(http_requests_total{code="200"}[5m])'

安装示例(轻量审批联动服务 + Webhook 接收器):

# 安装Python运行环境与依赖
yum -y install python3
pip3 install flask gunicorn pyyaml requests

# /opt/approve/app.py(审批回调服务)
cat >/opt/approve/app.py <<'PY'
from flask import Flask, request, jsonify
import yaml, requests

app = Flask(__name__)

@app.route('/api/v1/change', methods=['POST'])
def create_change():
    data = yaml.safe_load(request.data)
    # 简化:直接记录并模拟审批通过
    # 实际应写入DB并走审批流
    cb = {"jobId": data["plan"]["exec_job"].split("/")[-1],
          "argString": f'-batch {data["plan"]["parameters"]["batch"]} -delay {data["plan"]["parameters"]["delay"]}'}
    requests.post("http://rundeck.local/api/40/job/trigger", json=cb, timeout=5)
    return jsonify({"status":"approved","id":data["id"]})

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8081)
PY

# 启动服务
gunicorn -b 0.0.0.0:8081 /opt/approve/app:app

自动化执行与回滚示例(Ansible 编排 + 验收):

# /opt/ansible/rolling-restart.yml
- hosts: api_gateway
  serial: 20%
  tasks:
    - name: 重启服务
      systemd:
        name: api-gateway
        state: restarted
    - name: 健康检查
      uri:
        url: "http://{{ inventory_hostname }}:8080/health"
        status_code: 200
      register: hc
      retries: 5
      delay: 3
      until: hc.status == 200
# /opt/ansible/rollback-restart.yml
- hosts: api_gateway
  tasks:
    - name: 回滚到上一版本
      shell: /opt/bin/rollback.sh
# 执行编排
ansible-playbook -i /opt/ansible/hosts /opt/ansible/rolling-restart.yml

# 回滚执行
ansible-playbook -i /opt/ansible/hosts /opt/ansible/rollback-restart.yml

关键命令解释与执行闭环要点:
- curl -X POST http://approve...:提交变更单到审批服务并触发审批流。
- curl -X POST http://rundeck...:审批通过后的执行触发,参数与变更单一致。
- ansible-playbook ... rolling-restart.yml:分批重启并做健康检查,失败触发补偿。
- ansible-playbook ... rollback-restart.yml:回滚到上一稳定版本。
- Prometheus query:采集验收指标,形成变更证据。

排错与常见问题(含命令):
1) 审批通过未触发执行

# 查看审批服务日志
journalctl -u gunicorn -n 100
# 验证回调接口是否可达
curl -I http://rundeck.local/api/40/job/trigger

2) 执行失败未回滚

# 检查Ansible失败原因
ansible-playbook -i /opt/ansible/hosts /opt/ansible/rolling-restart.yml -vv
# 验证回滚脚本是否存在且可执行
ls -l /opt/bin/rollback.sh

3) 变更窗口被阻止(冻结)

# 检查监控告警是否触发冻结规则
curl -G http://prom.local/api/v1/query --data-urlencode 'query=ALERTS{alertstate="firing"}'

练习与实操建议:
1) 设计一份标准变更与紧急变更的 YAML 模型,分别配置不同审批链与回滚策略。
2) 将 rolling-restart.yml 改造成灰度发布(10%/30%/60% 三阶段),并在失败时自动执行回滚。
3) 在审批服务中增加“审批超时自动拒绝”逻辑,并验证任务不会被触发。
4) 使用 Prometheus 指标作为验收条件,形成“验收未通过自动回滚”的闭环。