Ansible 不是备份软件但可高效协调备份任务,通过调用 rsync、tar、mysqldump 等原生工具执行实际操作,并集中管理路径、时间、保留策略与归档逻辑。

Ansible 本身不是备份软件,但它能高效协调和执行备份任务。核心思路是:用 Ansible 统一调度、调用系统原生工具(如 rsync、tar、mysqldump)完成实际备份动作,并集中管理路径、时间、保留策略和归档逻辑。
明确备份对象与方式
先确认要备份什么,再选对应方法:
-
配置文件或普通目录:用
copy模块拉取(fetch)到控制机,或用shell/command模块在被控机本地打包压缩后拉回 -
GitLab / Confluence 等应用数据:调用其官方备份命令(如
gitlab-backup create),再统一归档 -
MySQL / PostgreSQL 数据库:用
shell模块执行mysqldump或pg_dump,输出到指定路径 -
增量同步场景:结合
rsync命令,通过shell或command模块调用,利用其--delete和--link-dest实现快照式备份
编写可复用的 Playbook
一个典型备份任务结构如下(以备份 Nginx 配置为例):
---
- name: Backup critical config files
hosts: web_servers
gather_facts: no
tasks:
- name: Create backup directory on control node
file:
path: "/backup/{{ inventory_hostname }}"
state: directory
mode: '0755'
<pre class="brush:php;toolbar:false;">- name: Fetch nginx.conf from remote host
fetch:
src: /etc/nginx/nginx.conf
dest: "/backup/{{ inventory_hostname }}/nginx.conf_{{ ansible_date_time.iso8601_basic_short }}"
flat: yes
- name: Compress backup folder daily
shell: "cd /backup && tar -czf {{ inventory_hostname }}_$(date +'%Y%m%d').tar.gz {{ inventory_hostname }}"
args:
executable: /bin/bash关键点:
- 使用
fetch模块把远程文件“拉”到 Ansible 控制机,避免依赖远程存储空间 - 文件名中嵌入
{{ ansible_date_time.iso8601_basic_short }}实现时间戳区分 - 用
shell模块调用tar打包,便于归档与传输 - 所有路径用变量(如
{{ inventory_hostname }})隔离,支持多主机并行
集成定时与归档机制
单次执行不够,需自动化:
- 用
cron模块在控制机上部署定时任务,定期运行 Playbook:ansible-playbook /opt/backup/gitlab.yml --limit gitlab - 备份完成后,用
shell+rsync将本地备份目录同步至异地 NAS 或备份服务器,实现二级保护 - 配合
find命令清理过期备份(如保留最近 7 天):find /backup -name "*.tar.gz" -mtime +7 -delete
验证与容错设计
备份无效等于没备:
- 每个备份任务后加
stat模块检查目标文件是否存在、大小是否非零 - 对数据库导出,用
shell执行head -n 20 dump.sql | grep -q "Dump completed"判断是否成功结束 - 失败时触发
debug或发邮件通知(可用mail模块或调用curl推送企业微信/钉钉) - Playbook 开头设
any_errors_fatal: true,确保任一环节失败即中止,防止部分备份掩盖问题


















