2012-06-15 79 views
6

如何在Capistrano任務中引用當前服務器?我想curl本地文件來清除APC緩存,但服務器不會在localhost上偵聽,所以我需要服務器的IP地址。在Capistrano任務中引用當前服務器

例如,

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小號http://1.1.1.1/deploy/clearAPC.php但是當2.2.2.2運行要求curl小號http://2.2.2.2/deploy/clearAPC.php

回答

11

有神奇的$ CAPITANO:主機$

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

應該做你想要的。

注意:不要使用它作爲通過字符串插值的變量,capistrano只會替換字符串本身中的$ CAPISTRANO:HOST $。

這是:-)

+0

這實際上可能是最不爲人所知的capistrano功能...... – paukul

+0

這看起來確實很詭異。爲什麼Capistrano傢伙沒有把它變成一種方法? – user1158559

+0

也許@leehambley知道答案;)我會把他指向這個問題 – paukul

28

在Capistrano的很奇怪,(據我所知)無證功能,任務不得到每個服務器執行一次,運行中每個服務器上執行你的命令。這裏是你應該做的事情,而不是:

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 

接受的答案會的工作,但是這一個可以訪問的服務器作爲變量/方法

+0

'find_servers_for_task'完全按照描述工作。謝謝! – piersadrian

+1

這比接受的答案更好,尤其是如果您決定使用capture()而不是run()。 –

0

我想知道當前的服務器我是部署到,所以我可以發送消息給篝火。這就是我能搞清楚,但我敢肯定有一個更好的辦法

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

,所以當我部署它張貼這篝火 我使用帽QA2篝火部署20121206154442:通知部署部署: flex_master

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

我更喜歡這個。對於'system'命令,$ CAPISTRANO:HOST $不起作用,而使用這個工程很好。 – bibstha

0

Capistrano的(2.13.5)所需

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

通過

0123這出
puts current_task.namespace.logger.inspect 
相關問題