6.9.2 自动化运维流程与任务编排

自动化运维流程与任务编排#

自动化运维流程用于将日常重复操作标准化、可回放和可审计,核心目标是降低人为错误、缩短变更窗口与提升可用性。流程设计应围绕“任务分解—依赖关系—失败回滚—验证与审计”展开,并以幂等性为基础确保可重复执行。

原理草图(流程编排与回滚)#

文章图片

流程设计要点与命令示例#

  • 任务拆分:以“备份—校验—归档—清理”为最小单元
  • 前置校验:检查版本、磁盘、复制状态
  • 依赖编排:将任务线性或并行组合
  • 失败处理:设定重试与回滚
  • 审计与追踪:记录操作者与结果

示例:前置校验(磁盘/权限/复制状态)

# 1) 磁盘检查(>=20G 作为示例阈值)
df -h /data | awk 'NR==2{print $4}' | sed 's/G//g' | awk '{if($1<20) exit 1}'
echo "disk ok"

# 2) 权限检查(能登录且具备备份权限)
mysql -uroot -p'pass' -e "SHOW GRANTS FOR CURRENT_USER\G" | grep -E "RELOAD|PROCESS|LOCK TABLES" 

# 3) 复制状态检查(从库健康)
mysql -uroot -p'pass' -e "SHOW SLAVE STATUS\G" | egrep "Seconds_Behind_Master|Slave_IO_Running|Slave_SQL_Running"

任务编排模型示例(以 Ansible 为例)#

安装与初始化(控制节点)

# 安装 ansible(Ubuntu)
sudo apt update && sudo apt install -y ansible

# inventory
cat >/etc/ansible/hosts <<'EOF'
[mysql]
10.0.0.11
10.0.0.12
EOF

编排示例:备份—校验—归档(线性流水线)

# /opt/ops/mysql_backup.yml
- hosts: mysql
  become: yes
  vars:
    backup_dir: /data/backup
    db_user: root
    db_pass: pass
  tasks:
    - name: 创建备份目录
      file:
        path: "{{ backup_dir }}"
        state: directory
        mode: "0750"

    - name: 执行全量备份
      shell: |
        mysqldump -u{{ db_user }} -p{{ db_pass }} --single-transaction --routines --events \
        --all-databases > {{ backup_dir }}/full_{{ ansible_date_time.date }}.sql
      args:
        executable: /bin/bash

    - name: 校验备份文件
      shell: |
        test -s {{ backup_dir }}/full_{{ ansible_date_time.date }}.sql
      register: chk

    - name: 归档并压缩
      shell: |
        gzip -f {{ backup_dir }}/full_{{ ansible_date_time.date }}.sql

执行

ansible-playbook /opt/ops/mysql_backup.yml -v

预期效果
- 生成 /data/backup/full_YYYY-MM-DD.sql.gz
- 若校验失败则任务中断

失败处理与回滚示例(重试与报警)#

# /opt/ops/mysql_failover.yml
- hosts: mysql
  tasks:
    - name: 示例任务(重试)
      shell: "mysqladmin -uroot -ppass ping"
      register: ping_result
      retries: 3
      delay: 5
      until: ping_result.rc == 0

    - name: 失败回滚(示例:恢复参数文件)
      when: ping_result.rc != 0
      shell: "cp /etc/mysql/my.cnf.bak /etc/mysql/my.cnf && systemctl restart mysql"

事件驱动示例(监控触发)#

# 监控触发脚本:复制延迟>300秒则重建从库(示例,需结合实际安全控制)
# /opt/ops/replication_heal.sh
#!/bin/bash
delay=$(mysql -uroot -ppass -e "SHOW SLAVE STATUS\G" | awk '/Seconds_Behind_Master/{print $2}')
if [ "$delay" -gt 300 ]; then
  echo "$(date) delay=$delay trigger rebuild" >> /var/log/replica_heal.log
  # 触发编排工具(示例:ansible)
  ansible-playbook /opt/ops/rebuild_replica.yml
fi

架构示意(自动化平台与执行链路)#

文章图片

排错与诊断清单#

  • 任务失败不明:检查 playbook 运行日志 -vvv
  • 权限不足:验证 MySQL 账户权限、sudo 权限
  • 幂等性问题:重复执行导致数据重复,检查是否具备“存在即跳过”逻辑
  • 超时:增加 retries/delay 或拆分任务

诊断示例:

# 调试 ansible 任务
ansible-playbook /opt/ops/mysql_backup.yml -vvv

# 查看 MySQL 错误日志
tail -n 200 /var/log/mysql/error.log

练习#

  1. 使用 Ansible 编排“参数备份—变更—校验—回滚”流程,并记录审计日志。
  2. 编写脚本检测 Seconds_Behind_Master 并触发重建流程(模拟即可)。
  3. 设计一个并行任务:对 3 台实例进行备份与校验,输出总耗时。