Bar*_*aba 9 ruby capistrano ruby-on-rails
我正在尝试配置Capistrano在两个不同的服务器上执行相同的任务,每个服务器都有不同的凭据.我想做同样的事情:
namespace :deploy do
role :db, "192.168.1.1", :credentials => "db1.yml"
role :db, "192.168.1.1", :credentials => "db2.yml"
task :mytask, :roles => :db do
credentials = YAML.load_file(something)
...
Run Code Online (Sandbox Code Playgroud)
那可能吗?我应该替换什么something,才能访问当前的服务器配置?
Bar*_*aba 12
好的,我终于有时间解决这个问题了.希望其他人会发现这个答案很有用.以下是我最终解决问题的方法:
role :db, "db1" ,{ :credentials => 'db1-credentials'}
role :db, "db2" ,{ :credentials => 'db2-credentials'}
role :db, "db3"
namespace :stackoverflow do
# Don't run this task on host that don't have credentials defined
task :default, {:role => :db, :except => {:credentials => nil } } do
servers = find_servers_for_task(current_task)
servers.each do |server|
credentials = server.options[:credentials]
puts credentials # actual task
end
end
end
Run Code Online (Sandbox Code Playgroud)
我现在看到我可能以一种令人困惑的方式陈述了这个问题 - 那是因为我没有理解,那个任务是同时进行的.
事实上puts credentials,这将为每个服务器执行一次任务(此处),这正是我试图做的事情.
输出:
$ cap stackoverflow
* executing `stackoverflow'
db1-credentials
db2-credentials
Run Code Online (Sandbox Code Playgroud)
向任务添加过滤器是个好主意,这样如果服务器没有凭据,它就不会运行.
话虽这么说,让团队中的每个人保持当前(并且出于安全原因,非版本化)凭证到所有服务器都被证明是太麻烦(从而打败了使用Capistrano的想法).现在,我不打算将外部配置保留在用户磁盘上,而是将数据保存在受影响的服务器上(主要是以可运行脚本的形式保存在内部的所有凭据).像这样:
task :dump {:role => :db} do
run "/root/dump_db.sh | gzip > /tmp/dump.sql.gz"
download "/tmp/dump.sql.gz", "somewhere"
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2767 次 |
| 最近记录: |