Actually, capistrano has that functionality baked in, via the :max_hosts
option. You could define your role with a block, so it gets evaluated
late (from a temp file, for example), and then just set the :max_hosts
option on the task in question. E.g.:

  role :dynamic_servers do
    IO.readlines(server_list).map { |line| line.chomp }
  end

  desc "Test cycling through servers"
  task :test_each, :roles => :dynamic_servers, :max_hosts => 5 do
    run "uptime"
  end

Then, when capistrano is asked to execute the "uptime" command on all
servers in the dynamic_servers role, it will first evaluate the block
for the dynamic_servers role, and will then see that it is only to use 5
hosts at a time.

- Jamis

JasonSmithy wrote:
> Hi,
> 
> Is there anyway to reset a role?
> 
> What I want to do is read a list of IPs dynamically from a temporary
> file, then run a task on a portion of the list at a time, not have the
> task run on all the IP's directly in parallel. What I am trying to do
> so far is to get the list, run the task on the first IP in the list,
> sleep for 5 seconds and then run the task again on the next IP in the
> list. Ideally, this would take 5 IPs at a time until all IPs are
> executed, but I need to learn to crawl before I can walk ;)
> 
> 
> task :test_cycle do
>       transaction do
>               set :j, 4
>               set :k, 0
>               $servers = IO.readlines(server_list)    # Get the list of 
> servers from
> temp file.
>               while k < j
>                               # This is a method to increment by one. 
> Capistrano
>                               # complains that "+" is an unknown method 
> without this.
>                   def add(value)
>                       value = value + 1
>                       return value
>                   end
> 
>                   $ip = $servers[k].chomp
> 
>                             role :servers_each, $ip           # Set the
> server_each role to the new IP
> 
>                             test_each                 # Run the task
>                       set :k, add(k)                  # Increment k by 1.
>                             role :servers_each, servers_each.clear
>                        end
>             end
> end
> 
> 
> 
> desc "Test cycling through servers"
> task :test_each, :roles => :servers_each do
>       run "uptime"
>       puts "Sleeping for 5 seconds"
>       sleep 5
> end
> 
> 
> This works except for each time the loop is run, the next IP gets
> added to the server_each role. This has the effect of re-running the
> command on each server each time. So the first time it runs from 1
> server. The next time, it runs on 2 servers, and so on.
> 
> How can I set server_each back to empty after running test_each and is
> this even the a good way to do this?
> 
> 
> Thanks in advance for you help!
> 
> 
> > 


--~--~---------~--~----~------------~-------~--~----~
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