Rails Machine




Thursday, January 15, 2009
The State of Rails
                             Application Deployment




Thursday, January 15, 2009
It’s easy, I’ll just use
                                  Capistrano.


Thursday, January 15, 2009
ssh m
                        e@myn
                              e wserv
                                     er.co
     ...
ssh m
                        e@myn
                              e wserv
                                     er.co
     ...
ssh m
                        e@myn
                              e      wserv
                                          e...
l‐
     ssh m                                                  ysq  
                  e@myn                              ...
l‐
     ssh m                                                  ysq  
                  e@myn                              ...
l‐
     ssh m                                                  ysq  
                  e@myn                              ...
UR SHIPMENT OF FAIL HAS ARRIVED
Thursday, January 15, 2009
What is
                             deployment?




Thursday, January 15, 2009
A Series of
                             Dependencies
                    • Rails v2.2.2, v1.2.3, etc
                    ...
A Series of
                                  Dependencies
                             • rmagick
                        ...
Satisfying these dependencies via
                               shell commands is backwards




Thursday, January 15, 2009
• impossible to verify
                    • not revisioned
                    • no ‘migrations’
                    • no...
Not “The Rails Way”




Thursday, January 15, 2009
script/plugin install moonshine_rails*
                 script/generate moonshine




Thursday, January 15, 2009
Moonshine::Manifest

 #config/moonshine/default.rb
 class Moonshine::Manifest::Rails::Production < Moonshine::Manifest::Ra...
Opinionated Software
Thursday, January 15, 2009
Opinionated Deployment
Thursday, January 15, 2009
Decisions We’ve
                                  Made For You
                    •        Ubuntu

                    • ...
Look at all the choices
                                I’m not making
                     class Moonshine::Manifest::Rai...
On your server...


Thursday, January 15, 2009
sudo apt‐get install moonshine*
                                 sudo moonshine




Thursday, January 15, 2009
Answer some questions
                    • application name
                    • git repo
                    • branch t...
Moonshine goes to
                                   work
                    • clones your repo
                    • par...
Gem Dependencies
                   gem_dependencies do |gem|

                     #lots of dependencies are specified fo...
#need to deploy again?
                                 sudo moonshine




Thursday, January 15, 2009
On subsequent runs
                    • updates your repo
                    • parses and executes updated moonshine
   ...
Deployment is now...
                    • Reproducible
                    • Verified from top-bottom on each deploy
     ...
Puppet Based
                             class MysqlMain < Moonshine::Manifest
                               puppet.file...
But Ruby

             class MysqlMain < Moonshine::Manifest
               puppet.file '/etc/my.cnf',
                 :e...
Modular
                    UrClass < Moonshine::Manifest::Rails < Moonshine::Manifest




                    • easy to c...
Sample ‘plugin’
                       module MoonshineOrderedPackages
                         def packages(array_or_name...
Coming Soon


                    • screencast demo (blog.railsmachine.com)
                    • source on GitHub


Thurs...
Questions?



Thursday, January 15, 2009
Jesse Newland



                              jesse@railsmachine.com


Thursday, January 15, 2009
Flickr FTW

                    •        http://www.flickr.com/photos/wolfgangstaudt/2279651479/sizes/o/

                 ...
Upcoming SlideShare
Loading in...5
×

Moonshine: Configuration Management and Deployment

1,469

Published on

Moonshine is an opensource configuration management and deployment system being released later this month.

Moonshine follows the Rails way, simplifying server configuration, dependency management, and Rails application deployment. We’ve created this system to be as simple and seamless as possible, with a focus on well-tested, reliable software like Ruby and Puppet. We’ve been using Puppet internally for some time, and Moonshine presented an excellent opportunity to integrate it with Rails and application deployment.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,469
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
2
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Moonshine: Configuration Management and Deployment

  1. 1. Rails Machine Thursday, January 15, 2009
  2. 2. The State of Rails Application Deployment Thursday, January 15, 2009
  3. 3. It’s easy, I’ll just use Capistrano. Thursday, January 15, 2009
  4. 4. ssh m e@myn e wserv er.co m It’s easy, I’ll just use Capistrano. Thursday, January 15, 2009
  5. 5. ssh m e@myn e wserv er.co m It’s easy, I’ll just use Capistrano. apt ‐ge t  in lib stal mag l l ick ibm 9‐d agi ck1 ev 0  Thursday, January 15, 2009
  6. 6. ssh m e@myn e wserv er.co m ick ag rm l  al nst  i It’s easy, I’ll just use em g Capistrano. apt ‐ge t  in lib stal mag l l ick ibm 9‐d agi ck1 ev 0   Thursday, January 15, 2009
  7. 7. l‐ ssh m ysq   e@myn  m by all ‐ru ewser st ql ver.c in ys ev t  bm om 5‐d ge li t‐ r  t1 p en k a rve cli gic se ysql ma l r bm l li ta ins m  It’s easy, I’ll just use e g Capistrano. apt ‐ge t  in lib stal mag l l ick ibm 9‐d agi ck1 ev 0  Thursday, January 15, 2009
  8. 8. l‐ ssh m ysq   e@myn  m by all ‐ru ewser st ql ver.c in ys ev t  bm om 5‐d ge li t‐ r  t1 p en k a rve cli gic se ysql ma l r bm l li ta ins m  It’s easy, I’ll just use e g Capistrano. /my.cnf apt ‐ge etc t  in  / vi sta lib mag ll l ick ibm 9‐d agi ck1 ev 0  Thursday, January 15, 2009
  9. 9. l‐ ssh m ysq   e@myn  m by all ‐ru ewser st ql ver.c in ys ev t  bm om 5‐d ge li t‐ r  t1 p en k a rve cli gic se ysql ma l r bm l li ta ins m  It’s easy, I’ll just use e g Capistrano. /my.cnf apt ‐ge etc t  in  / vi sta lib mag ll l /etc/ init. ibm ick d/mys 9‐d agi ql st art ck1 ev 0  Thursday, January 15, 2009
  10. 10. UR SHIPMENT OF FAIL HAS ARRIVED Thursday, January 15, 2009
  11. 11. What is deployment? Thursday, January 15, 2009
  12. 12. A Series of Dependencies • Rails v2.2.2, v1.2.3, etc • Ruby/Ruby Enterprise • Apache/Nginx • Passenger/Thin/Mongrel • MySQL/PostgreSQL • system user Thursday, January 15, 2009
  13. 13. A Series of Dependencies • rmagick • libmagick10 libmagick9-dev • thinking-sphinx • compile by hand • memcached • libmemcached, rubygem, service Thursday, January 15, 2009
  14. 14. Satisfying these dependencies via shell commands is backwards Thursday, January 15, 2009
  15. 15. • impossible to verify • not revisioned • no ‘migrations’ • not DRY • not testable Thursday, January 15, 2009
  16. 16. Not “The Rails Way” Thursday, January 15, 2009
  17. 17. script/plugin install moonshine_rails* script/generate moonshine Thursday, January 15, 2009
  18. 18. Moonshine::Manifest #config/moonshine/default.rb class Moonshine::Manifest::Rails::Production < Moonshine::Manifest::Rails   #packages(%w(vim curl))   #service('memcached', %w(memcache libmemcached))   #puppet.exec 'foo',   #  :command => quot;echo 'normal puppet stuff' > /tmp/testquot; end Thursday, January 15, 2009
  19. 19. Opinionated Software Thursday, January 15, 2009
  20. 20. Opinionated Deployment Thursday, January 15, 2009
  21. 21. Decisions We’ve Made For You • Ubuntu • Apache • Passenger • Ruby Enterprise Edition • MySQL • ‘rails’ user • /srv/rails Thursday, January 15, 2009
  22. 22. Look at all the choices I’m not making class Moonshine::Manifest::Rails < Moonshine::Manifest   requires [     :user,     :ruby,     :rubygems,     :db,     :web,     :rails,     :deploy   ]   provides :user, 'rails'   provides :ruby, 'enterprise_ruby'   provides :rubygems, 'enterprise_rubygems'   provides :db, 'mysql'   provides :web, 'apache2'   provides :rails, 'passenger'   provides :deploy, 'git' end Thursday, January 15, 2009
  23. 23. On your server... Thursday, January 15, 2009
  24. 24. sudo apt‐get install moonshine* sudo moonshine Thursday, January 15, 2009
  25. 25. Answer some questions • application name • git repo • branch to deploy from • user to create • generates SSH key for git host • server ‘tags’ Thursday, January 15, 2009
  26. 26. Moonshine goes to work • clones your repo • parses and executes generated moonshine manifests • installs needed gems • install dependencies • migrates your db • deploys your app Thursday, January 15, 2009
  27. 27. Gem Dependencies gem_dependencies do |gem|   #lots of dependencies are specified for you already   #gem.packages 'mysql', %w(mysql‐dev libmysqlclient5‐dev)   #gem.packages 'rmagick', %w(ruby‐dev libmagick9‐dev)   #...   #can specify a mini‐manifest to satisfy before   #installation of this gem    gem.custom 'urgem' do |puppet|     puppet.file '/file/needed/by/ur/gem',       :ensure   => 'present',       :content  => 'foo'     build_tarball('http://whatever.com/lib‐something.tgz')   end end Thursday, January 15, 2009
  28. 28. #need to deploy again? sudo moonshine Thursday, January 15, 2009
  29. 29. On subsequent runs • updates your repo • parses and executes updated moonshine manifests • verifies needed gems • verifies dependencies • migrates your db • deploys your app Thursday, January 15, 2009
  30. 30. Deployment is now... • Reproducible • Verified from top-bottom on each deploy • Versionable with your application • same commit can contain, for example, thinking sphinx and installation of the sphinx searchd daemon • DRY Thursday, January 15, 2009
  31. 31. Puppet Based class MysqlMain < Moonshine::Manifest   puppet.file '/etc/my.cnf',     :ensure => 'present',     :content => quot;quot;quot; [client] port      = 3306 socket    = /var/run/mysqld/mysqld.sock [mysqld] default‐character‐set = utf8 key_buffer            = 16M max_allowed_packet    = 16M thread_stack          = 128K thread_cache_size     = 8 quot;quot;quot; end Thursday, January 15, 2009
  32. 32. But Ruby class MysqlMain < Moonshine::Manifest   puppet.file '/etc/my.cnf',     :ensure   => 'present',     :content  => ArbitraryKlass.arbitrary_function('foo') end Thursday, January 15, 2009
  33. 33. Modular UrClass < Moonshine::Manifest::Rails < Moonshine::Manifest • easy to create your own reusable server manifests • extend existing ones with modules Thursday, January 15, 2009
  34. 34. Sample ‘plugin’ module MoonshineOrderedPackages   def packages(array_or_name, params = {})     package_array = array_or_name.to_a     params = {       :ensure => 'installed'     }.merge(params)     package_array.each_with_index do |name,index|       #ensure packages are installed in order given       package_params = params       if package_array[index+1]         package_params.merge({           :before => package(package_array[index+1])         })       end       puppet.package name.to_s, package_params     end   end end Moonshine::Manifest::Rails.send(:extend, MoonshineOrderedPackages) Thursday, January 15, 2009
  35. 35. Coming Soon • screencast demo (blog.railsmachine.com) • source on GitHub Thursday, January 15, 2009
  36. 36. Questions? Thursday, January 15, 2009
  37. 37. Jesse Newland jesse@railsmachine.com Thursday, January 15, 2009
  38. 38. Flickr FTW • http://www.flickr.com/photos/wolfgangstaudt/2279651479/sizes/o/ • http://www.flickr.com/photos/ramdac/373881476/sizes/o/ • http://www.flickr.com/photos/striatic/2192189572/sizes/o/ • http://www.flickr.com/photos/blakespot/2376243022/sizes/o • http://www.flickr.com/photos/gravestone/449328990/sizes/l/ • http://www.flickr.com/photos/redglow/410800461/sizes/o/ Thursday, January 15, 2009
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×