【问题标题】:Creating a Capistrano task that performs different tasks based on role创建一个基于角色执行不同任务的 Capistrano 任务
【发布时间】:2009-04-15 22:34:51
【问题描述】:

我正在寻找一种方法来调用单个 Capistrano 任务来为不同的角色执行不同的事情。 Capistrano 是否能够做到这一点,或者我是否为每个角色编写了特定的任务?

【问题讨论】:

    标签: ruby capistrano


    【解决方案1】:

    在 Capistrano 中执行此操作的标准方法:

    task :whatever, :roles => [:x, :y, :z] do
      x_tasks
      y_tasks
      z_tasks
    end
    
    task :x_tasks, :roles => :x do
      #...
    end
    
    task :y_tasks, :roles => :y do
      #...
    end
    
    task :z_tasks, :roles => :z do
      #...
    end
    

    所以是的,您确实需要编写单独的任务,但您可以从父任务中调用它们,它们会适当地过滤。

    【讨论】:

      【解决方案2】:

      其实没有:

      % cat capfile 
      server 'localhost', :role2
      task :task1, :roles=>:role1 do
        puts 'task1'
      end
      task :task2 do
        task1
      end
      
      % cap task2  
        * executing `task2'
        * executing `task1'
      task1
      

      :roles 参数被进一步传递给运行命令等,但似乎并不影响任务是否被实际触发。

      抱歉,没有找到对评论发表评论的方法,所以我在这里写了。

      【讨论】:

        【解决方案3】:

        你也可以这样做

        task :foo do
            run "command", :roles => :some_role
            upload "source", "destination", :roles => :another_role
        end
        

        【讨论】:

          【解决方案4】:

          使用命名空间: https://github.com/leehambley/capistrano-handbook/blob/master/index.markdown#namespacing-tasks

          namespace :backup do
          
            task :default do
              web
              db
            end
          
            task :web, :roles => :web do
              puts "Backing Up Web Server"
            end
          
            task :db, :roles => :db do
              puts "Backing Up DB Server"
            end
          end
          

          这些任务在 cap -T 中显示为

          backup:default 
          backup:web
          backup:db
          

          【讨论】:

            【解决方案5】:

            有一种方法。检查:http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/,您会看到可以使用 ROLES 环境变量覆盖默认角色。

            我有一个任务定义为:

            desc "A simple test to show we can ssh into all servers"
            task :echo_hello, :roles => :test do
               run "echo 'hello, world!'"
            end
            

            :test 角色分配给一台服务器。

            在命令行,我可以运行:

            [james@fluffyninja bin]$ cap echo_hello ROLES=lots_of_servers
            

            该任务现在将在lots_of_servers 角色上运行。

            我还没有通过更新 ENV 哈希验证这在 ruby​​ 脚本中是否有效,但这是一个好的开始。

            【讨论】:

              【解决方案6】:

              仅作记录,这可能是使用 Capistrano 3 的解决方案:

              desc "Do something specific for 3 different servers with 3 different roles"
              task :do_something do
                on roles(:api_role), in: :sequence do
                  # do something in api server
                end
              
                on roles(:app_role), in: :sequence do
                  # do something in application server
                end
              
                on roles(:another_role), in: :sequence do
                  # do something in another server
                end
              end
              

              在应用服务器中执行“do_something”任务的服务器定义类似于:

              server 'application.your.domain', user: 'deploy', roles: %w{app_role}
              

              然后就可以调用任务了(有几种方法),任务会根据“app_role”执行具体的指令。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-05-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-08-26
                • 2016-11-08
                相关资源
                最近更新 更多