【问题标题】:Referencing the current server in Capistrano task在 Capistrano 任务中引用当前服务器
【发布时间】:2012-06-18 15:53:35
【问题描述】:

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

【问题讨论】:

    标签: php ruby deployment capistrano apc


    【解决方案1】:

    这就是神奇的 $CAPISTRANO:HOST$

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

    应该做你想做的事。

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

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

    【讨论】:

    • 这看起来真的很hacky。为什么 Capistrano 的人不把它变成一种方法?
    • 也许@leehambley 知道答案;)我会告诉他这个问题
    • 我现在明白了——看看我的答案!
    • user1158559 有一个更好的答案,尽管它不是被接受的。
    • @Nate 问题是如何访问主机名,这是最快的方法。考虑到原始问题,您能否详细说明为什么您更喜欢下面的方法而不是我的解决方案?
    【解决方案2】:

    在 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
    

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

    【讨论】:

    • find_servers_for_task 完全按照描述工作。谢谢!
    • 这比公认的答案更好,尤其是如果您决定使用 capture() 而不是 run()。
    【解决方案3】:

    我想知道我正在部署的当前服务器,以便我可以向 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

    【讨论】:

      【解决方案4】:
      current_host = capture("echo $CAPISTRANO:HOST$").strip
      

      【讨论】:

      • 我更喜欢这个。对于system 命令,$CAPISTRANO:HOST$ 不起作用,而使用它效果很好。
      【解决方案5】:

      需要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
      

      【讨论】:

        【解决方案6】:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-04
          • 1970-01-01
          • 2011-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-16
          • 1970-01-01
          相关资源
          最近更新 更多