ログファイルや設定ファイルなどをバックアップする際に、rsyncを使うと便利です。実際に、ローカルサーバ内でのコピーにもrsyncを使用して、さらにリモートのバックアップサーバにもrsyncで同期をとっています。
ここでは、そのバックアップのシェルスクリプトを紹介します。
なお、rsyncコマンドのエラーハンドリングは記述していません。ログ監視でいいのであれば、ここで紹介する例のままでいいかと思います。
またここでは、リモート側でもここで紹介するローカルバックアップを実行していることを前提としています。
1.ローカルバックアップのシェルスクリプト rsync_backup_local.sh
このシェルスクリプトでは、rsyncのオプションinclude-fromとexclude-fromに指定しているファイルが重要な役割を担っています。これら2つのファイルの内容を1つのファイルにまとめて記述して、それをinclude-fromあるいはexclude-fromオプションで指定しても、同じ動作をします。
rsync_backup_local.sh
#!/bin/sh rc_NG=1 backupfrom=/ backupto=/backup/local/ includelist=$(dirname $0)/../conf/rsync_include.list excludelist=$(dirname $0)/../conf/rsync_exclude.list ownname=$(basename $0) logfile=$(dirname $0)/../log/${ownname%.*}.log echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "Start of rsync backup [" $ownname "]" >>$logfile if [ ! -e $includelist ]; then echo "[ERROR] includeリストファイル" $includelist "が見つかりません。" >>$logfile echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "End of rsync backup [" $ownname "]" >>$logfile exit $rc_NG fi if [ ! -e $excludelist ]; then echo "[ERROR] excludeリストファイル" $excludelist "が見つかりません。" >>$logfile echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "End of rsync backup [" $ownname "]" >>$logfile exit $rc_NG fi rsync -av --include-from=$includelist --exclude-from=$excludelist $backupfrom $backupto >> $logfile 2>&1 echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "End of rsync backup [" $ownname "]" >>$logfile
rsync_include.list
バックアップ対象ファイルをここに記述します。
# include + /var/ + /var/log/ + /var/log/btmp-* + /var/log/cron-* + /var/log/dracut.log-* + /var/log/maillog-* + /var/log/messages-* + /var/log/redmine.log-* + /var/log/secure-* + /var/log/spooler-* + /var/log/wtmp-* + /var/log/yum.log-* + /var/log/httpd/ + /var/log/httpd/access_log-* + /var/log/httpd/error_log-* + /var/log/httpd/ssl_access_log-* + /var/log/httpd/ssl_error_log-* + /var/log/httpd/ssl_request_log-* + /var/log/mysql/ + /var/log/mysql/mysqld.log-* + /var/log/redmine/ + /var/log/redmine/production.log-* + /var/named/ + /var/named/data/ + /var/named/data/named.run-*
rsync_exclude.list
バックアップからすべて(*)を除外する記述をします。これにより、上記include-listに記述したファイルだけがバックアップアップされるようになるのです。
# exclude (all) - *
2.リモートバックアップのシェルスクリプト rsync_backup_remote.sh
このシェルスクリプトはバックアップサーバ側で実行する設計になっていて、バックアップ対象ファイルをバックアップサーバにプルする格好になっています。
ここでは、rsyncで単純にディレクトリ同期をとっているだけです。だたし、同期先がバックアップサーバなので、同期元で削除されたファイルを同期先から削除することはしていません。つまり、rsyncのdeleteオプションをつけていません。
なお、リモート接続のrsyncはsshを使用します。sshは秘密鍵を使用して接続しています(パスワードなし)が、ポートをWell-knownの22を変更している場合には、sshコマンドのオプションで指定する必要があります。
#!/bin/sh rc_NG=1 username=root server=192.168.0.2 backupfrom=/backup/ ←最後のスラッシュをつけないと、/backupディレクトリ自体もコピーされてしまいますので、要注意 backupto=/backup/remote/ ownname=$(basename "$0") logfile=$(dirname $0)/../log/${ownname%.*}.log echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "Start of rsync backup [" $ownname "]" >>$logfile rsync -av -e "ssh -p 2222" $username@$server:$backupfrom $backupto 1>>$logfile 2>&1 echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "End of rsync backup [" $ownname "]" >>$logfile
こんな感じなのですが、わかってしまえば簡単です。これをローカルバックアップ、リモートバックアップの順になるようにcronで叩くだけです。
ぜひ、このようにして使ってみてください。