Backup em Rede
Diversos artigos na internet mostram como fazer um backup remoto de servidores Linux de forma automática.
Colhi muitas informações e fiz um script para que diáriamente o backup seja feito.
O script (bin/backup_rsync.sh) tá disponível abaixo.
#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%
#
# Programa: /root/bin/backup_rsync.sh
#
# Autor: Jarbas Peixoto Júnior - DATAPREV/GO
# jarbas.junior@gmail.com - (0xx62) 3501-2248
#
# Comentarios: Efetua backup remoto via rsync sem senha
#
# Alterações: 30/11/2004 - Jarbas Peixoto Júnior - Versão Preliminar
# 29/12/2004 - Jarbas - atualizar a data do servidor remoto
# 04/01/2004 - Jarbas - mostrar estatísticas de transferências
#
# OBSERVACAO IMPORTANTE - OBSERVACAO IMPORTANTE - OBSERVACAO IMPORTANTE
#-------------------------------------------------------------------------------
# Obs.: Há a necessidade de o servidor remoto ter instalado (e rodando) o sshd
# configurado para permitir login remoto do root.
# Veja no google: rsync sem senha
#
#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%
# Habitila o Cancelamento através do ^C ou "kill"
trap _abort 1 2 15
# Na saída normal apaga arq.temporários criados
trap _limpa_arq_temp 0
#--------------------------------------------------------------------
# Apaga arquivos temporários utilizados
_limpa_arq_temp()
{ # BEGIN _limpa_arq_temp
rm -rf $ARQ_LOG $ARQ_ERROS $ARQ_ALERTA > /dev/null
} # END _limpa_arq_temp
#--------------------------------------------------------------------
# Informa sobre o Cancelamento do Backup por Usuário
_abort()
{ # BEGIN _abort
echo >&2
echo '!!! Rotina CANCELADA por usuário.' >&2
echo >&2
exit 1
} # END _abort
# Verificar se o parmâmetro passado é um IP válido
if [ $# -ne 2 ]; then
echo "Sintaxe: $0 " >&2
exit 1
fi
IP_REMOTO="$1" # Pega o primeiro parâmetro como IP-REMOTO
LOCALIDADE=$2 # Descrição da Localidade
# Diretórios que não serão backapeados
EXCLUIR="/bin /boot /dev /hd2 /home2 /initrd /lib /lost+found /mnt /opt /proc /sbin/ /sys /srv /tftpboot /tmp /usr"
# Diretório Base do Backup via RSYNC
HOME_RSYNC="/hd2/rsync"
# Email de confirmação de execucao
EMAIL_OK="jarbas.peixoto@previdencia.gov.br, carlos.natal@previdencia.gov.br"
# Email de Erro de Execução
EMAIL_ERROR="jarbas.peixoto@previdencia.gov.br, carlos.natal@previdencia.gov.br"
# IP da Máquina Local - Servidor de Backup
MAQUINA_IP=`LC_ALL=C /sbin/ifconfig eth0 | grep "inet addr" | cut -f 2 -d: | tr -d " " | tr -d " Bcast"`
ARQ_LOG="/tmp/${IP_REMOTO}.log" # Arquivo de Log
ARQ_ERROS="/tmp/${IP_REMOTO}.erros" # Arquivo de Erros (MSG)
ARQ_ALERTA="/tmp/${IP_REMOTO}.alerta" # Arquivo enviado para o SUPORTE
# Verificar se a máquina remota está ligada
ping ${IP_REMOTO} -q -c1 >> /dev/null 2>&1
if [ $? -eq 0 ] ; then # maquina ligada
# Gerar opção do rsync com a lista de diretorios a excluir
RSE=""
for DIR1 in ${EXCLUIR}; do
RSE="${RSE} --exclude=${DIR1}"
done
#- O Verdadeiro RSYNC -----------------------------------------------
echo "===== INICIO EM [ `date +%d/%m/%Y-%H:%M:%S` ]=====" > ${ARQ_LOG} 2>&1
rsync -az --partial --delete --stats ${RSE} root@${IP_REMOTO}:/ ${HOME_RSYNC}/${IP_REMOTO}/ >> ${ARQ_LOG} 2> ${ARQ_ERROS}
echo "===== TERMINO EM [ `date +%d/%m/%Y-%H:%M:%S` ]=====" >> ${ARQ_LOG} 2>&1
echo "=[ BACKUP VIA RSYNC ]=================================================
Servidor Rsync......: ${MAQUINA_IP}
Rsync Remoto........: ${IP_REMOTO} / ${LOCALIDADE}
Diretorios Excluidos: ${EXCLUIR}
=[ RSYNC REMOTO ]=====================================================" > ${ARQ_ALERTA} 2>&1
ssh root@${IP_REMOTO} "df -h; rdate -s -p ${MAQUINA_IP}" >> ${ARQ_ALERTA} 2>&1
echo "
=[ SERVIDOR RSYNC ]===================================================" >> ${ARQ_ALERTA} 2>&1
du -sh ${HOME_RSYNC}/${IP_REMOTO}/* >> ${ARQ_ALERTA} 2>&1
echo "======================================================================" >> ${ARQ_ALERTA} 2>&1
else
echo "ERROR: Maquina remota [ ${IP_REMOTO} ] DESLIGADA" >> ${ARQ_ERROS} 2>&1
fi
cat ${ARQ_LOG} >> ${ARQ_ALERTA} 2>&1
cat ${ARQ_ERROS} >> ${ARQ_ALERTA} 2>&1
grep -i "ERROR" ${ARQ_ERROS} > /dev/null 2>&1
if [ $? -eq 0 ]; then
mail -s "rsync de ${LOCALIDADE} - [ERROR]" ${EMAIL_ERROR} < ${ARQ_ALERTA}
else
mail -s "rsync de ${LOCALIDADE} - [OK]" ${EMAIL_OK} < ${ARQ_ALERTA}
fi
Para sincronizar a data e hora dos servidores locais faço uma sincronização à noite com um único servidor, que chamei internamente de servidor mestre. Este servidor será utilizado para acertar a data/hora dos demais servidores.
O script (hlb.sh) está disponível abaixo:
##########################################################
# Script /root/bin/hlb.sh - Hora Legal Brasileira
#
# Autor: Pablo Nehab Hess - "NatuNobilis"
#
# Este script pega a hora legal de Brasilia e fornece a
# data e hora correta para o comando `date`
#
# Use-o da forma que lhe agradar e a seu próprio risco
#
# Alteração: 21/06/2005 - jarbas.junior@gmail.com
#
##########################################################
LINHA=`lynx -dump http://pcdsh01.on.br/ispy.asp |grep Bras |tr -s ' '|cut -f 4,3 -d\ `
# Precaução contra erro de conexão
# Obrigado Anderson Alves em 17/03/2005
if [ $? -eq 0 ]; then
DD=`echo $LINHA | cut -f1 -d "/"`
# Tratar a saida para satisfazer o formato do comando date.
[ $DD -lt 10 ] && DD="0$DD"
MM=`echo $LINHA | cut -f2 -d "/"`
# Tratar a saida para satisfazer o formato do comando date.
[ $MM -lt 10 ] && MM="0$MM"
YY=`echo $LINHA | cut -f3 -d "/" | cut -f1 -d " " | cut -b3-4`
CC=`echo $LINHA | cut -f3 -d "/" | cut -f1 -d " " | cut -b1-2`
hhmm=`echo $LINHA | cut -f2 -d " " | cut -f1,2 -d ":" --output-delimiter="" `
ss=`echo $LINHA | cut -f3 -d: `
date "$MM$DD$hhmm$YY.$ss"
else
echo "ERRO: Falha ao obter hora, relogio nao atualizado."
fi
Coloco tudo isso no cron:
## Acerta o Relogio desta máquina com o Serviço de Tempo Oficial Brasileiro
## Todo dia às 00:30 (meia noite e meia)
##===============================================================
30 00 * * * /root/bin/hlb.sh > /dev/null
## Backup Remoto de servidores no INSS
## De terça a sábado às 02 horas da manhã
##========================================
01 02 * * 2-6 /root/bin/backup_rsync.sh 10.xx.xxx.211 "Portal+TWiki+CACIC"
02 02 * * 2-6 /root/bin/backup_rsync.sh 10.xx.xxx.206 "PROCURADORIA"
03 02 * * 2-6 /root/bin/backup_rsync.sh 10.xx.xxx.206 "UNIVERSITARIO"
04 02 * * 2-6 /root/bin/backup_rsync.sh 10.xx.xxx.206 "POSTO CENTRO"
05 02 * * 2-6 /root/bin/backup_rsync.sh 10.xx.xxx.206 "ANAPOLIS"
06 02 * * 2-6 /root/bin/backup_rsync.sh 10.xx.xx.206 "SEC.RECEITA PREVIDENCIARIA"
06 02 * * 2-6 /root/bin/backup_rsync.sh 10.xx.xxx.206 "SEXTA JUNTA"
07 02 * * 2-6 /root/bin/backup_rsync.sh 10.xx.xxx.205 "RH"