Script de backup Rsync para vários servidores

2

Eu tenho um script simples que faz o backup de dados do servidor remoto via ssh usando o rsync.

Eu tenho um arquivo de configuração externo para isso. Neste arquivo de configuração eu tenho variáveis: OPTIONS, REMOTE_IP, SOURCE e DESTINATION.

Agora preciso adicionar mais servidores remotos e começar a usar o script único para vários servidores. Eu quero defini-lo com seções (como [SERVER_01], [SERVER_02] ...) na configuração.

Script:

# You can provide external configuration file if you specify it with -c option
# Then if you haven't specified it, use one from ~/rsync_script/config.cfg

if [[ $1 == -c ]]; then
    CONFIG_FILE=$2
else
    CONFIG_FILE=~/rsync_script/config.cfg
fi


# Add constants from config file to script's environment

if [[ -f $CONFIG_FILE ]]; then
    . $CONFIG_FILE
fi


# Create full path before running rsync, because rsync cannot mkdir with -p option
# Run rsync with parameters from config.cfg and put files to $DESTINATION/$REMOTE_IP/YYYY-MM-DD

if [[ -d $DESTINATION ]]; then
    mkdir -p $DESTINATION$REMOTE_IP/$(date +"%A")
    rsync -avx \
        --timeout=30 \
        $OPTIONS \
        rsync@$REMOTE_IP:$SOURCE $DESTINATION$REMOTE_IP/$(date +"%F")
else
        echo "failure"
fi

Configuração:

# Set extra options for rsync command
OPTIONS="--itemize-changes --log-file=changes.log"
# Set IP address of server the you want to backup
REMOTE_IP="192.168.11.123"
# Set the folder on remote server to backup
SOURCE="/home/rsync/somedata"
# Set the destination folder on local machine
DESTINATION="/backup/"

Sugira a melhor maneira de resolver isso,

Quaisquer comentários e conselhos sobre códigos são bem-vindos:)

Obrigado

    
por Roman Makarov 22.09.2015 / 16:32

1 resposta

1

Aqui está um cenário possível. Coloque seu código rsync existente ( if [[ -d $DESTINATION ... ) em uma função shell, digamos runbackup , e substitua a parte que faz . $CONFIG_FILE por um loop que lê o arquivo e procura o separador de seção [SERVER_...] . Quando encontra um, chama o função runbackup (exceto para o primeiro). Para as outras linhas, ele faz eval em cada linha, assim como . . Para garantir que o runbackup seja chamado na última seção, uma seção dummy [END] é adicionada à entrada.

(cat $CONFIG_FILE; echo '[END]') |
while read line
do if [[ "$line" =~ ^\[([A-Z_0-9]+)\] ]]
   then if [ -n "$OPTIONS" -a -n "$REMOTE_IP" ]
        then echo "section $section"
             runbackup
        fi
        section=${BASH_REMATCH[1]} # captured from =~ regex above
        unset OPTIONS REMOTE_IP SOURCE DESTINATION
   else eval $line
   fi
done 
    
por 23.09.2015 / 17:18