【问题标题】:In capistrano, can I retrieve server info from a role symbol?在 capistrano 中,我可以从角色符号中检索服务器信息吗?
【发布时间】:2014-02-05 01:48:53
【问题描述】:

我正在使用 Capistrano 以非标准方式部署应用程序,并且我有一个非常大的文件,我通过网关将其上传到多个服务器。我想,而不是让 capistrano 将此文件从部署机器上传到列表中的每个服务器,而是将其上传到网关服务器,然后从那里在 LAN 周围 scp (当我手动测试它时,这要快得多) .

我很难找到让 capistrano 做到这一点的方法。我可以使用类似的东西:

myservers = find_servers_for_task(current_task)
myservers.each do |server|
  run "scp HARDCODED_GATEWAY:/remote/file /local/file", :hosts => server.host
end

我不喜欢硬编码的网关;我在上面的一个名为 :gateway 的角色中定义了这个。有没有办法从 :gateway 符号中提取主机名?我知道一个角色中可能定义了多个服务器,但我会很满意只为角色数组中的第一台服务器或最后一台服务器提供服务器信息;就我的目的而言,其中只会有一台服务器,但哪台服务器可能会改变。

【问题讨论】:

    标签: capistrano host


    【解决方案1】:

    我对 ruby​​ 还很陌生,所以我可能读错了,但我认为您可以通过roles[:gateway].servers[0].host 获得该角色的主机。这似乎回答了您提出的问题。

    【讨论】:

      【解决方案2】:

      您可以通过以下方式设置特定于 capistrano 配方的变量

      set :gateway, "HARDCODED_GATEWAY:/remote/file"
      

      以后使用它:

      myservers = find_servers_for_task(current_task)
      myservers.each do |server|
        run "scp #{gateway} /local/file", :hosts => server.host
      end
      

      如果要在运行时输入,请使用以下代码:

      set(:gateway) { Capistrano::CLI.ui.ask("gateway: ") }
      

      更多信息可以在capistrano wiki找到。

      【讨论】:

      • 它仍然是硬编码的,您只是将硬编码移到了 capfile 中的不同位置。如果我可以在网关角色定义中使用它,这可能没问题,但理想情况下,我希望最终允许在运行时动态设置网关。
      • 好了,应该就是这样了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2015-05-25
      • 2012-12-13
      • 1970-01-01
      • 2014-08-24
      • 2013-01-07
      • 2018-07-26
      相关资源
      最近更新 更多