Andres,
I can't suppose this will solve your problem, but maybe you can use some of
my ideas for defining tasks/etc on the fly..
http://github.com/leehambley/capistrano-yaml-multistage/tree/master

-- Lee Hambley

Twitter: @leehambley
Blog: http://lee.hambley.name/
Working with Rails: http://is.gd/1s5W1


2009/8/27 Richie Vos <[email protected]>

>
> On 26 Aug, 17:04, Andres Paglayan <[email protected]> wrote:
> > For a bunch of identical applications running on virtual hosts on the
> > same machine
> > (apache and mod_rails)
> > some time ago Jamis suggested an approach along the lines of
> >
> > task :install_1 do
> >     set :deploy_to,  "/home/rails/install_1/#{application}"
> > end
> > ...
> > task :install_n do
> >     set :deploy_to,  "/home/rails/install_n/#{application}"
> > end
> >
> > Which works fine,
> > but there's some manual job involved each time a new instance is added,
> >
> > My need is to deploy to the array of virtual servers on the single
> > physical machine,
> > changing several things bases solely in the user => pass hash
> >
> > given {:user_1 => db_pass_1, :user_2 => db_pass_2, :user_n =>
> > db_pass_n }.each  do  |user_x, pass_x|
> >
> > Where data about the repository remains 'static' but
> > I need to set all the following accordingly for each user:
> >
> > set deploy_to: "/home/#{user_x}/apps/#{application}"
> >
> > set :app, "#{user_x}.my_domain.com"
> > set :web, "#{user_x}.my_domain.com"
> > set :db, "#{user_x}.my_domain.com"
> >
> > plus then modify each of the conf/database.yml accordingly
> > like in
> >
> > production:
> >    adapter: mysql
> >    encoding: utf8
> >    database: #{user_x}_app_production
> >    username: #{user_x}
> >    password: #{pass_x}
> >
> > and I'd like all of that to happen when I say
> > cap deploy:update
> > I would even give up to add,
> > cap deploy:configure_database
>
> I'm not sure how to do this purely in cap, it seems like it'd be a lot
> of screw around to get it to work. What I would do is write a rake
> task that does the iteration and calls out to cap. It'd probably be
> wayyy easier than trying to man-handle cap into doing what you're
> asking. Though I hope someone else proves me wrong.
>
> To deploy:
> rake deploy
>
> ==============================
> deploy.rake
> task deploy do
>  users = {:user_1 => db_pass_1, :user_2 => db_pass_2, :user_n =>
> db_pass_n }
>  users.each do |user, pass|
>    system("cap deploy:update -S user=#{user} -S pass=#{pass}") or
> abort("Could not deploy to #{user}")
>  end
> end
> ==============================
>
> Then in cap I'd handle the different variables:
>
> ==============================
> deploy.rb
>
> def validate_credentials
>  fail("Cannot deploy without giving user credentials") unless
> variables[:user] && variables[:password]
> end
>
> validate_credentials
>
> set :user, variables[:user]
> set :password, variables[:password]
>
> logger.info("Deploying to #{user}")
>
> set deploy_to: "/home/#{user}/apps/#{application}"
>
> set :app, "#{user}.my_domain.com"
> set :web, "#{user}.my_domain.com"
> set :db, "#{user}.my_domain.com"
>
> # and configure it to write out the database.yml
> # some other options:
> # * manually put the database.yml in the #{shared_path}/config/
> database.yml and just symlink
> #   This has the big benefit of only keeping the credentials on the
> server itself and not having
> #   to manage them outside of that (Assuming they're relatively
> static, I would do that)
> # * automatically put the creds in #{shared_path}/config/database.yml
> and symlink it in
> namespace :db do
>  task :update_config, :roles => :app, :except => { :no_release =>
> true } do
>    yaml = <<EOF
> production:
>  adapter: mysql
>  encoding: utf8
>   database: #{user}_app_production
>  username: #{user}
>  password: #{pass}
> EOF
>
>    # now get that file into #{release_path}/config/database.yml
>    # leave that up to you
>    # I'd probably write to a temp file and upload it (should make
> sure to delete it afterwards to
>    # avoid leaving a credentials file in tmp)
>    # or echo it directly into a file on that box (but I can never get
> multiline stuff to work
>    # properly when doing a run("..."))
>  end
>
>  after 'deploy:update_code', 'db:update_config'
> end
> ==============================
>
> The way I've been managing config files like this is a bit like this
> approach, but I write them all and then upload them all at once:
> require 'ftools'
> namespace :config do
>  task :build do
>    File.mkdir_p temp_config_dir
>    # this is the place to hook after when creating a config file
>  end
>
>  task :update do
>    # upload contents of temp_config_dir to #{release_path}/config
>  end
>
>  before 'config:update', 'config:build'
>  after 'deploy:update_code', 'config:update'
> end
>
> task :some_config do
>  # write file1 to temp_config_dir
> end
> task :some_other_config do
>  # write file2 to temp_config_dir
> end
> after 'config:build', 'some_config'
> after 'config:build', 'some_other_config'
>
> # both file1 and file2 will automatically get uploaded to #
> {release_path}/config/[file1, file2]
>
> But we have a bunch of config files we write (database, memcached,
> sphinx, ...) and that approach may be overkill for you (though it
> probably would be something that could go in capistrano-ext if anyone
> likes it).
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Capistrano" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.co.uk/group/capistrano?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to