Jenkinsでファイルサーババックアップジョブ(rsync)実行時に”Operation not permitted (1)”エラーとなる場合の対処方法

スポンサーリンク

※当サイトは広告を利用しています。

データバックアップとしてお手軽に実行できる便利なLinuxコマンド「rsync」。

今回Jenkinsジョブのシェル実行でrsyncを実行し
スケジュールバックアップできる仕組みを作りました。

以下のサーバ構成です。

・Jenkinsサーバ:
  サーバJ
・転送元:
  サーバA
・転送先(バックアップ先):
  サーバB
   ※Jenkinsジョブの実行ノード

1.事前準備

[Jenkinsの管理]-[ノードの管理]からサーバBを追加し

バックアップジョブの実行ノードに設定します。

サーバBにバックアップ先ディレクトリを作成しておきます。
今回は以下としました。

/home/bkdir
また、サーバAで共有フォルダをマウントしておきます。

/mnt/sharedir

2.Jenkinsジョブの作成

Jenkinsジョブでシェルの実行を選択し

以下のシェルスクリプトを記載します。
export backup_src_dir=/mnt/sharedir/
export backup_dst_dir=/home/bkdir
ls -la ${backup_src_dir}
ls -la ${backup_dst_dir}
whoami
rsync -auvz –delete ${backup_src_dir} ${backup_dst_dir}

転送元ディレクトリ指定時に最後の”/”を付けるのと付けないのとで

以下のように挙動が変わりますので注意が必要です。

・”/”を付ける(/mnt/sharedir/) ⇒ ”sharedir”の中身がコピーされる。(/home/bkdir/**.*)

・”/”を付けない(/mnt/sharedir) ⇒ ”sharedir”を含めてコピーされる。(/home/bkdir/sharedir/**.*)


また、Jenkinsジョブのスクリプト内でwhoamiコマンドを叩くよう記述すると実行ユーザが出力されます。

Jenkinsでジョブ実行する際にどのユーザで実行されているか確認するのに便利です。

whoamiコマンドを仕込んで確認すると
Jenkinsジョブの実行ノード追加時に指定した認証情報のユーザで
Jenkinsジョブが実行されていることが確認できます。

3.エラー時の対処

さて上記諸々を設定してジョブ実行すると

以下のエラーが表示され Finished: FAILURE となってしまいました。


   rsync: failed to set times on “/home/bkdir/.”: Operation not permitted (1)
rsyncオプション -a で実行するとタイムスタンプを維持してコピーしようとするのですが、

/home/bkdirディレクトリの所有者とrsync実行ユーザ(Jenkinsジョブ実行ユーザ)が異なるため権限不足でエラーとなるようです。


対応としては

①./home/bkdirディレクトリの所有者をrsync実行ユーザ(Jenkinsジョブ実行ユーザ)に変更する

②.rsync実行ユーザ(Jenkinsジョブ実行ユーザ)を/home/bkdirディレクトリの所有者に変更する

のいずれかとなります。

ここでwhoamiの結果が生きてきますね。

なお、タイムスタンプ等を含めた完全コピーの必要が無ければ -a オプションを -rlOtcv 等に変更することでもエラーは解消されます。


※以下サイトを参考にさせて頂きました。
rsync | Professional Programmer


コメント

タイトルとURLをコピーしました