内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。
本文档介绍使用Ansible进行备份恢复的自动化配置方法。
风哥提示:
Part01-系统备份
1.1 配置备份Playbook
[root@ansible ~]# cat > /fglinux/ansible/playbooks/backup.yml << 'EOF' --- - name: 系统备份 hosts: all become: yes vars: backup_dir: /backup backup_server: 192.168.1.200 backup_user: backup backup_items: - /etc - /var/www - /var/lib/mysql - /opt/fgedu retention_days: 30 tasks: - name: 创建备份目录 file: path: "{{ backup_dir }}/{{ ansible_date_time.date }}" state: directory mode: '0755' - name: 备份配置文件 archive: path: "{{ item }}" dest: "{{ backup_dir }}/{{ ansible_date_time.date }}/{{ item | basename }}-{{ ansible_date_time.date }}.tar.gz" format: gz loop: "{{ backup_items }}" when: item is exists - name: 备份数据库 shell: | mysqldump -u root -p'{{ mysql_root_password }}' --all-databases > {{ backup_dir }}/{{ ansible_date_time.date }}/all-databases-{{ ansible_date_time.date }}.sql
when: “‘dbservers’ in group_names”
no_log: true
– name: 计算备份文件MD5
stat:
path: “{{ backup_dir }}/{{ ansible_date_time.date }}/{{ item | basename }}-{{ ansible_date_time.date }}.tar.gz”
checksum_algorithm: md5
loop: “{{ backup_items }}”
register: backup_md5
– name: 生成备份报告
copy:
content: |
备份报告
================
主机: {{ inventory_hostname }}
日期: {{ ansible_date_time.date }}
时间: {{ ansible_date_time.time }}
备份文件列表:
{% for item in backup_items %}
– {{ item }}: {{ backup_md5.results[loop.index0].stat.checksum | default(‘N/A’) }}
{% endfor %}
备份大小: {{ backup_md5.results | map(attribute=’stat.size’) | sum }} bytes
dest: “{{ backup_dir }}/{{ ansible_date_time.date }}/backup_report.txt”
– name: 同步到备份服务器
synchronize:
src: “{{ backup_dir }}/{{ ansible_date_time.date }}/”
dest: “/backup/{{ inventory_hostname }}/{{ ansible_date_time.date }}/”
mode: push
set_remote_user: yes
private_key: /root/.ssh/id_rsa
delegate_to: “{{ backup_server }}”
when: backup_server is defined
– name: 清理过期备份
find:
paths: “{{ backup_dir }}”
age: “{{ retention_days }}d”
file_type: directory
register: old_backups
– name: 删除过期备份
file:
path: “{{ item.path }}”
state: absent
loop: “{{ old_backups.files }}”
when: old_backups.files | length > 0
– name: 发送备份通知
mail:
host: smtp.fgedu.net.cn
port: 25
to: admin@fgedu.net.cn
subject: “备份完成 – {{ inventory_hostname }}”
body: |
备份任务已完成
主机: {{ inventory_hostname }}
日期: {{ ansible_date_time.date }}
备份文件数: {{ backup_items | length }}
delegate_to: localhost
EOF
# 执行备份
[root@ansible ~]# ansible-playbook /fglinux/ansible/playbooks/backup.yml
PLAY [系统备份] **************************************************************
TASK [Gathering Facts] ******************************************************
ok: [web1.fgedu.net.cn]
TASK [创建备份目录] **********************************************************
changed: [web1.fgedu.net.cn]
TASK [备份配置文件] **********************************************************
changed: [web1.fgedu.net.cn] => (item=/etc)
changed: [web1.fgedu.net.cn] => (item=/var/www)
changed: [web1.更多视频教程www.fgedu.net.cnfgedu.net.cn] => (item=/opt/fgedu)
TASK [备份数据库] ***********************************************************
学习交流加群风哥QQ113257174skipping: [web1.fgedu.net.cn]
TASK [计算备份文件MD5] *******************************************************
ok: [web1.fgedu.net.cn] => (item=/etc)
ok: [web1.fgedu.net.cn] => (item=/var/www)
ok: [web1.fgedu.net.cn] => (item=/opt/fgedu)
TASK [生成备份报告] **********************************************************
changed: [web1.fgedu.net.cn]
TASK [同步到备份服务器] ******************************************************
changed: [web1.fgedu.net.cn]
TASK [清理过期备份] **********************************************************
ok: [web1.fgedu.net.cn]
TASK [删除过期备份] **********************************************************
skipping: [web1.fgedu.net.cn]
TASK [发送备份通知] **********************************************************
ok: [web1.fgedu.net.cn]
PLAY RECAP ******************************************************************
web1.fgedu.net.cn : ok=8 changed=4 unreachable=0 failed=0 skipped=2
Part02-系统恢复
2.1 恢复Playbook
[root@ansible ~]# cat > /fglinux/ansible/playbooks/restore.yml << 'EOF' --- - name: 系统恢复 hosts: all become: yes vars: backup_date: "{{ lookup('env', 'BACKUP_DATE') | default(ansible_date_time.date) }}" backup_dir: /backup restore_items: - /etc - /var/www - /opt/fgedu tasks: - name: 检查备份文件是否存在 stat: path: "{{ backup_dir }}/{{ backup_date }}" register: backup_check - name: 提示备份不存在 fail: msg: "备份目录 {{ backup_dir }}/{{ backup_date }} 不存在" when: not backup_check.stat.exists - name: 显示备份内容 command: ls -la "{{ backup_dir }}/{{ backup_date }}" register: backup_list changed_when: false - name: 确认恢复操作 pause: prompt: "确认要恢复 {{ backup_date }} 的备份吗?(yes/no)" register: confirm_restore - name: 取消恢复 fail: msg: "用户取消恢复操作" when: confirm_restore.user_input | lower != 'yes' - name: 停止相关服务 service: name: "{{ item }}" state: stopped loop: - nginx - php-fpm ignore_errors: yes - name: 恢复文件 unarchive: src: "{{ backup_dir }}/{{ backup_date }}/{{ item | basename }}-{{ backup_date }}.tar.gz" dest: / remote_src: yes loop: "{{ restore_items }}" - name: 恢复数据库 shell: | mysql -u root -p'{{ mysql_root_password }}' < {{ backup_dir }}/{{ backup_date }}/all-databases-{{ backup_date }}.sql when: "'dbservers' in group_names" no_log: true - name: 启动服务 service: name: "{{ item }}" state: started loop: - nginx - php-fpm - name: 验证恢复 command: systemctl status nginx register: service_status changed_when: false - name: 显示恢复结果 debug: msg: "恢复完成,服务状态: {{ service_status.stdout_lines[2] }}" EOF # 执行恢复 [root@ansible ~]# ansible-playbook /fglinux/ansible/playbooks/restore.yml -e "backup_date=2026-04-03" PLAY [系统恢复] ************************************************************** TASK [Gathering Facts] ****************************************************** ok: [web1.fgedu.net.cn] TASK [检查备份文件是否存在] ************************************************** ok: [web1.fgedu.net.cn] TASK [显示备份内容] ********************************************************** ok: [web1.fgedu.net.cn] TASK [确认恢复操作] ********************************************************** [pause] 确认要恢复 2026-04-03 的备份吗?(yes/no): yes ok: [web1.fgedu.net.cn] TASK [取消恢复] ************************************************************* skipping: [web1.fgedu.net.cn] TASK [停止相关服务] ***************************************更多学习教程公众号风哥教程itpux_com******************* changed: [web1.fgedu.net.cn] => (item=nginx)
changed: [web1.fgedu.net.cn] => (item=php-fpm)
TASK [恢复文件] *************************************************************学习交流加群风哥微信: itpux-com
changed: [web1.fgedu.net.cn] => (item=/etc)
changed: [web1.fgedu.net.cn] => (item=/var/www)
changed: [web1.fgedu.net.cn] => (item=/opt/fgedu)
TASK [恢复数据库] ***********************************************************
skipping: [web1.fgedu.net.cn]
TASK [启动服务] *************************************************************
changed: [web1.fgedu.net.cn] => (item=nginx)
changed: [web1.fgedu.net.cn] => (item=php-fpm)
TASK [验证恢复] *************************************************************
ok: [web1.fgedu.net.cn]
TASK from PG视频:www.itpux.com[显示恢复结果] **********************************************************
ok: [web1.fgedu.net.cn] => {
“msg”: “恢复完成,服务状态: Active: active (running) since Fri 2026-04-04 04:00:00 CST; 1s ago”
}
PLAY RECAP ******************************************************************
web1.fgedu.net.cn : ok=9 changed=3 unreachable=0 failed=0 skipped=2
- 定期执行备份任务
- 验证备份文件完整性
- 异地备份存储
- 定期测试恢复流程
- 记录备份恢复日志
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
