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