マルチサーバーrsyncバックアップスクリプト

マルチサーバーrsyncバックアップスクリプト

rsyncを使用してSSHを介してリモートサーバーのデータをバックアップする簡単なスクリプトがあります。

これには外部設定ファイルがあります。この構成ファイルには、OPTIONS、REMOTE_IP、SOURCE、およびDESTINATION変数があります。

これで、より多くのリモートサーバーを追加し、複数のサーバーに単一のスクリプトを使用する必要があります。構成のセクション(例:[SERVER_01]、[SERVER_02]...)を使用して定義したいと思います。

スクリプト:

# 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

構成:

# 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/"

この問題を解決するための最良の方法を提案してください。

すべてのコードのコメントと提案を歓迎します:)

ありがとう

ベストアンサー1

これは可能なシナリオです。既存のrsyncコード(if [[ -d $DESTINATION ...)をシェル関数(たとえば)に入れ、runbackup実行された部分をファイルを読み込み、セクション区切り文字を. $CONFIG_FILE見つけるループに置き換えます。[SERVER_...]1つが見つかったら、runbackup関数を呼び出します(最初の関数を除く)。他の行の場合は、eval各行で同じように機能します.。最後のセクションでランバックアップを呼び出すために、[END]ダミーセクションが入力に追加されます。

(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 

おすすめ記事