Ссылка на текущий сервер в задаче Capistrano
Как бы я ссылался на текущий сервер в задаче 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 http://2.2.2.2/deploy/clearAPC.php
5 answers
Вот волшебный $CAPISTRANO: ХОСТ$
run "curl http://$CAPISTRANO:HOST$/deploy/clearAPC.php"
Должен делать именно то, что вы хотите.
Примечание: не используйте его в качестве переменной с помощью интерполяции строк, capistrano просто заменит $CAPISTRANO:HOST$ в самой строке.
Это очень странная и (afaik) недокументированная функция:-)
В Капистрано задачи не выполняются один раз для каждого сервера, 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
Принятый ответ будет работать, но этот позволяет вам обращаться к серверам как к переменным/методам
current_host = capture("echo $CAPISTRANO:HOST$").strip
Я хотел знать текущий сервер, на котором я развертывался, чтобы я мог отправить сообщение в 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(' ')}"
Поэтому, когда я разворачиваю его, он публикует это в campfire Я развертываю 20121206154442 с помощью cap QA2 campfire: уведомить о развертывании развертывание: flex_master
Требуется Капистрано (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