在Capistrano任务中获取远程IP

时间:2012-07-17 07:29:08

标签: ruby-on-rails deployment capistrano asset-pipeline

我正在尝试编写一个自定义capistrano任务,该任务在本地编译我的资产,然后使用rsync将它们推送到生产服务器。问题是当使用capistrano的run_locally时,我无法弄清楚如何访问我的应用服务器的IP地址。

以下是我config/deploy.rb的摘录:

server "[some_ip_address]", :web, :app, :db, :primary => true

...

namespace :assets do
  desc 'Run the precompile task locally and rsync with shared'
  task :precompile, :roles => :web, :except => { :no_release => true } do

    run_locally "bundle exec rake assets:precompile"
    run_locally "rsync -zvrh --progress -e 'ssh -i #{ssh_options[:keys][0]}' public/assets #{user}@$CAPISTRANO:HOST$:#{shared_path}"
    puts "cleaning up locally compiled assets"
    run_locally "bundle exec rake assets:clean"
  end
end

问题是$CAPISTRANO:HOST$没有扩展到ip。我知道我可以硬编码,但我想做得很好。

4 个答案:

答案 0 :(得分:2)

尝试使用主机IP定义capistrano变量,并在capistrano脚本中的任何位置引用它以使它们保持干燥状态:

set :host, "some IP addresss"
server host, :web, :app, :db, :primary => true

并在您的任务定义中:

run_locally "... #{host} ..."

答案 1 :(得分:0)

不幸的是,run_locally与[{1}}没有相同的字符串替换,因此run无效。

如果你要做的就是预先编译你的资产,你可以在$CAPISTRANO:HOST$中加上以下一行:

deploy.rb

答案 2 :(得分:0)

您是否尝试在SocketAddrinfo使用getaddrinfo

1.9.3p125 :035 > Addrinfo::getaddrinfo('ya.ru', 'http', :INET, :STREAM)[0].ip_address
 => "93.158.134.203"
1.9.3p125 :037 > Socket::getaddrinfo('ya.ru', 'http', :INET, :STREAM)[0][3]
 => "93.158.134.3"

答案 3 :(得分:0)

使用pry gem我发现了这样一个选项:

  run_locally %{bundle exec rake assets:precompile}
  roles[:web].servers.each do |web_server|
    run_locally %{rsync --recursive --times --rsh=ssh --compress --human-readable --progress public/assets #{user}@#{web_server.host}:#{shared_path}}
  end
  run_locally %{bundle exec rake assets:clean}

PS。我试图做同样的事情,发现这个问题:)

另一个选择是看turbo-sprockets-rails3 gem。