在Capistrano任务中引用当前服务器

时间:2012-06-15 14:49:34

标签: php ruby deployment capistrano apc

我如何在Capistrano任务中引用当前服务器?我想curl本地文件清除APC缓存但服务器不监听localhost所以我需要服务器的IP地址。

例如,

role :web, "1.1.1.1", "2.2.2.2", "3.3.3.3"

task :clear_apc, :role => :web do
    run "curl http://#{WHAT_DO_I_PUT_HERE}/deploy/clearAPC.php"
end

我将使用什么变量,以便当任务在1.1.1.1上运行时curl s http://1.1.1.1/deploy/clearAPC.php,但在2.2.2.2上运行时,它会调用curl s {{1} }

6 个答案:

答案 0 :(得分:28)

在Capistrano中,每个服务器都不会执行一次任务,run会在每台服务器上执行命令。这是你应该做的事情:

task :clear_apc, :role => :web do
    find_servers_for_task(current_task).each do |current_server|

        run "curl http://#{current_server.host}/deploy/clearAPC.php", :hosts => current_server.host

    end
end

接受的答案可行,但是这个答案允许您作为变量/方法访问服务器

答案 1 :(得分:11)

有神奇的$ CAPISTRANO:HOST $

run "curl http://$CAPISTRANO:HOST$/deploy/clearAPC.php" 

应该完全按照自己的意愿行事。

注意:不要通过字符串插值将它用作变量,capistrano只会替换字符串本身中的$ CAPISTRANO:HOST $。

这是一个非常奇怪和(afaik)无证的功能: - )

答案 2 :(得分:3)

current_host = capture("echo $CAPISTRANO:HOST$").strip

答案 3 :(得分:1)

Capistrano 3-在角色块中,服务器可以作为具有属性集的对象使用:

on roles(:app) do |server|

例如,将主机名属性传递给docker compose

  on roles(:app)  do |server|
    execute "docker-compose --build-arg SOME_HOST_NEEDED=#{server.hostname} ......
  end

答案 4 :(得分:0)

我想知道我正在部署的当前服务器,以便我可以向campfire发送消息。这是我能够弄清楚的,虽然我确信有更好的方法

 actions = current_task.namespace.parent.logger.instance_variable_get('@options')[:actions]
 message = "I am deploying #{fetch(:latest_release).split('/').last} using cap #{actions.join(' ')}"

因此,当我部署时,将其发布到篝火上 我使用cap QA2 campfire部署20121206154442:notify deploy deploy:flex_master

答案 5 :(得分:0)

capistrano(2.13.5)要求

puts current_task.namespace.logger.instance_variable_get('@base_logger').instance_variable_get('@options')[:actions].join(' ')

通过

计算出来
puts current_task.namespace.logger.inspect