更新:TL; DR似乎没有内置的方法来实现这一点,因此自定义任务是一个简单的解决方案。
Capistrano提供了在所有版本上共享文件和目录的工具。这很方便,甚至可以对文件提供一些安全性,这些文件不容易更改(或者在不同版本中必须保持相同),例如:数据库配置文件。
但是当谈到替换或只更新其中一个共享文件时,我最终会直接在目标计算机上手动完成。我想对此进行改进,例如要求Capistrano在部署时覆盖部分或全部共享文件。一种具有一定粒度的--force
标记。
我不知道有这样的设施,到目前为止在我的搜索中失败了。任何指针?
这个设施不存在的原因之一(除了我没有找到它!)是它可能比它看起来更难。例如,假设我们有一个共享数据库配置文件,出于安全原因(常见做法)我们将其从版本控制中排除。当前版本依赖于DB配置的版本1。下一版本需要DB配置的第2版。如果部署进展顺利,一切都很好。在使用新版本(例如回归)发生错误后回滚时会变得更难,因为版本1 必须然后才可用。
这种自动化既凉爽又方便,但也很危险。但我手头有实际的用例。
答案 0 :(得分:0)
一种方法是使用像Chef或Puppet这样的系统配置工具,从Capistrano中清楚地部署配置文件。
另一种方法是创建自定义任务来执行此操作:https://coderwall.com/p/wgs6gw/copy-local-files-to-remote-server-using-capistrano-3
我个人不会经常更改服务器上的配置,也不会在足够的服务器上尝试自动化它。制作一个将所需配置文件复制到所有必需服务器的scp命令已经足够了。
答案 1 :(得分:0)
我创建了一个template
方法来执行此操作。例如,我可以有这样的任务:
task :create_database_yml do
on roles(:app, :db) do
within(shared_path) do
template "local/path/to/database.yml.erb",
"config/database.yml",
:mode => "600"
end
end
end
然后我有一个database.yml.erb
模板,它使用fetch(:database_password)
之类的内容来填充适当的值。您可以使用Capistrano中的ask
方法来提示这些值,以便它们永远不会被提交。
template
的实现可以非常简单:您只需要读取文件,通过ERB
传递,然后使用Capistrano的upload!
将结果放在服务器上。
我的版本比你的版本要复杂得多,但万一你好奇: