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

Reply via email to