ansible自动化:备份管理实践

您所在的位置:网站首页 ansible日志 ansible自动化:备份管理实践

ansible自动化:备份管理实践

2024-07-14 09:01| 来源: 网络整理| 查看: 265

在这里插入图片描述

需求

运维过程中经常遇到的场景:

服务器或应用故障,需要重新部署;中间件、应用服务等配置丢失,需要进行恢复;数据库数据丢失或异常,需要进行数据还原;系统扩容,需要配置文件;

以上场景比较可靠的解决方式就是从备份进行恢复,因此备份管理就成为了我们最后的“杀手锏”。

备份位置一般分为本地备份和异地备份,本地备份的保存时间较短(如:一个月),避免占用过多磁盘空间;而异地备份的保存时间较长(如:一年)。具体情况可按监管要求进行存放。

根据不同的需求,我们可将备份内容分为以下几种类型:

系统级配置文件

内核参数、hosts解析、crontab计划任务、环境变量、防火墙等\

应用级配置文件

nginx、java应用、中间件、dns、数据库等\

日志级数据

binlog日志、应用日志、nginx日志等\

数据库备份

问题

通过分析备份位置、备份类型两个方面,可以说是覆盖了备份80%的需求,但是剩下20%的问题对于我们来说可能比较棘手:

备份控制过于分散

通常情况下我们在每台服务器上通过shell+crontab来进行定时备份,一旦需求变更,脚本管理难度增大;

配置多样性

对于不同应用、不同需求、不同场景,我们的配置会繁杂多样,因此导致我们脚本需要适配各种场景,很难完全兼容;

重复备份

重复备份会导致备份效率下降

备份网卡流量较大,影响网络

异地备份中心磁盘IO不足,异地备份耗时

。。。。。。

以上都是我们在做备份时可能遇到的问题,除了在硬件方便提供足够的空间、磁盘IO、千兆或更高的网卡流量等,我们运维要做的就是在备份流程控制方面提出更适合我们的方案。

解决方案

24.png

考虑到ansible的ssh控制及天然的幂等性,我们在此使用"ansible-playbook + rsync"的方式实现集中化控制:

由于ansible 统一对所有服务器进行控制,因此需要对不同的备份类型进行判断,匹配则备份,不匹配则不备份;ansible根据类型先备份到本地统一目录,然后再将统一的本地目录备份通过rsync备份至远程备份中心;

通过ansible集中化管理,我们虽然可以实现在控制端对脚本进行统一管理,但是对于多样性配置,我们还是需要基于相关的配置管理规范进行规范化配置,否则多样性的问题还是会影响我们。

具体实现 1.目录结构 [root@test ansible]# tree /etc/ansible ├── ansible.cfg ├── hosts ├── data_backup.yml ├── roles │ ├── databak │ │ ├── tasks │ │ │ ├── create_dir.yml │ │ │ ├── del_30_days_ago_dir.yml │ │ │ ├── http_conf.yml │ │ │ ├── keepalived.yml │ │ │ ├── nginx_conf.yml │ │ │ ├── mysql_conf.yml │ │ │ ├── sys_conf.yml │ │ │ ├── mysql_conf.yml │ │ │ ├── rsync.yml │ │ │ └── main.yml │ │ └── vars │ │ └── main.yml

我们按playbook组织目录结构,其中:

tasks:备份不同类型的文件并进行本地、异地控制;vars:本次备份用到的变量 2.创建数据备份角色文件 vim data_backup.yml - hosts: "{{ host_ip }}" remote_user: root gather_facts: False roles: - databak

对于不同服务器ip,配合脚本以传参的形式传给host_ip,实现批量备份,再辅助crontab可实现定时备份。

以下脚本可作为参考:

vim ansible_all_data_backup.sh #!/bin/bash today_date=`date "+%Y%m%d"` yesterday_date=`date -d yesterday "+%Y%m%d"` old_date=`date -d "30 days ago" "+%Y%m%d"` for host in `cat host_list | grep -v "^#"` do echo "`date "+%Y-%m-%d %H:%M:%S"`---${host} start backup." >> /App/logs/ansible_all_data_backup.log ansible-playbook ansible-playbook/data_backup.yml --extra-vars="host_ip=${host} today_date=${today_date} yesterday_date=${yesterday_date} old_date=${old_date}" >> /App/logs/ansible_all_data_backup.log 2>&1 if [ $? -eq 0 ] then echo "`date "+%Y-%m-%d %H:%M:%S"`---${host} backup finished, start backup next host." >> /App/logs/ansible_all_data_backup.log else echo "`date "+%Y-%m-%d %H:%M:%S"`---${host} backup failed." >> /App/logs/ansible_all_data_backup.log echo "${host} data backup failed\n`tail -10 /App/logs/ansible_all_data_backup.log`" | mail -s "[ansible] ${host} data backup failed" "[email protected]" break fi done 3.创建变量文件 vim vars/main.yml backup_path: /App/backup data_backup_center: "192.168.3.119" nginx_logrotate_path: /data/nginx/nginx_logrotate nginx_logrotate_path_json: /App/logs/nginx_logrotate #以下三个变量为默认值,由于ansible --extra-vars传入变量参数的优先级最高,所以以--extra-vars传入为准,这里设置默认值是为了避免--extra-vars传入空值导致报错 today_date: "19700101" yesterday_date: "19700101" old_date: "19700101"

其中:

backup_path 是我们本地统一备份目录;

data_backup_center 是我们远程备份中心;

nginx_logrotate 是我们nginx相关的日志目录;

其他为控制本地备份保存时间的变量;

4.创建任务文件 # 1.操作系统级配置文件 vim tasks/sys_conf.yml #备份各系统相关的配置文件 - name: backup system config file to {{ backup_path }}/{{ today_date }}/config command: chdir={{ backup_path }}/{{ today_date }}/config cp -rfv {{ item }} . ignore_errors: True with_items: - /etc/hosts - /etc/rc.d/rc.local - /etc/crontab - /var/spool/cron - /App/scripts - /etc/zabbix/zabbix_agentd.d - /opt/shell - /etc/profile # 2.应用级配置问及那 vim tasks/nginx_conf.yml #先判断本机是否安装nginx,若安装备份nginx配置文件目录到本机备份目录,/usr/local/openresty/nginx为固定安装路径。 - name: Nginx installed or not stat: path=/usr/local/openresty/nginx/sbin/nginx register: nginx_results - name: backup nginx config file to {{ backup_path }}/{{ today_date }}/config command: chdir={{ backup_path }}/{{ today_date }}/config cp -rfv /usr/local/openresty/nginx/conf ./nginx_conf when: nginx_results.stat.exists

如上:

由于我们的操作系统都是标准化的,因此操作系统级配置文件直接备份即可;不同应用依赖的服务不同,应用级配置文件会出行多样化,因此我们先行根据备份类型判断是否应用是否存在,再进行备份; 5.具体执行 #检查文件 [root@test ansible]# ansible-playbook -C data_backup.yml #执行playbook,单台备份 [root@test ansible]# ansible-playbook -e host_ip=10.10.2.1 data_backup.yml # 脚本执行,批量备份 [root@test ansible]# bash ansible_all_data_backup.sh 总结

随着备份类型及量级的不断增多,此时单一的备份中心由于磁盘IO、空间等问题可能成为备份的瓶颈,因此对于备份我们还是要提前规划。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3