Thanks, Bryan. The existing behavior is definitely surprising in some  
situations, but not in others. Consider an imaginary task like the  
following:

   task :start_cold do
     deploy.update
     start_web_server
     deploy.migrate
     start_listeners
   end

In this case, the :start_cold task itself applies to all servers  
(because of the absense of a :roles or :hosts key). The deploy.update  
call applies to all :app, :web, and :db servers. The start_web_server  
would probably only apply to :web. deploy.migrate works only on :db  
(:primary => true). And start_listeners would probably just run on :app.

That said, I can see the value in something like this:

   task :do_something_on_server, :scope => :inherit do
     # ...
   end

Where the roles for the task inherit from the task that invoked it.  
Maybe there's a cleaner way to do this, even. Anyone want to try their  
hand a patch?

- Jamis

On May 6, 2008, at 9:49 AM, bryanl wrote:

>
> ’ve been knee deep in capistrano lately, and I’ve come across in
> interesting behavior:
>
> Say you have the following:
>
> role :app, "app"
> role :web, "web"
>
> task :run_on_web, :roles => :web do
>  do_something_on_server
> end
>
> task :run_on_app, :roles => :app do
>  do_something_on_server
> end
>
> task :do_something_on_server do
>  run "/usr/sbin/something"
> end
>
> If you run the run_on_web task, it will execute the
> do_something_on_server task using all roles. This isn’t the behavior
> you most expected most likely. The secret to making this work is to
> set ENV[‘HOSTS’] match your the set of hosts you are interested in.
> After you are done you’ll want to set ENV[‘HOSTS’] hosts back to it’s
> original contents. I’ve whipped up a quick method to make this even
> easier.
>
> def with_role(role, &block)
>  original, ENV['HOSTS'] = ENV['HOSTS'], find_servers(:roles
> =>role).map{|d| d.host}.join(",")
>  begin
>    yield
>  ensure
>    ENV['HOSTS'] = original
>  end
> end
> You can call it like this:
>
>
> role :app, "app"
> role :web, "web"
>
> task :run_on_web, :roles => :web do
>  with_role :web do
>    do_something_on_server
>  end
> end
>
> task :run_on_app, :roles => :app do
>  with_role :app do
>    do_something_on_server
>  end
> end
>
> task :do_something_on_server do
>  run "/usr/sbin/something"
> end
>
>
> Hopefully this helps someone.
>
> (also posted here: 
> http://smartic.us/2008/5/6/keeping-capistrano-in-check-ensuring-roles-are-respected-in-sub-tasks)
> >


--~--~---------~--~----~------------~-------~--~----~
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/capistrano
-~----------~----~----~----~------~----~------~--~---

Reply via email to