リモートサーバのデータをroot権限で、rsyncでバックアップする。

そらからみず…
※写真と本文は関係ありません。


あちこちにある客先のファイルサーバのデータをデータセンタにあるバックアップサーバにバックアップしたい。

やりたいこと

rdiff-backupで世代バックアップしているので、そのバックアップフォルダをバックアップサーバ側にrsync。バックアップサーバから実行する。(Pull方式)

リモート側で『PermitRootLogin yes』したくない。
→リモートでrsyncコマンドをsudo実行するユーザを限定→『–rsync-path』オプションでリモート側のrsyncをsudoで実行する。

リモート側はADSL回線なので、動的IP。(DDNSで名前解決出来るようにした。


リモート側サーバでやったこと

バックアップサーバIPのssh接続を許可。
公開鍵認証でバックアップサーバからhogehogeがssh接続出来るようにしておく。

sudersに追加

# visudo
hogehoge ALL=(ALL)       NOPASSWD: /usr/bin/rsync		#追記

sudoするスクリプトを準備

$ cat /home/hogehoge/scripts/rsync.sh
#!/bin/sh
/usr/bin/sudo /usr/bin/rsync $*

バックアップサーバ側
サーバ『fuga.kyoyu-kun.example.co.jp』の『/media/backup/backup/』を『/mnt/disk/6/kyoyukun_backup/fuga/rsync』にrsyncするコマンド。

# /usr/bin/rsync -auvz -e ssh --rsync-path="/home/hogehoge/scripts/rsync.sh" --delete --dry-run hogehoge@fuga.kyoyu-kun.example.co.jp:/media/backup/backup/ /mnt/disk/6/kyoyukun_backup/fuga/rsync

はまったところ。
リモート側でroot権限で読み取る方法はこちら(sudo + rsync on CentOS 5@(・∂/Sheeplogh.)から参考にさせていただきましたが、『–rsync-path=”sudo rsync”』とすると、シェルスクリプト内で実行すると下記のようなエラーになった。(コマンドラインで実行は問題ない。)

Unexpected remote arg: hogehoge@fuga.kyoyu-kun.example.co.jp:/media/backup/backup/
rsync error: syntax or usage error (code 1) at main.c(1201) [sender=3.0.6]

最終的なシェルスクリプトはこんな感じ。
https://github.com/furu-nob/pull_rsync/blob/master/pull_rsync.sh


あとでみるメモ。
上り回線がボトルネックになるので問題なさそうだけど、リモート側で負荷を調整したい場合。
rsyncの負荷を抑える方法@理想未来はどうなった?