linux批量备份服务器配置文件和目录的脚本

这篇文章主要介绍了linux下批量备份服务器配置文件和目录的方法,需要的朋友可以参考下

功能:
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

(0)

相关推荐

  • Linux系统中的usr目录有哪些

    Linux 系统文件结构中,有这么一个神奇的目录那就是usr.之前一直都没有去关注过它,反正程序已经安装在里面,我也不知道有什么用就放在哪里了,后来 fedora 要简化整个文件系统体系,这才看到才想 ...

  • 详解Linux系统中的usr目录

    linux 文件结构中,有一个很神奇的目录 —— /usr.之前一直没有怎么关注过它,反正程序都是安装在里边的,也没有什么值得追根溯源的东西.直到有一天 fedora 要简化整个文件系统体系,看到讨论 ...

  • linux批量查找替换文本

    如何用shell命令实现,批量地查找某个目录下的所有文本文件中的某个字符串呢?当然,更常见的情况是你要替换它们.所以要怎么做? 本文以将国外开源web模板中的谷歌字体库替换为国内360CDN为例子,教 ...

  • linux系统根目录下各个目录用途说明

    linux系统根目录下各个目录用途说明 操作方法 01 1./ 根目录 --------- 所有目录挂在其下 2./boot --------- 存放Ubuntu内核和系统启动文件.系统启动时这些文件 ...

  • Linux下非交互式远程执行命令脚本

    Linux下非交互式远程执行命令脚本(比ssh更好的方式) openssh在每台机器上都有,ssh与scp经常出现在我们的生活中。 然而当要管理的机器规模越来越大时,ssh登陆到目标机器进行管理就变得 ...

  • 批量修改Linux下的文件或目录权限

    启发: CU里的一个用户用"#chown -R 777 /*"后,系统瘫痪了. 有网友建议用下面的命令把另一个新的相同系统的所有文件和目录的权限导入该系统. 其实就是这两个命令的应用. 目标:setf ...

  • linux批量管理推送工具mussh和pssh介绍

    mussh 是shell开发的一个小工具,pssh是python开发的一个用来批量管理linux主机的工具,现在我们来介绍mussh和pssh的使用方法。 先说下mussh,mussh 是shell开 ...

  • linux多服务器之间的目录文件同步

    web1:10.80.11.243 web2:10.80.11.244 code:10.80.11.245 更新code服务器的代码后,自动同步到web1和web2,删除code服务器文件,web1和 ...

  • linux中bin与sbin目录的作用及区别介绍

    在linux系统中,有两个重要的目录:bin与sbin,分别包括/bin、/usr/bin/与/sbin、/usr/sbin/。 bin: bin为binary的简写,主要放置系统的必备执行文件,例如 ...