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