如何在Capistrano中访问服务器特定选项?

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)

  • 我一直在寻找如何做几个小时的`find_servers_for_task(current_task)`.非常感谢. (2认同)