|
批量备份服务器配置文件和目录
功能:
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. 通过循环、判断,对数组中的元素重新赋值;
本脚本下载地址:
[url]http://down.chengyongxu.com/Backup_Config_Files_Of_Remote_Servers.sh[/url]
下载之后请留意版本号和更新日志。
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. |
010 | ################################################################## |
012 | # Local Tmp Dir Of This Script |
013 | THIS_SCRIPT_TMP=/tmp/Do_at_remote_server.sh |
014 | THIS_SCRIPT_TMP_NAME=`echo $THIS_SCRIPT_TMP|awk -F/ '{print $NF}'` |
016 | LOCAL_BACKUP_DIR=/tmp/IDC_config_backup |
018 | # Need Backup Servers And Files List |
019 | REMOTE_SERVER_TMP_DIR=/tmp/Backup_server_config_files_tmp |
020 | NEED_BACKUP_SERVERS=(\ |
030 | /etc/httpd/conf/*.conf \ |
031 | /etc/httpd/conf.d/*.conf \ |
032 | /etc/keepalived/keepalived.conf |
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 \ |
051 | ################################################################## |
055 | ################################################################## |
057 | #========= !!!! Warning ! Don't edit next function !!!! =========# |
058 | # Create Script Tmp File |
060 | cat << EOF > $THIS_SCRIPT_TMP |
063 | NEED_BACKUP_DETAIL=(${NEED_BACKUP_DETAIL}) |
065 | # How many nums the backup needed |
066 | BAKNUM=$KEEP_BACKUP_NUM |
068 | REMOTE_SERVER_TMP_DIR=$REMOTE_SERVER_TMP_DIR |
069 | SERVER_IP=\`/sbin/ifconfig|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "|grep -vE "^10.|^127|^172.16|^192.168"\` |
070 | BACKUP_TIME=\`date +%Y%m%d_%H%M\` |
072 | ################################################################## |
074 | # Compress NEED_BACKUP_DETAIL |
076 | ################################################################## |
077 | # If IPv4 private address only, use hostname.ip |
080 | SERVER_IP=\`hostname\`_\`/sbin/ifconfig|grep "inet addr"|cut -f 2 -d ":"|cut -f 1 -d " "|grep -vE "^127"|head -n 1\` |
084 | if [ ! -d \$REMOTE_SERVER_TMP_DIR ] |
086 | mkdir -p \$REMOTE_SERVER_TMP_DIR |
090 | for file in \${NEED_BACKUP_DETAIL} |
092 | # When you want to backup the file exists, |
093 | # assign to an element of the new array |
096 | NEED_BACKUP_DETAIL_EXISTS[\$num]=\$file |
101 | tar zcfpP \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz \${NEED_BACKUP_DETAIL_EXISTS} |
103 | ################################################################## |
105 | # If files are the same,keep one only |
107 | ################################################################## |
108 | NEW_BACKUP_ARCHIVE_CONTENT=\`tar tvf \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz\` |
109 | for backfile in \`ls \$REMOTE_SERVER_TMP_DIR | grep tar.gz |grep -v \$SERVER_IP.\$BACKUP_TIME\` |
111 | OLD_BACKUP_ARCHIVE_CONTENT=\`tar tvf \$REMOTE_SERVER_TMP_DIR/\$backfile\` |
112 | while [ "\$NEW_BACKUP_ARCHIVE_CONTENT" = "\$OLD_BACKUP_ARCHIVE_CONTENT" ] |
114 | rm -rvf \$REMOTE_SERVER_TMP_DIR/\$SERVER_IP.\$BACKUP_TIME.tar.gz 1 >> \$REMOTE_SERVER_TMP_DIR/delete_new.log |
119 | ################################################################## |
121 | # Keep Some Backup Files Newest |
123 | ################################################################## |
125 | for name in \`ls \$BAKPATH/ |grep -E '[0-9]{6,6}' | sort -r\` |
128 | if [ \$count -gt \$BAKNUM ] ; then |
129 | echo -n "Cleaning old backup: \$name... " |
130 | if [ "\$BAKPATH/\$name" = "/" ] ; then |
134 | rm -rf \$BAKPATH/\$name |
137 | echo "Keeping old backup: \$name" |
144 | Copy_Script_To_Remote (){ |
145 | for server in ${NEED_BACKUP_SERVERS} |
147 | ssh -p $SSH_PORT -tt $SSH_USER@$server << EOT |
148 | mkdir -p $REMOTE_SERVER_TMP_DIR |
151 | scp -P $SSH_PORT $THIS_SCRIPT_TMP $SSH_USER@$server REMOTE_SERVER_TMP_DIR/ |
155 | Backup_On_Remote_Then_Copy_Back (){ |
156 | for server in ${NEED_BACKUP_SERVERS} |
158 | ssh -p $SSH_PORT -tt $SSH_USER@$server << EOP |
159 | chmod o+x $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME |
160 | sh $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME |
161 | rm -f $REMOTE_SERVER_TMP_DIR/$THIS_SCRIPT_TMP_NAME |
164 | rsync -e "ssh -p $SSH_PORT" $SSH_USER@$server REMOTE_SERVER_TMP_DIR/*tar.gz $LOCAL_BACKUP_DIR/ |
168 | ################################################################## |
172 | ################################################################## |
176 | Backup_On_Remote_Then_Copy_Back |
177 | rm -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/
批量备份服务器配置文件和目录
|
|