管理资源吧

当前位置:管理资源吧首页>>>tech>>>c1>>>服务器教程

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

[Ok3w_NextPage]

  /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

[Ok3w_NextPage]

  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

[Ok3w_NextPage]

  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

tech首页 更多tech