rsyncによる仮想マシンの自動バックアップスクリプト(bash版)

※実際には11/27のネタです。

■Debian Lenny/Squeezeで動作確認済みです。
 ※vmware playerはインストール、仮想マシンイメージ共にデフォルトであることが条件です。
  スクリプトの実行ユーザ = vmware playerの仮想マシンイメージ作成者です。

 各サーバで異なるマシン名を設定するルールにすると、
 バックアップサーバに吸い上げた時に迷子にならなくて済みます。

■例えば「$ vim ~/vmware_rsync_bakup.sh」として、実行権限を与えて実行します。

#!/bin/bash

# ユーザのホームディレクトリを設定
test -d ${HOME} && export MYHOME="${HOME}"
if [ ${MYHOME} == "" ] ;then
  echo "Error: Not Found Home dir = ${HOME}"
  exit 1
else
  echo "OK: Home dir = ${HOME}"
fi

# バックアップ先のディレクトリを設定
export MYBAK="bak.vmware"
test -d "${MYHOME}/${MYBAK}" || mkdir "${MYHOME}/${MYBAK}"

if [ -d "${MYHOME}/${MYBAK}" ];then
  echo "OK: Backup dir = ${MYHOME}/${MYBAK}"
else
  echo "Error: Not Fround Backup dir = ${MYHOME}/${MYBAK}"
  exit 1
fi

# ログファイルの保存先を設定
export MYDATE="$(date '+%Y%m%d_%H%M')"
if [ "${MYDATE}" == "" ];then
  echo "Error: Can\'t Get date = ${MYDATE}"
  exit 1
else
  echo "OK: date = ${MYDATE}"
  MYLOG="${MYHOME}/vmware/vmware.bak.log_${MYDATE}"
fi

# 対象のvmwareディレクトリ配下で
# 仮想マシンディレクトリを見付けたら、
# バックアップ先に最新の状態に更新を行い、

for dirlist in ${MYHOME}/vmware/* ;do
  test -d "$dirlist" && echo "$dirlist"
done | for baklist in `xargs`;do
  TARGET=$(echo ${baklist} | sed s/'vmware'/"${MYBAK}"/)
  test -d "${baklist}" && echo "${baklist} to ..." && \
  test -d "${TARGET}"  && echo "${TARGET} rsync backup" && \
  rsync -auv --delete "${baklist}/" "${TARGET}" --log-file="${MYLOG}"
done

# rsyncの実行ログは、実行したユーザ宛にシステムメールで通知する
test -f "$MYLOG" && cat "${MYLOG}" | mail -s "${MYDATE} ${MYBAK} Report" `whoami`

# スクリプト中でexportした変数を開放する
unset MYDATE MYBAK MYHOME MYLOG