我正在关注一个 Railscast,它教如何单独设置 Chef。它使用了两个我以前从未见过的有趣的终端命令,我只能使用其中之一来工作。当我做
scp -r [email protected]:/var/chef .
它将远程服务器目录的内容复制到我的本地计算机。在我在计算机上更改文件后,以下命令应该将文件同步回服务器
rsync -r . [email protected]:/var/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
您有两个文件层次结构混合在一起:/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。
当您编写时,这会创建一个名为under 的rsync -a /path/to/source /path/to/destination
子目录。如果您想与同步,请在目标末尾添加结尾: copy to 。source
destination
/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
包含”的首选项文件
root = /var/chef
root = server.example.com:/var/chef
times = true
运行unison -auto chef
以同步两棵树。
您应该将文件放在下面,而不是同步文件版本控制。进行更改后,将其提交到存储库。要部署您的更改,请在服务器上检查它们。