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" "[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、空间等问题可能成为备份的瓶颈,因此对于备份我们还是要提前规划。

猜你喜欢

转载自blog.csdn.net/yanggd1987/article/details/118943961
今日推荐