linux批量备份服务器配置文件和目录的脚本
linux批量备份服务器配置文件和目录的脚本
发布时间:2016-12-28 来源:查字典编辑
摘要:功能:1.只在备份机执行,远程的服务器只需要允许备份机用root通过密钥登录;2.在备份机上配置需要备份哪些服务器,在NEED_BACKUP...

功能:

1. 只在备份机执行,远程的服务器只需要允许备份机用root通过密钥登录;

2. 在备份机上配置需要备份哪些服务器,在NEED_BACKUP_SERVERS这个数组增减;

3. 在备份机上配置需要备份服务器上哪些文件,在NEED_BACKUP_DETAIL这个数组增减,如果需要备份某台服务器上NEED_BACKUP_DETAIL数组里定义的某个文件就备份,不存在的文件则自动跳过,例如Web服务器上没my.cnf , 也没有影响;

4. 如果服务器上产生的新备份和已经存在已往备份内容一样则只保留时间较早的备份。因为服务器的配置文件不是经常改动的;

5. 通过修改定义KEEP_BACKUP_NUM为个变量,可以决定远程服务器上保留最近多少份备份,我这里定义的是10份。备份机上保留所有远程服务器的备份。因为配置文件都比较小,不用担心磁盘空间占用问题。

用过下列技术:

1. 获取远程服务器IP,如果某台服务器没有公网IP则使用该服务器的“主机名_IP.备份年月日_备份时间.tar.gz

2. 通过循环、判断,对数组中的元素重新赋值;

下载之后请留意版本号和更新日志。

复制代码 代码如下:

#!/bin/bash

##################################################################

# Backup_Config_Files_Of_Remote_Servers

# Env: Centos 5.5 x86_64

# Created by Hernan on 2011-04-06

# Copyright 2010 __Chengyongxu.com__. All rights reserved.

#

# Version: 1.4.6

# Revision History

##################################################################

# Local Tmp Dir Of This Script

THIS_SCRIPT_TMP=/tmp/Do_at_remote_server.sh

THIS_SCRIPT_TMP_NAME=`echo $THIS_SCRIPT_TMP|awk -F/ '{print $NF}'`

# Local Backup Dir

LOCAL_BACKUP_DIR=/tmp/IDC_config_backup

# Need Backup Servers And Files List

REMOTE_SERVER_TMP_DIR=/tmp/Backup_server_config_files_tmp

NEED_BACKUP_SERVERS=(

10.0.0.52

server_a_ip

server_b_ip

server_c_ip

server_d_ip

chengyongxu.com

)

NEED_BACKUP_DETAIL=(

/etc/hosts

/etc/httpd/conf/*.conf

/etc/httpd/conf.d/*.conf

/etc/keepalived/keepalived.conf

/etc/my.cnf

/etc/postfix

/root/bin/*sh

/usr/local/nagios/etc/nagios.cfg

/usr/local/nagios/etc/objects/*cfg

/usr/local/nginx/conf

/usr/local/php/etc/php.ini

/usr/local/php/etc/php-fpm.conf

/usr/local/php-fcgi/etc/php.ini

/usr/local/php-fcgi/etc/php-fpm.conf

/usr/local/sphinx/etc/*.conf

/var/spool/cron

)

KEEP_BACKUP_NUM=10

SSH_PORT=22

SSH_USER=root

##################################################################

#

# Global Functions

#

##################################################################

#========= !!!! Warning ! Don't edit next function !!!! =========#

# Create Script Tmp File

Create_Script (){

cat << EOF > $THIS_SCRIPT_TMP

#!/bin/bash

NEED_BACKUP_DETAIL=(${NEED_BACKUP_DETAIL[*]})

# How many nums the backup needed

BAKNUM=$KEEP_BACKUP_NUM

REMOTE_SERVER_TMP_DIR=$REMOTE_SERVER_TMP_DIR

SERVER_IP=`/sbin/ifconfig|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "|grep -vE "^10.|^127|^172.16|^192.168"`

BACKUP_TIME=`date +%Y%m%d_%H%M`

##################################################################

#

# Compress NEED_BACKUP_DETAIL

#

##################################################################

# If IPv4 private address only, use hostname.ip

if [ -z $SERVER_IP ]

then

SERVER_IP=`hostname`_`/sbin/ifconfig|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "|grep -vE "^127"|head -n 1`

fi

# Create Tpm dir

if [ ! -d $REMOTE_SERVER_TMP_DIR ]

then

mkdir -p $REMOTE_SERVER_TMP_DIR

fi

# Compress

for file in ${NEED_BACKUP_DETAIL[*]}

do

# When you want to backup the file exists,

# assign to an element of the new array

while [ -e $file ]

do

NEED_BACKUP_DETAIL_EXISTS[$num]=$file

let num++

break

done

done

tar zcfpP $REMOTE_SERVER_TMP_DIR/$SERVER_IP.$BACKUP_TIME.tar.gz ${NEED_BACKUP_DETAIL_EXISTS[*]}

##################################################################

#

# If files are the same,keep one only

#

##################################################################

NEW_BACKUP_ARCHIVE_CONTENT=`tar tvf $REMOTE_SERVER_TMP_DIR/$SERVER_IP.$BACKUP_TIME.tar.gz`

for backfile in `ls $REMOTE_SERVER_TMP_DIR | grep tar.gz |grep -v $SERVER_IP.$BACKUP_TIME`

do

OLD_BACKUP_ARCHIVE_CONTENT=`tar tvf $REMOTE_SERVER_TMP_DIR/$backfile`

while [ "$NEW_BACKUP_ARCHIVE_CONTENT" = "$OLD_BACKUP_ARCHIVE_CONTENT" ]

do

rm -rvf $REMOTE_SERVER_TMP_DIR/$SERVER_IP.$BACKUP_TIME.tar.gz 1 >> $REMOTE_SERVER_TMP_DIR/delete_new.log

break

done

done

##################################################################

#

# Keep Some Backup Files Newest

#

##################################################################

count=0

for name in `ls $BAKPATH/ |grep -E '[0-9]{6,6}' | sort -r`

do

count=$((count+1))

if [ $count -gt $BAKNUM ] ; then

echo -n "Cleaning old backup: $name... "

if [ "$BAKPATH/$name" = "/" ] ; then

echo "No rm -rf /!"

exit 1

fi

rm -rf $BAKPATH/$name

echo " Done."

else

echo "Keeping old backup: $name"

fi

done

exit

EOF

}

Copy_Script_To_Remote (){

for server in ${NEED_BACKUP_SERVERS[*]}

do

ssh -p $SSH_PORT -tt $SSH_USER@$server << EOT

mkdir -p $REMOTE_SERVER_TMP_DIR

exit

EOT

scp -P $SSH_PORT $THIS_SCRIPT_TMP $SSH_USER@$server:$REMOTE_SERVER_TMP_DIR/

done

}

Backup_On_Remote_Then_Copy_Back (){

for server in ${NEED_BACKUP_SERVERS[*]}

do

ssh -p $SSH_PORT -tt $SSH_USER@$server << EOP

chmod o+x $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME

sh $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME

rm -f $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME

exit

EOP

rsync -e "ssh -p $SSH_PORT" $SSH_USER@$server:$REMOTE_SERVER_TMP_DIR/*tar.gz $LOCAL_BACKUP_DIR/

done

}

##################################################################

#

# Main

#

##################################################################

#

Create_Script

Copy_Script_To_Remote

Backup_On_Remote_Then_Copy_Back

rm -rf $THIS_SCRIPT_TMP

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新linuxshell学习
热门linuxshell学习
脚本专栏子分类