Configure uma replicação simples de arquivos via Csync2 no Slackware

De Wiki Hackstore

Descrição

  • Sincronização de arquivos no servidor com csync2.
  • Ele possui vários algoritmos de sincronia, como pelo arquivo mais novo, mais antigo, maior, entre outros. Nesse caso estarei usando o mais novo (younger)
  • Além de sincronizar é possível executar comandos remotos, como reiniciar o apache após um rotate de log.
  • Pode ser utilizado com N servidores.


Softwares e Versões

  • Csync2 1.3X
  • Slackware Linux 13.37

Instale as dependências

  • librsync
  • sqlite2
  • sqlite3
  • gnutls
  • flex
  • bison

Instale o libtasn1

 
$ wget ftp://ftp.gnutls.org/pub/gnutls/libtasn1/libtasn1-1.4.tar.gz
$ ./configure; make ; make install


Configuração

Instalação

Obtenha o código fonte do Csync2:

http://oss.linbit.com/csync2/


  • Compilar o Csync2:
$ ./configure
$ make
$ make install
$ make cert



Configuração

  • Criar o /etc/csync2.cfg:
#Exemplo /etc/csync2.cfg
group mygroup
{
        host web2xt-master@10.199.199.1 web2xt-slave@10.199.199.2;

        key /etc/csync2.key_hackstore;

        include /etc/passwd;
        include /etc/group;
        include /etc/shadow;

        auto younger;
}
  • Criar a chave de segurança em algum dos nodos:
$ csync2 -k /etc/csync2.key_hackstore
  • Copiar a chave de segurança e ssl para os demais hosts:
$ scp /etc/csync2* root@outroshosts:/etc
  • Caso deseje criar certificado na mao:
$ openssl genrsa -out /etc/csync2_ssl_key.pem 1024

$ openssl req -new -key /etc/csync2_ssl_key.pem -out /etc/csync2_ssl_cert.csr

$ openssl x509 -req -days 600 -in /etc/csync2_ssl_cert.csr -signkey /etc/csync2_ssl_key.pem -out /etc/csync2_ssl_cert.pem 
  • Setar permissões de conf:
$ chmod 640 /etc/csync2.cfg
  • Copiar arquivo de conf e chave para o outro servidor.


Arquivo de init

Crie o arquivo de init (slackware):

vi /etc/rc.d/rc.csync2
#!/bin/sh
#
# "$Id: csync2.sh.in 6649 2013 coffnix $"
#
#   Startup/shutdown script for Csync2 - slackzine
#
#   Maiores infos: www.hackstore.com.br - www.slackzine.com.br
#

#### OS-Dependent Information

#
#   Linux chkconfig stuff:
#
#   chkconfig: 235 99 00
#   description: Startup/shutdown script for Csync2
#

#
#   NetBSD 1.5+ rcorder script lines.  The format of the following two
#   lines is very strict -- please don't add additional spaces!
#
# PROVIDE: csync2
# REQUIRE: DAEMON
#


#### OS-Dependent Configuration

case "`uname`" in
        Linux*)
                IS_ON=/bin/true
                if test -f /etc/init.d/functions; then
                        . /etc/init.d/functions
                        ECHO=echo
                        ECHO_OK="echo_success"
                        ECHO_ERROR="echo_failure"
                else
                        ECHO=echo
                        ECHO_OK=:                                                                                                                                                                                                            
                        ECHO_ERROR=:                                                                                                                                                                                                         
                fi                                                                                                                                                                                                                           
                ;;                                                                                                                                                                                                                           
                                                                                                                                                                                                                                             
        *)                                                                                                                                                                                                                                   
                IS_ON=/bin/true                                                                                                                                                                                                              
                ECHO=echo                                                                                                                                                                                                                    
                ECHO_OK=:                                                                                                                                                                                                                    
                ECHO_ERROR=:                                                                                                                                                                                                                 
                ;;                                                                                                                                                                                                                           
esac                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                             
#### OS-Independent Stuff                                                                                                                                                                                                                    
                                                                                                                                                                                                                                             
for file in /etc/TIMEZONE /etc/rc.config /etc/sysconfig/clock; do                                                                                                                                                                            
        if test -f $file; then                                                                                                                                                                                                               
                . $file                                                                                                                                                                                                                      
        fi                                                                                                                                                                                                                                   
done                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                             
if test "x$ZONE" != x; then                                                                                                                                                                                                                  
        TZ="$ZONE"                                                                                                                                                                                                                           
fi                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                             
if test "x$TIMEZONE" != x; then                                                                                                                                                                                                              
        TZ="$TIMEZONE"                                                                                                                                                                                                                       
fi

if test "x$TZ" != x; then
        export TZ
fi

#
# Don't use TMPDIR environment variable from init script, as that can
# cause csync2d to set TempDir to a user's temporary directory instead
# of the default...
#

unset TMPDIR


#
# Make sure we have the standard program directories in the path
# since some operating systems (this means YOU HP-UX!) don't
# provide a standard path on boot-up...
#

if test "x$PATH" = x; then
        PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin"
else
        PATH="/usr/local/sbin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:$PATH"
fi

export PATH

#
# See if the CSYNC2 server (csync2d) is running...
#

case "`uname`" in
        Linux* | *BSD* | Darwin*)
                pid=`ps ax | awk '{if (match($5, ".*/csync2d$") || $5 == "csync2d") print $1}'`
                ;;
        *)
                pid=""
                ;;
esac

#
# Start or stop the CSYNC2 server based upon the first argument to the script.
#

case $1 in
        start | restart | reload)
                if $IS_ON csync2; then
                        if test "$pid" != ""; then
                                kill -HUP $pid
                        else
                                prefix=/usr/local
                                exec_prefix=/usr/local
                                /usr/local/sbin/csync2
                                if test $? != 0; then
                                        $ECHO_FAIL
                                        $ECHO "csync2: unable to $1 scheduler."
                                        exit 1
                                fi
                        fi
                        $ECHO_OK
                        $ECHO "csync2: ${1}ed scheduler."
                fi
                ;;

        stop)
                if test "$pid" != ""; then
                        killall -TERM /usr/local/sbin/csync2
                        $ECHO_OK
                        $ECHO "csync2: stopped scheduler."
                fi
                ;;

        status)
                if test "$pid" != ""; then
                        echo "csync2: scheduler is running."
                else
                        echo "csync2: scheduler is not running."
                fi
                ;;

        *)
                echo "Usage: csync2 {reload|restart|start|status|stop}"
                exit 1
                ;;
esac

#
# Exit with no errors.
#

exit 0


#
# End of "$Id: csync2.sh.in 6649 2013 21:46:42Z mike $".
#


  • Setar permissões e colocar no boot:
chmod 755 /etc/rc.d/rc.csync2
echo "/etc/rc.d/rc.csync2 start" >> /etc/rc.d/rc.local


  • Iniciar o daemon em ambas as máquinas:
 /etc/rc.d/rc.csync2 start
  • Sincronizar:
$ csync2 -x
  • Na primeira sincronia pode gerar erros. Rodar mais de uma vez nesse caso.
  • Colocar o script no crontab com a frequência de sincronismo:
#Crontab
#Sync files 
*/30 * * * *   root  /usr/local/sbin/csync2 -x