Ansible通过调用mysqldump等命令+脚本分发+cron错峰调度实现稳健数据库备份;要求脚本独立、绝对路径、环境隔离、时间戳兼容、认证文件化、主机哈希散列错峰、配置幂等推送、敏感信息加密、自动压缩校验及7天清理策略。

Ansible 本身不直接备份数据库,而是通过调用本地或远程命令(如 mysqldump、pg_dump)+ 文件分发 + 定时调度,实现标准化、可复用的批量备份。关键不在“能不能做”,而在“怎么做得稳、不踩坑、能散列、可验证”。
备份脚本必须独立、路径绝对、环境隔离
别把命令塞进 shell 模块拼接多行——易因引号、换行、变量转义失败。正确做法是:用 copy 模块把完整脚本推到目标机,再用 command 或 shell 执行。
- 脚本第一行固定写
#!/bin/bash,避免解释器不一致 - 所有命令用绝对路径:
/usr/bin/mysqldump、/bin/date、/usr/bin/find - 时间戳用
$(/bin/date +%Y%m%d_%H%M%S),不用date -I(旧版 coreutils 不支持) - MySQL 认证不用
source ~/.my.cnf,改用--defaults-extra-file=/root/.my.cnf - 不依赖
PATH或别名,shell模块默认不读~/.bashrc
避开高峰期:用主机哈希控制分钟偏移
上百台服务器如果统一在 2:00 执行 dump,会瞬间打满磁盘 IO 和 MySQL 连接数。Ansible 不调度时间,靠 cron + 主机唯一散列实现错峰。
- 在 Playbook 中用 Jinja2 表达式计算每台机器的执行分钟:
{{ inventory_hostname | hash('md5') | int(0, 16) % 60 }} - 用
cron模块注册任务,minute字段填该表达式结果,hour: 2 - 最终每台机器备份时间落在 02:00–02:59 之间,分布均匀,无堆积
配置统一、幂等写入、权限可控
备份脚本和配置文件不能靠人工上传或手动编辑,要用 Ansible 模块确保一致性。
- 用
copy模块推送备份脚本,mode: '0755'设置可执行权限 - 用
file模块创建备份目录(如/backup/mysql),owner: mysql,group: mysql - 用
lineinfile或blockinfile管理 MySQL 配置(如max_allowed_packet),避免手动改错 - 敏感凭证(如数据库密码)放在
group_vars/加密文件中,用ansible-vault保护
验证与清理:加检查、设保留策略
备份成功 ≠ 备份可用。自动加校验和、压缩、过期清理,才能真正落地。
- 脚本末尾加
gzip -f {{ backup_file }}压缩,减小存储压力 - 用
stat模块检查备份文件大小是否 > 1MB(防空文件),失败则 fail - 用
find命令 +shell模块定期清理:保留最近 7 天,find /backup/mysql -name "*.sql.gz" -mtime +7 -delete - 备份后可选执行
mysqlcheck --all-databases --check快速校验表完整性


















