批量备份服务器配置文件和目录
批量备份服务器配置文件和目录功能:
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. 通过循环、判断,对数组中的元素重新赋值;
本脚本下载地址:
http://down.chengyongxu.com/Backup_Config_Files_Of_Remote_Servers.sh
下载之后请留意版本号和更新日志。
001#!/bin/bash
002##################################################################
003# Backup_Config_Files_Of_Remote_Servers
004# Env: Centos 5.5 x86_64
005# Created by Hernan on 2011-04-06
006# Copyright 2010 __Chengyongxu.com__. All rights reserved.
007#
008# Version: 1.4.6
009# Revision History
010##################################################################
011
012# Local Tmp Dir Of This Script
013THIS_SCRIPT_TMP=/tmp/Do_at_remote_server.sh
014THIS_SCRIPT_TMP_NAME=`echo $THIS_SCRIPT_TMP|awk -F/ '{print $NF}'`
015# Local Backup Dir
016LOCAL_BACKUP_DIR=/tmp/IDC_config_backup
017
018# Need Backup Servers And Files List
019REMOTE_SERVER_TMP_DIR=/tmp/Backup_server_config_files_tmp
020NEED_BACKUP_SERVERS=(\
02110.0.0.52
022server_a_ip \
023server_b_ip \
024server_c_ip \
025server_d_ip \
026chengyongxu.com \
027)
028NEED_BACKUP_DETAIL=(\
029/etc/hosts \
030/etc/httpd/conf/*.conf \
031/etc/httpd/conf.d/*.conf \
032/etc/keepalived/keepalived.conf
033/etc/my.cnf \
034/etc/postfix \
035/root/bin/*sh \
036/usr/local/nagios/etc/nagios.cfg \
037/usr/local/nagios/etc/objects/*cfg \
038/usr/local/nginx/conf \
039/usr/local/php/etc/php.ini \
040/usr/local/php/etc/php-fpm.conf \
041/usr/local/php-fcgi/etc/php.ini \
042/usr/local/php-fcgi/etc/php-fpm.conf \
043/usr/local/sphinx/etc/*.conf \
044/var/spool/cron \
045)
046KEEP_BACKUP_NUM=10
047
048SSH_PORT=22
049SSH_USER=root
050
051##################################################################
052#
053# Global Functions
054#
055##################################################################
056
057#========= !!!! Warning ! Don't edit next function !!!! =========#
058# Create Script Tmp File
059Create_Script (){
060cat << EOF > $THIS_SCRIPT_TMP
061#!/bin/bash
062
063NEED_BACKUP_DETAIL=(${NEED_BACKUP_DETAIL[*]})
064
065# How many nums the backup needed
066BAKNUM=$KEEP_BACKUP_NUM
067
068REMOTE_SERVER_TMP_DIR=$REMOTE_SERVER_TMP_DIR
069SERVER_IP=\`/sbin/ifconfig|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "|grep -vE "^10.|^127|^172.16|^192.168"\`
070BACKUP_TIME=\`date +%Y%m%d_%H%M\`
071
072##################################################################
073#
074# Compress NEED_BACKUP_DETAIL
075#
076##################################################################
077# If IPv4 private address only, use hostname.ip
078if [ -z \$SERVER_IP ]
079then
080 SERVER_IP=\`hostname\`_\`/sbin/ifconfig|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "|grep -vE "^127"|head -n 1\`
081fi
082
083# Create Tpm dir
084if [ ! -d \$REMOTE_SERVER_TMP_DIR ]
085then
086 mkdir -p \$REMOTE_SERVER_TMP_DIR
087fi
088
089# Compress
090for file in \${NEED_BACKUP_DETAIL[*]}
091do
092 # When you want to backup the file exists,
093 # assign to an element of the new array
094 while [ -e \$file ]
095 do
096 NEED_BACKUP_DETAIL_EXISTS[\$num]=\$file
097 let num++
098 break
099 done
100done
101tar zcfpP \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz \${NEED_BACKUP_DETAIL_EXISTS[*]}
102
103##################################################################
104#
105# If files are the same,keep one only
106#
107##################################################################
108NEW_BACKUP_ARCHIVE_CONTENT=\`tar tvf \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz\`
109for backfile in \`ls \$REMOTE_SERVER_TMP_DIR | grep tar.gz |grep -v \$SERVER_IP.\$BACKUP_TIME\`
110do
111 OLD_BACKUP_ARCHIVE_CONTENT=\`tar tvf \$REMOTE_SERVER_TMP_DIR/\$backfile\`
112 while [ "\$NEW_BACKUP_ARCHIVE_CONTENT" = "\$OLD_BACKUP_ARCHIVE_CONTENT" ]
113 do
114 rm -rvf \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz 1 >> \$REMOTE_SERVER_TMP_DIR/delete_new.log
115 break
116 done
117done
118
119##################################################################
120#
121# Keep Some Backup Files Newest
122#
123##################################################################
124count=0
125for name in \`ls \$BAKPATH/ |grep -E '{6,6}' | sort -r\`
126do
127count=\$((count+1))
128if [ \$count -gt \$BAKNUM ] ; then
129 echo -n "Cleaning old backup: \$name... "
130 if [ "\$BAKPATH/\$name" = "/" ] ; then
131 echo "No rm -rf /!"
132 exit 1
133 fi
134 rm -rf \$BAKPATH/\$name
135 echo " Done."
136else
137 echo "Keeping old backup: \$name"
138fi
139done
140exit
141EOF
142}
143
144Copy_Script_To_Remote (){
145for server in ${NEED_BACKUP_SERVERS[*]}
146do
147ssh -p $SSH_PORT -tt $SSH_USER@$server << EOT
148mkdir -p $REMOTE_SERVER_TMP_DIR
149exit
150EOT
151scp -P $SSH_PORT $THIS_SCRIPT_TMP $SSH_USER@$server:$REMOTE_SERVER_TMP_DIR/
152done
153}
154
155Backup_On_Remote_Then_Copy_Back (){
156for server in ${NEED_BACKUP_SERVERS[*]}
157do
158ssh -p $SSH_PORT -tt $SSH_USER@$server << EOP
159chmod o+x $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME
160sh $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME
161rm -f $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME
162exit
163EOP
164rsync -e "ssh -p $SSH_PORT" $SSH_USER@$server:$REMOTE_SERVER_TMP_DIR/*tar.gz $LOCAL_BACKUP_DIR/
165done
166}
167
168##################################################################
169#
170# Main
171#
172##################################################################
173#
174Create_Script
175Copy_Script_To_Remote
176Backup_On_Remote_Then_Copy_Back
177rm -rf $THIS_SCRIPT_TMP
http://www.chengyongxu.com/blog/%E6%89%B9%E9%87%8F%E5%A4%87%E4%BB%BD%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95/
批量备份服务器配置文件和目录
页:
[1]