Glenn, Thanks - I am actually using the amazon-ec2 gem as the basis for my plugin, and it is working quite nicely.
I also did take a look at 'capazon' a while back. I remember at the time that it didn't seem to be quite the route I wanted to go for my application due to some of requirements for how my cluster had to run and change in configuration dynamically, but perhaps I should take another look at it. Joe On Sep 30, 7:47 pm, Glenn Rempe <[EMAIL PROTECTED]> wrote: > You might also want to check out a work in progress gem that Jesse > Newland and I were working on... but which has not had any love in a > few months... > > http://rubyforge.org/projects/capsize/ > > Source here: > > svn checkout svn://rubyforge.org/var/svn/capsize > svn checkouthttp://capsize.rubyforge.org/svn/trunk/ > > You should be able to download it and see what it offers in the > website index.txt text. > > Build and install a local copy with 'rake local_deploy' > > This project has not released any files, but the code is all in SVN > and is functional for many use cases. Perhaps we can figure out a way > to combine efforts. > > This project is actually a re-write of the former 'capazon' gem (which > Jesse authored). It is designed to provide complete Capistrano access > to all of the functionality of the 'amazon-ec2' gem which I also wrote > and is in stable production mode (http://amazon-ec2.rubyforge.org/). > > Let me know what you think. > > Glenn > > On Sep 30, 3:22 pm, "[EMAIL PROTECTED]" > > <[EMAIL PROTECTED]> wrote: > > Joe, > > > I'd be interested in helping out with it. I'm getting ready to do a > > lot with EC2 in the coming weeks, and cap support for everything would > > be outstanding. Send me an email when you begin to work on it, and > > we'll get something setup. > > > Josh > > > On Sep 30, 10:57 am, Joe <[EMAIL PROTECTED]> wrote: > > > > Hi all, > > > > I've been working on a plugin to manage deployments of clusters on EC2 > > > through Capistrano. I'm looking to see if anyone is interested in > > > collaborating on it, or using it in alpha form to give me some > > > feedback. I'm not going to release it yet since it needs more > > > development and testing, but I would like to get some suggestions on > > > features to add. > > > > The tool is meant to manage the setup and confiiguration of machines > > > prior to running a normal cap:deploy of a specific application. It is > > > not meant to replace that. > > > > Here's an example of a cluster recipe (this is made up, so there may > > > be some logical errors in the setup, but it should illiustrate the > > > idea): > > > > ----- > > > > cluster = elasticize.creater_cluster("mykey") do > > > on_create do |cluster| > > > app_group = create_group(cluster, :app) do > > > authorize_ingress :proto => :tcp, :ports => 22 > > > authorize_ingress :proto => [ :tcp, :udp ], :ports => 5036 > > > end > > > webserver_group = create_group(cluster, :webserver_group) do > > > authorize_ingress :proto => :tcp, :ports => [ 22, 80 ] > > > end > > > > app_group.authorize_ingress :from => :webserver_group > > > webserver_group.authorize_ingress :from => :app_group > > > end > > > end > > > > app = elasticize.create_image :app, 'ami-12345678', > > > cluster, :app_group > > > web = elasticize.create_image :web, 'ami-87654321', > > > cluster, :webserver_group do > > > on_create do > > > # Get security updates > > > run "aptitude update -y" > > > run "aptitude upgrade -y" > > > end > > > end > > > > elasticize.create_role :postfix, web do > > > on_create do |process| > > > modify "/etc/postfix/main.cf" do |r| > > > r.sub(/(^myhostname[^=]*=.*$)/, "myhostname = > > > #{process.instance.dns}") > > > end > > > end > > > > on_stop { run "/etc/init.d/postfix stop" } > > > on_start do |process| > > > run "/etc/init.d/postfix start" > > > process.notify! :app, :port => 1234 > > > end > > > end > > > > elasticize.create_role :app, rails do > > > needs :db, :primary => true > > > needs :postfix > > > > on_receive do |process, source, event, *rest| > > > if event == :on_start > > > case source.role.name.to_sym > > > when :db > > > ip = process.instance.private_dns > > > port = *rest > > > when :postfix > > > # TODO: modify the rails configuration to point to the postfix > > > server > > > ip = process.instance.private_dns > > > port = *rest > > > end > > > end > > > end > > > end > > > > # Create an elastic role for the web server, bound to the 'rails' AMI > > > elasticize.create_role :web, rails do > > > needs :app > > > > on_receive do |process, source, event, *rest| > > > if event == :on_start > > > case source.role.name.to_sym > > > when :app > > > end > > > end > > > end > > > > on_create do > > > # Install needed gems > > > install_gem "daemons" > > > install_gem "gem_plugin" > > > install_gem "mongrel_cluster" > > > install_gem "mongrel", :version => '1.0.1' > > > end > > > end > > > > ----- > > > > You can then create the cluster with a cap cluster:create. This will > > > create the keys, security groups, permissions and instances. When a > > > particular instance is created, its corresponding image's 'on_start' > > > callback is called. Additionally, the create task will bind all > > > 'elasitc' roles to a particular machine and create the appropriate > > > capistrano role internally. When the binding occurs, the corresponding > > > on_start callback are called for the process' corresponding role. > > > There are additional callbacks when instances are terminated or leave > > > the cluster. > > > > The 'needs' method indicates that a particular elastic role is > > > dependent upon another, and that its' processes will accept > > > notifications (in the on_receive handler) of specific events within > > > the cluster from prerequisite processes (where a process represents a > > > binding of a role to an EC2 instance, since a role can have multiple > > > processes). The notifications are specified via the notify! method in > > > a process' on_start callback, and allows that process to deliver > > > dynamic configuration data to its dependent roles' processes. > > > > The 'provides' method specifies the number of processes which will > > > exist for a given role. Also, 'create_role' can specify capistrano > > > subroles (limited to a hash of keys to boolean values for now) like > > > this: > > > > primary = elasticize.create_role :db, some_image, :primary => true do > > > # Default is one if unspecified > > > provides :exactly => 1 > > > end > > > > secondary = elasticize.create_role, :db, some_image do > > > provides :min => 2, :max => 4 > > > end > > > > A planned feature will allow you to add and remove processes > > > dynamically, bounded by the min / max number specified in the recipe. > > > > cap cluster:add ROLE=db > > > > This is not meant to be a thorough write up, just a taste if what is > > > available. > > > > If you think you may be able to help, or just have some ideas for what > > > you'd like to see, please get in touch. In particular, API feedback or > > > help writing tests would be greatly appreciated. > > > > Joe --~--~---------~--~----~------------~-------~--~----~ To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/capistrano -~----------~----~----~----~------~----~------~--~---
