查看原文
其他

ansible自动化:备份管理实践

木讷大叔爱运维 木讷大叔爱运维 2022-07-13





读完需 8 分钟

速读需 4 分钟 



需求

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

  • 服务器或应用故障,需要重新部署;

  • 中间件、应用服务等配置丢失,需要进行恢复;

  • 数据库数据丢失或异常,需要进行数据还原;

  • 系统扩容,需要配置文件;

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


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


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

  • 系统级配置文件

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

  • 应用级配置文件

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

  • 日志级数据

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

  • 数据库备份


问题

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

  1. 备份控制过于分散

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

    2. 配置多样性

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

    3. 重复备份

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

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

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

。。。。。。


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


解决方案



考虑到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" "xxx@xxx.cn" break fidone



3.创建变量文件

vim vars/main.ymlbackup_path: /App/backupdata_backup_center: "192.168.3.119"nginx_logrotate_path: /data/nginx/nginx_logrotatenginx_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、空间等问题可能成为备份的瓶颈,因此对于备份我们还是要提前规划。




事件推送网关: “让基础设施建设动起来”

Grafana+钉钉告警之小细节

cmdb事件推送实现jumpserver资产分组同步

cmdb事件推送实现zabbix资产同步

事件推送网关:让cmdb告别“花瓶”



你与世界

只差一个

公众号




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存