(cap3) Any documentation on writing capistrano 3 gems for programmatically adding servers during deploy?

145 views
Skip to first unread message

Michael

unread,
Jan 13, 2014, 12:31:05 PM1/13/14
to capis...@googlegroups.com
Versions:
  • Ruby
    • 2.0.0
  • Capistrano
    • 3.0.1
Does any documentation exist for writing capistrano 3 gems for programmatically adding servers during deployment?

I can only find Capistrano 2 gems for doing such tasks.  ( https://github.com/srbartlett/elbowhttps://github.com/tverbiscer/capistrano-asgroup )

I'm currently testing this:   (The below is a useless example, but should try to add '127.0.0.1' to the list of servers...)

root@domU-example:/var/lib/gems/2.0.0/gems/capistrano-autoscale-0.0.1/lib/capistrano# cat autoscale.rb
require 'aws-sdk'
require 'net/dns'

####  The below is old Cap2 syntax...  What is the new equivalent? ####
#Capistrano::Configuration.instance(:must_exist).load do
### end old syntax (I think) ####

module Capistrano
class Configuration
module ELB
def elastic_load_balancer(name, *args)

hostname = "127.0.0.1"
server(hostname, *args)
end

end

include ELB
end
end

This just fails with this:

root@domU-example:~/webapp# cap production deploy --trace
** Invoke production (first_time)
** Execute production
** Invoke load:defaults (first_time)
** Execute load:defaults
cap aborted!
undefined method `elastic_load_balancer' for main:Object
config/deploy/production.rb:14:in `<top (required)>'
/var/lib/gems/2.0.0/gems/capistrano-3.0.1/lib/capistrano/setup.rb:13:in `load'
/var/lib/gems/2.0.0/gems/capistrano-3.0.1/lib/capistrano/setup.rb:13:in `block (2 levels) in <top (required)>'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task.rb:236:in `call'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task.rb:236:in `block in execute'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task.rb:231:in `each'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task.rb:231:in `execute'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task.rb:175:in `block in invoke_with_call_chain'
/usr/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task.rb:168:in `invoke_with_call_chain'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task.rb:161:in `invoke'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:149:in `invoke_task'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `each'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `block in top_level'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:115:in `run_with_threads'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:100:in `top_level'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:78:in `block in run'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:165:in `standard_exception_handling'
/var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:75:in `run'
/var/lib/gems/2.0.0/gems/capistrano-3.0.1/lib/capistrano/application.rb:12:in `run'
/var/lib/gems/2.0.0/gems/capistrano-3.0.1/bin/cap:3:in `<top (required)>'
/usr/local/bin/cap:23:in `load'
/usr/local/bin/cap:23:in `<main>'
Tasks: TOP => production

Files:
  • Capfile
root@domU-example:~/webapp# cat Capfile  | grep -v "^#"
require 'capistrano/setup'

require 'capistrano/deploy'

require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
  • deploy.rb
root@dom-example:~/webapp# cat config/deploy.rb  | grep -v "^#" | grep -v "^$"
set :application, 'blog'
set :ssh_options, {:forward_agent => false, keys: ['/home/deploy/.ssh/private_key'], :paranoid => false}
set :deploy_via, :remote_cache
set :use_sudo, true
set :deploy_to, '/webapp'
set :scm, :git
set :scm_user, :git
namespace :deploy do
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      if test("[ ! -d " + release_path.join("tmp").to_s + " ]")
        execute "mkdir ", release_path.join("tmp")
      end
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end
  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end
  after :finishing, 'deploy:cleanup'
end
  • Stage files (production.rb, staging.rb)
root@domU-example:~/webapp/config/deploy/# cat production.rb  | grep -v "^#" 
require 'capistrano/autoscale'
set :rails_env, "production"

set :stage, :production
set :user, 'deploy'

elastic_load_balancer "example-elb.example.com", :web



Any pointers in the right direction would be greatly appreciated.  I've no issues reading as much documentation as you send me, but I haven't found this one yet....

-- Michael

Lee Hambley

unread,
Jan 13, 2014, 3:46:37 PM1/13/14
to capistrano
I can't see the value of the elastic_load_balancer function, if all it does it call server.

You haven't included your module into the main scope, you have included it into Capistrano::Configuration, where it should, if anywhere be in Capistrano::DSL.

To programatically define servers, just call `server()` from anywhere which has Capistrano::DSL included.

(I think that's right, anyway, I have't ever actually tried, but the top-level stuff like release_path and on() and friends all come from the DSL module being included in to the main scope)

--
You received this message because you are subscribed to the Google Groups "Capistrano" group.
To unsubscribe from this group and stop receiving emails from it, send an email to capistrano+...@googlegroups.com.
To view this discussion on the web, visit https://groups.google.com/d/msgid/capistrano/68f5e1b6-7b3b-4e97-a856-02e9614f341e%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Michael

unread,
Jan 14, 2014, 11:14:19 AM1/14/14
to capis...@googlegroups.com
https://github.com/srbartlett/elbow/pull/3

Thanks Lee.  That was the kick I needed.

Lee Hambley

unread,
Jan 14, 2014, 11:15:12 AM1/14/14
to capistrano

Awesome HTH!

Sent from my Nexus 4.

Reply all
Reply to author
Forward
0 new messages