SlideShare a Scribd company logo
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
                               ewser
                                    ver.c
                                         om




                             It’s easy, I’ll just use
                                  Capistrano.


Thursday, January 15, 2009
ssh m
                        e@myn
                               ewser
                                      ver.c
                                            om




                             It’s easy, I’ll just use
     apt
                ‐ge
                                  Capistrano.
                         t i
                             nst
                         lib     all
                             mag      li
                                 ick     bma
                                     9‐d     gic
                                         ev      k10
                                                     
Thursday, January 15, 2009
ssh m
                        e@myn
                                ewser
                                          ver.c
                                                om

                                       ag ick
                                  l  rm
                             st al
                 m  in
         ge
                             It’s easy, I’ll just use
     apt
                ‐ge
                                  Capistrano.
                         t i
                             nst
                         lib     all
                             mag      li
                                 ick     bma
                                     9‐d     gic
                                         ev      k10
                                                      
Thursday, January 15, 2009
ssh m                                                          l‐
                    e@myn                                       ysq  
                                                              m by
                           ewser
                                  ver.c                  all ‐ru
                                                       st ql
                                         om          in ys
                                                   t  bm             ev
                                            p
                                                ge li
                                              t‐ r            t1 5‐d
                                        k a rve            en
                                 ma gic      se ysql   cli
                           l l r                 bm
                        ta                    li
                 m  ins
         ge
                             It’s easy, I’ll just use
     apt
                ‐ge
                                  Capistrano.
                         t i
                             nst
                         lib     all
                             mag      li
                                 ick     bma
                                     9‐d     gic
                                         ev      k10
                                                     
Thursday, January 15, 2009
ssh m                                                          l‐
                    e@myn                                       ysq  
                                                              m by
                           ewser
                                  ver.c                  all ‐ru
                                                       st ql
                                         om          in ys
                                                   t  bm             ev
                                            p
                                                ge li
                                              t‐ r            t1 5‐d
                                        k a rve            en
                                 ma gic      se ysql   cli
                           l l r                 bm
                        ta                    li
                 m  ins
         ge
                             It’s easy, I’ll just use
     apt
                ‐ge
                                  Capistrano. /my.cnf
                         t i
                             nst                           / etc
                         lib     all                   vi
                             mag      li
                                 ick     bma
                                     9‐d     gic
                                         ev      k10
                                                      
Thursday, January 15, 2009
ssh m                                                          l‐
                    e@myn                                       ysq  
                                                              m by
                           ewser
                                  ver.c                  all ‐ru
                                                       st ql
                                         om          in ys
                                                   t  bm             ev
                                            p
                                                ge li
                                              t‐ r            t1 5‐d
                                        k a rve            en
                                 ma gic      se ysql   cli
                           l l r                 bm
                        ta                    li
                 m  ins
         ge
                             It’s easy, I’ll just use
     apt
                ‐ge
                                  Capistrano. /my.cnf
                         t i
                             nst                           / etc
                         lib     all                   vi
                             mag      li    /etc/
                                 ick               init.
                                         bma               d/mys
                                     9‐d     gic                 ql st
                                         ev      k10                   art
                                                      
Thursday, January 15, 2009
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
                     • Ruby/Ruby Enterprise
                     • Apache/Nginx
                     • Passenger/Thin/Mongrel
                     • MySQL/PostgreSQL
                     • system user
Thursday, January 15, 2009
A Series of
                                  Dependencies
                             • rmagick
                              • libmagick10 libmagick9-dev
                             • thinking-sphinx
                              • compile by hand
                             • memcached
                              • libmemcached, rubygem, service
Thursday, January 15, 2009
Satisfying these dependencies via
                               shell commands is backwards




Thursday, January 15, 2009
• impossible to verify
                    • not revisioned
                    • no ‘migrations’
                    • not DRY
                    • not testable

Thursday, January 15, 2009
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::Rails
   #packages(%w(vim curl))

   #service('memcached', %w(memcache libmemcached))

   #puppet.exec 'foo',
   #  :command => "echo 'normal puppet stuff' > /tmp/test"
 end




Thursday, January 15, 2009
Opinionated Software
Thursday, January 15, 2009
Opinionated Deployment
Thursday, January 15, 2009
Decisions We’ve
                                  Made For You
                    •        Ubuntu

                    •        Apache

                    •        Passenger

                    •        Ruby Enterprise Edition

                    •        MySQL

                    •        ‘rails’ user

                    •        /srv/rails


Thursday, January 15, 2009
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
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 to deploy from
                    • user to create
                     • generates SSH key for git host
                    • server ‘tags’
Thursday, January 15, 2009
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
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
#need to deploy again?
                                 sudo moonshine




Thursday, January 15, 2009
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
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
Puppet Based
                             class MysqlMain < Moonshine::Manifest
                               puppet.file '/etc/my.cnf',
                                 :ensure => 'present',
                                 :content => """
                             [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
                             """
                             end




Thursday, January 15, 2009
But Ruby

             class MysqlMain < Moonshine::Manifest
               puppet.file '/etc/my.cnf',
                 :ensure   => 'present',
                 :content  => ArbitraryKlass.arbitrary_function('foo')
             end




Thursday, January 15, 2009
Modular
                    UrClass < Moonshine::Manifest::Rails < Moonshine::Manifest




                    • easy to create your own reusable
                             server manifests

                    • extend existing ones with modules


Thursday, January 15, 2009
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
Coming Soon


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


Thursday, January 15, 2009
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/

                    •        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

More Related Content

More from elliando dias

Geometria Projetiva
Geometria ProjetivaGeometria Projetiva
Geometria Projetiva
elliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
elliando dias
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
elliando dias
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!
elliando dias
 
Ragel talk
Ragel talkRagel talk
Ragel talk
elliando dias
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Web
elliando dias
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
elliando dias
 
Minicurso arduino
Minicurso arduinoMinicurso arduino
Minicurso arduino
elliando dias
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorcery
elliando dias
 
Rango
RangoRango
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Design
elliando dias
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makes
elliando dias
 
Hadoop + Clojure
Hadoop + ClojureHadoop + Clojure
Hadoop + Clojure
elliando dias
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.
elliando dias
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebook
elliando dias
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Study
elliando dias
 
From Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn IntroductionFrom Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn Introduction
elliando dias
 
FleetDB A Schema-Free Database in Clojure
FleetDB A Schema-Free Database in ClojureFleetDB A Schema-Free Database in Clojure
FleetDB A Schema-Free Database in Clojure
elliando dias
 
Clojure and The Robot Apocalypse
Clojure and The Robot ApocalypseClojure and The Robot Apocalypse
Clojure and The Robot Apocalypse
elliando dias
 
Clojure - A new Lisp
Clojure - A new LispClojure - A new Lisp
Clojure - A new Lisp
elliando dias
 

More from elliando dias (20)

Geometria Projetiva
Geometria ProjetivaGeometria Projetiva
Geometria Projetiva
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!
 
Ragel talk
Ragel talkRagel talk
Ragel talk
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Web
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Minicurso arduino
Minicurso arduinoMinicurso arduino
Minicurso arduino
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorcery
 
Rango
RangoRango
Rango
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Design
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makes
 
Hadoop + Clojure
Hadoop + ClojureHadoop + Clojure
Hadoop + Clojure
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebook
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Study
 
From Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn IntroductionFrom Lisp to Clojure/Incanter and RAn Introduction
From Lisp to Clojure/Incanter and RAn Introduction
 
FleetDB A Schema-Free Database in Clojure
FleetDB A Schema-Free Database in ClojureFleetDB A Schema-Free Database in Clojure
FleetDB A Schema-Free Database in Clojure
 
Clojure and The Robot Apocalypse
Clojure and The Robot ApocalypseClojure and The Robot Apocalypse
Clojure and The Robot Apocalypse
 
Clojure - A new Lisp
Clojure - A new LispClojure - A new Lisp
Clojure - A new Lisp
 

Recently uploaded

Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
Ivo Velitchkov
 
Principle of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptxPrinciple of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptx
BibashShahi
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
Jakub Marek
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
Zilliz
 
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectorsConnector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
DianaGray10
 
Mutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented ChatbotsMutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented Chatbots
Pablo Gómez Abajo
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
DanBrown980551
 
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge GraphGraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
Neo4j
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
Javier Junquera
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
Antonios Katsarakis
 
AppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSFAppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSF
Ajin Abraham
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
Edge AI and Vision Alliance
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
AstuteBusiness
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
Fwdays
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
saastr
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
Safe Software
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
operationspcvita
 

Recently uploaded (20)

Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
 
Principle of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptxPrinciple of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptx
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
 
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectorsConnector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
 
Mutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented ChatbotsMutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented Chatbots
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
 
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge GraphGraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
 
AppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSFAppSec PNW: Android and iOS Application Security with MobSF
AppSec PNW: Android and iOS Application Security with MobSF
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
 

Railsmachine - Moonshine

  • 2. The State of Rails Application Deployment Thursday, January 15, 2009
  • 3. It’s easy, I’ll just use Capistrano. Thursday, January 15, 2009
  • 4. ssh m e@myn ewser ver.c om It’s easy, I’ll just use Capistrano. Thursday, January 15, 2009
  • 5. ssh m e@myn ewser ver.c om It’s easy, I’ll just use apt ‐ge Capistrano. t i nst lib all mag  li ick bma 9‐d gic ev k10   Thursday, January 15, 2009
  • 6. ssh m e@myn ewser ver.c om ag ick l  rm st al m  in ge It’s easy, I’ll just use apt ‐ge Capistrano. t i nst lib all mag  li ick bma 9‐d gic ev k10   Thursday, January 15, 2009
  • 7. ssh m l‐ e@myn ysq    m by ewser ver.c all ‐ru st ql om in ys t  bm ev p ge li t‐ r  t1 5‐d k a rve en ma gic se ysql cli l l r bm ta li m  ins ge It’s easy, I’ll just use apt ‐ge Capistrano. t i nst lib all mag  li ick bma 9‐d gic ev k10   Thursday, January 15, 2009
  • 8. ssh m l‐ e@myn ysq    m by ewser ver.c all ‐ru st ql om in ys t  bm ev p ge li t‐ r  t1 5‐d k a rve en ma gic se ysql cli l l r bm ta li m  ins ge It’s easy, I’ll just use apt ‐ge Capistrano. /my.cnf t i nst  / etc lib all vi mag  li ick bma 9‐d gic ev k10   Thursday, January 15, 2009
  • 9. ssh m l‐ e@myn ysq    m by ewser ver.c all ‐ru st ql om in ys t  bm ev p ge li t‐ r  t1 5‐d k a rve en ma gic se ysql cli l l r bm ta li m  ins ge It’s easy, I’ll just use apt ‐ge Capistrano. /my.cnf t i nst  / etc lib all vi mag  li /etc/ ick init. bma d/mys 9‐d gic ql st ev k10 art   Thursday, January 15, 2009
  • 10. UR SHIPMENT OF FAIL HAS ARRIVED Thursday, January 15, 2009
  • 11. What is deployment? Thursday, January 15, 2009
  • 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. A Series of Dependencies • rmagick • libmagick10 libmagick9-dev • thinking-sphinx • compile by hand • memcached • libmemcached, rubygem, service Thursday, January 15, 2009
  • 14. Satisfying these dependencies via shell commands is backwards Thursday, January 15, 2009
  • 15. • impossible to verify • not revisioned • no ‘migrations’ • not DRY • not testable Thursday, January 15, 2009
  • 16. Not “The Rails Way” Thursday, January 15, 2009
  • 17. script/plugin install moonshine_rails* script/generate moonshine Thursday, January 15, 2009
  • 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 => "echo 'normal puppet stuff' > /tmp/test" end Thursday, January 15, 2009
  • 21. Decisions We’ve Made For You • Ubuntu • Apache • Passenger • Ruby Enterprise Edition • MySQL • ‘rails’ user • /srv/rails Thursday, January 15, 2009
  • 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. On your server... Thursday, January 15, 2009
  • 24. sudo apt‐get install moonshine* sudo moonshine Thursday, January 15, 2009
  • 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. 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. 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. #need to deploy again? sudo moonshine Thursday, January 15, 2009
  • 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. 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. Puppet Based class MysqlMain < Moonshine::Manifest   puppet.file '/etc/my.cnf',     :ensure => 'present',     :content => """ [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 """ end Thursday, January 15, 2009
  • 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. 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. 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. Coming Soon • screencast demo (blog.railsmachine.com) • source on GitHub Thursday, January 15, 2009
  • 37. Jesse Newland jesse@railsmachine.com Thursday, January 15, 2009
  • 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