This Unison program is great. It neatly handles syncing between two servers where changes are occurring on both sides. On one client site it takes about 30 seconds to compare/sync a 23GB /var/www/html/ structure with about 100 sites.
1) Install unison (http://www.cis.upenn.edu/~bcpierce/unison/). Requires “ocaml” compiler (http://caml.inria.fr/), and needs the “etags” command from emacs (so “yum install emacs”, whatever)
2) Set up a “/root/.unison/profile-name.prf” file. See example pasted below. Comment out “batch=true” and “silent=true” for initial test runs. Uncomment them for running from a cron job.
3) Run manually to test: unison profile-name
4) If you leave the logging turned on, make an /etc/logrotate.d/unison file, something like this:
|
1 2 3 4 5 6 7 8 9 |
/var/log/unison.log { notifempty daily rotate 7 missingok compress } |
5) Set up cron job(s). Create multiple profiles if specific paths need more frequent syncing. With silent=true, the jobs should produce no output (silent=true automatically sets batch=true).
Sample profile (/root/.unison/profile-name.prf)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# Reasonable defaults auto=true confirmbigdeletes=true contactquietly=true fastcheck=true group=true maxthreads=20 numericids=true owner=true times=true # Dump an archive listing to ~/unison.dump #dumparchives=true # Skip confirmation batch=true # Suppress output (sets batch=true) silent=true # Run in a loop, repeating every X seconds (sort of daemon mode) #repeat=60 # Log all sync operations log=true logfile=/var/log/unison.log # Backup deleted files backup=Name * backuplocation=central backupdir=/var/www/unison-backups # Local root root=/var/www/html/ # Remote root (the double forward-slash between IP and remote path is correct) root=ssh://1.2.3.4//var/www/html/ # Resolve conflicts in favor of local root prefer=/var/www/html/ # Limit to specific relative path (can specify multiple path= params) #path=somepath/ # Don't sync (can specify multiple ignore lines) ignore=Path */var/cache |





One Response
also,
if these servers require password authentication you will need to setup a private and public key between the 2 servers for ssh so your cron wont require a password. Heres how i did it…
BOTH SERVERS:
vi /etc/ssh/ssh_config
*** uncomment IdentityFile …. ***
vi /etc/ssh/sshd_config
*** uncomment AuthorizedKeysFile %h/.ssh/authorized_keys ***
/etc/init.d/ssh restart
useradd -s/bin/bash -m unison
passwd unison
SERVER01: (needs identity or private key)
chown unison:unison /home/unison
sudo -u unison ssh-keygen -t rsa
*** enter /home/unison/.ssh/id_rsa passphrase=leave blank***
ssh unison@server02 mkdir -p .ssh
cat /home/unison/.ssh/id_rsa.pub | ssh unison@server02 ‘cat >> .ssh/authorized_keys’
mv /home/unison/.ssh/id_rsa /home/unison/.ssh/identity
SERVER02: (needs authorized_keys or public key)
chmod 0700 /home/unison/.ssh
vi /home/unison/.ssh/authorized_keys
*** append text from id_rsa.pub on server01 to this file and then delete it off server01***
chown unison:unison /home/unison/.ssh/authorized_keys
chmod 0600 /home/unison/.ssh/authorized_key
*** now you can login to 02 from 01 without authentiction via… ***
ssh unison@server02 -i /home/unison/.ssh/identity
*** OR setup cron to run as user unison then you wont need the -i option since it now reads /home/unison/.ssh/identity ***