ansible自动化:备份管理实践

在这里插入图片描述

需求

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

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

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

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

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

  • 系统级配置文件

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

  • 应用级配置文件

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

  • 日志级数据

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

  • 数据库备份

问题

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

  1. 备份控制过于分散

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

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

     重复备份会导致备份效率下降
    
  4. 备份网卡流量较大,影响网络

  5. 异地备份中心磁盘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" "xxx@xxx.cn"
        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、空间等问题可能成为备份的瓶颈,因此对于备份我们还是要提前规划。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Ansible是一种开源的自动化运维技术,具有简单易用、功能强大的特点。它可以通过SSH协议远程管理和配置服务器,实现服务器的自动化部署、配置和管理。 在使用Ansible进行自动化运维的过程中,有一些最佳实践可以帮助提高工作效率和保证系统的稳定性。 首先,合理划分和管理Ansible的资源文件和配置文件是非常重要的。资源文件包括主机清单文件和变量文件,可以根据不同的项目或环境进行划分,方便管理和使用。配置文件包括ansible.cfg和ansible-playbook的配置文件,可以根据需要进行修改,以满足具体的需求。 其次,模块的选择和使用也是关键。Ansible提供了丰富的模块用于管理各种不同类型的服务器和应用程序,如文件操作、服务管理、软件安装等。合理选择和使用这些模块,可以更高效地完成自动化任务。 另外,变量的使用可以帮助提高Ansible的灵活性和可复用性。可以将一些常用的参数和配置项定义为变量,方便在不同的任务和剧本中使用,减少重复工作。 还有,使用角色的概念可以帮助组织和管理Ansible的剧本文件。角色是一种组织剧本文件的方式,通过将任务和配置组织成相互独立的角色,可以提高代码的可读性和可维护性。 此外,使用Ansible的剧本文件进行版本控制,可以方便团队成员协作和问题追踪,保证系统的一致性和可追溯性。 最后,定期备份和监控Ansible的运行状态也是不可忽视的。备份Ansible的资源文件和配置文件,可以避免因为误操作而导致的配置丢失。监控Ansible的运行状态,可以及时发现和解决问题,保证系统的稳定性。 总之,通过合理的资源和配置文件管理、模块和变量的使用、角色和版本控制、备份和监控等最佳实践,可以充分发挥Ansible自动化运维技术的优势,提高工作效率,确保系统的稳定性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值