7

如何在 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是 shttp://1.1.1.1/deploy/clearAPC.php但在 2.2.2.2 上运行时它调用curlshttp://2.2.2.2/deploy/clearAPC.php

4

6 回答 6

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

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

于 2012-11-20T11:53:00.617 回答
11

有神奇的 $CAPISTRANO:HOST$

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

应该做你想做的事。

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

这是一个非常奇怪且(afaik)未记录的功能:-)

于 2012-06-15T16:13:18.573 回答
3
current_host = capture("echo $CAPISTRANO:HOST$").strip
于 2013-08-28T13:45:22.457 回答
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
于 2020-01-07T15:42:45.543 回答
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:notify deploy deploy:flex_master 部署 20121206154442

于 2012-12-07T23:51:32.130 回答
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
于 2014-01-30T21:32:47.167 回答