Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Capistrano任务中引用当前服务器_Php_Ruby_Deployment_Capistrano_Apc - Fatal编程技术网

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

Php 在Capistrano任务中引用当前服务器,php,ruby,deployment,capistrano,apc,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

如何在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

这里有一个神奇的$CAPISTRANO:HOST$

run "curl http://$CAPISTRANO:HOST$/deploy/clearAPC.php" 
你应该做你想做的事

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


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

在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

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

我想知道我部署到的当前服务器,以便向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营火部署20121206154442:需要通知部署:flex_master

current_host = capture("echo $CAPISTRANO:HOST$").strip
我是通过

puts current_task.namespace.logger.inspect

Capistrano 3-服务器在角色块中作为具有一组属性的对象提供:

关于角色(:app)do | server |

例如,将hostname属性传递给docker compose

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

这看起来真的很粗糙。为什么Capistrano的人不把它作为一种方法呢?也许@leehambley知道答案;)我会告诉他我现在理解的这个问题——看看我的答案!user1158559有一个更好的答案,尽管它不是公认的答案。@Nate问题是如何访问主机名,这是最快的方法。考虑到最初的问题,您可以详细说明为什么您更喜欢下面的方法而不是我的解决方案吗?
find_servers_for_task
的工作原理与前面描述的完全相同。非常感谢。这比公认的答案更有效,尤其是当您决定使用capture()而不是run()时。我更喜欢这样。对于
系统
命令,$CAPISTRANO:HOST$在使用该命令时不起作用。
  on roles(:app)  do |server|
    execute "docker-compose --build-arg SOME_HOST_NEEDED=#{server.hostname} ......
  end