rsyncがファイルをサーバーにコピーしない理由

rsyncがファイルをサーバーにコピーしない理由

私はChefを一人で設定する方法を教えるRailscastをフォローしています。以前見たことのない2つの興味深いターミナルコマンドを使用し、それらのうちの1つだけを使用できます。私がするとき

scp -r [email protected]:/var/chef .

リモートサーバーディレクトリの内容を自分のローカルコンピュータにコピーします。マイコンピュータでファイルを変更した後に次のコマンドを実行すると、ファイルはサーバーに再同期されます。

rsync -r . [email protected]:/var/chef

ただし、変更はリモートサーバーに表示されず、変更を適用する必要があるChefコマンドを実行したときに実行する変更は表示されません。

rsyncを間違って使用していますか?

修正する

このコマンドを実行すると、次の出力が生成されます。それでもリモートサーバーに変更は表示されません。

rsync -rvv . [email protected]:/var/chef


`building file list ... 
done
delta-transmission enabled
chef/node.json
chef/solo.rb
chef/cache/chef-client-running.pid
chef/cache/chef-stacktrace.out
chef/chef/node.json
chef/chef/solo.rb
chef/chef/cache/chef-client-running.pid
chef/chef/cache/chef-stacktrace.out
chef/chef/cookbooks/main/recipes/default.rb
chef/cookbooks/main/recipes/default.rb
chef/cookbooks/main/templates/default/zshrc.erb
total: matches=17  hash_hits=17  false_alarms=0 data=0
sent 1167 bytes  received 442 bytes  643.60 bytes/sec
total size is 6236  speedup is 3.88`

修正する

上記のアップデートでは、templatesディレクトリがmain内部(およびrecipesディレクトリ)にある必要があることがわかりますが、表示される内容は次のとおりです。

root@Chef3:/var/chef/cookbooks# cd main
root@Chef3:/var/chef/cookbooks/main# ls
recipes

答え1

2つのファイル階層が混在しています。 1つを編集してからもう1つをもう一度読むようです/var/chef/var/chef/chef

scp -r [email protected]:/var/chef .chef現在のディレクトリ内にディレクトリを作成します。あなたが出身なら/var/chef


提案されたコマンドはひどいです。このチュートリアルで読んだことをすべて忘れてください。

scp -rファイルの権限や時間は保持されません。scp -rpそれらを救うために。

rsync -rファイルの権限や時間は保持されません。その-rオプションが存在することを忘れました。代わりにこれを使用するrsync -aと、一般的なメタデータがすべて保存されます。-aそうしない妥当な理由がない限り、常にオプションをrsyncに渡してください。

作成すると、rsync -a /path/to/source /path/to/destinationunderというサブディレクトリが作成されます。同期するには、ターゲットの最後にtrailing:copy toを追加します。sourcedestination/path/to/source/path/to/destination/rsync -a /path/to/source /path/to/destination//path/to/source/somefile/path/to/destination/somefile

ファイルの変更時間を維持することが重要です。これにより、ファイルが最後に変更された時期がわかります。ツールはファイルが変更された時期も知っています。特にファイル時間が安定している場合は、ほとんどのファイルが変更されていない大規模ディレクトリを同期する方がはるかに高速です。 Rsyncは、両方の名前、サイズ、および変更時間が同じ場合、ファイルをすばやくスキップします。

-uオプション()を追加すると、rsyncにソースから最新のファイルのみを転送するように指示できますrsync -au SOURCE DESTINATION。これにより、ファイルがターゲットでも編集されている場合にリスクが制限されます。ターゲットから最新バージョンを削除せず、ソースから古いコピーを削除しません。ただし、衝突を確実に検出することはできません。ファイルの両方が編集されている場合は、変更時刻が最新のバージョンが優先されます。

rsyncはデータの一方向同期のためのツールです。双方向同期には使用しないでください。代わりに調和。 Unisonは実行されるたびにファイルバージョンのリストを保持し、競合が発生した場合は大声で文句を言います(両当事者は同じファイルを独立して編集します)。 Unisonは、競合がない限り、両方の変更をマージします(つまり、各ファイルが同期の間に片側でのみ変更される場合)。

Unisonを設定するには、GUIを使用するか、~/.unison/chef.prf「includes」という基本設定ファイルを作成します。

root = /var/chef
root = server.example.com:/var/chef
times = true

2つのツリーを同期させるには実行してくださいunison -auto chef

ファイルを同期するのではなく、下にファイルを置く必要がありますバージョン管理。変更後、リポジトリにコミットします。変更をデプロイするには、サーバーで確認してください。

関連情報