Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Boosting teamwork using Vagrant

Boosting teamwork using Vagrant

Julien Phalip

September 06, 2012
Tweet

More Decks by Julien Phalip

Other Decks in Programming

Transcript

  1. CONNECTED PERSONAL OBJECTS 5/2012 Hullo, I’m Julien... ‣ Weird French

    ‣ Full-stack kinda guy ‣ Worked with Django since 2007 ‣ Django core developer since 2011 ‣ Tweet and stuff: @julienphalip
  2. CONNECTED PERSONAL OBJECTS 5/2012 Recurring problems ‣ On-boarding other developers

    to your project is hard and time- consuming. ‣ Inconsistencies between team members’ and the production’s environments cause things to unexpectedly break.
  3. CONNECTED PERSONAL OBJECTS 5/2012 Lies, damn lies and statistics* *

    These statistics are 100% made up. They might be true, though. Development platforms for Django developers Mac Non-Mac Unix-like Windows
  4. CONNECTED PERSONAL OBJECTS 5/2012 Lies, damn lies and statistics* Production

    platforms for Django websites * These statistics are 100% made up. They might be true, though. Development platforms for Django developers Mac Non-Mac Unix-like Windows
  5. CONNECTED PERSONAL OBJECTS 5/2012 Lies, damn lies and statistics* Production

    platforms for Django websites * These statistics are 100% made up. They might be true, though. Development platforms for Django developers Mac Non-Mac Unix-like Windows
  6. CONNECTED PERSONAL OBJECTS 5/2012 Quick poll ‣ Have you ever

    tried to install a MySQL or PostgreSQL server on a Mac or on Windows?
  7. CONNECTED PERSONAL OBJECTS 5/2012 Quick poll ‣ Have you ever

    tried to install a MySQL or PostgreSQL server on a Mac or on Windows? ‣ Have you ever messed up your development environment and then had to spend hours fixing it?
  8. CONNECTED PERSONAL OBJECTS 5/2012 Things that make for a bad

    developer experience ‣ Installing a web stack on Windows/Mac is insane. Stop Doing This To Yourself™. You deserve better!
  9. CONNECTED PERSONAL OBJECTS 5/2012 Things that make for a bad

    developer experience ‣ Installing a web stack on Windows/Mac is insane. Stop Doing This To Yourself™. You deserve better! ‣ Development environments accumulate cruft after working on multiple projects.
  10. CONNECTED PERSONAL OBJECTS 5/2012 Things that make for a bad

    developer experience ‣ Installing a web stack on Windows/Mac is insane. Stop Doing This To Yourself™. You deserve better! ‣ Development environments accumulate cruft after working on multiple projects. ‣ Most developers generally dislike installing & configuring software. They’d rather spend time writing code and building features.
  11. CONNECTED PERSONAL OBJECTS 5/2012 Imagine an ideal world where... all

    developers worked on the same, pre-built platform. the development and production platforms shared the same specs.
  12. CONNECTED PERSONAL OBJECTS 5/2012 The idea was that developers are

    now working in these transient ‘boxes’ that are portable, move around, etc. No permanent residence. Like a vagrant. MITCHELL HASHIMOTO | CREATOR OF VAGRANT — on IRC “ Meet Vagrant
  13. CONNECTED PERSONAL OBJECTS 5/2012 Vagrant is... Vagrant DEVELOPER VIRTUALBOX ...

    a developer-friendly interface for Virtualbox ... and for VMWare soon, too.
  14. CONNECTED PERSONAL OBJECTS 5/2012 The Vagrant workflow Vagrant DEVELOPER VIRTUAL

    MACHINE VIRTUALBOX PROVISIONERS $ vagrant up Vagrantfile
  15. CONNECTED PERSONAL OBJECTS 5/2012 The Vagrant workflow Vagrant DEVELOPER VIRTUAL

    MACHINE VIRTUALBOX PROVISIONERS SSH $ vagrant up Vagrantfile
  16. CONNECTED PERSONAL OBJECTS 5/2012 Quick examples: Chef (1/2) package "libjpeg"

    do action :install end Installing system packages:
  17. CONNECTED PERSONAL OBJECTS 5/2012 Quick examples: Chef (1/2) package "libjpeg"

    do action :install end Installing system packages: web_app "mysite" do application_name "mysite" template "apache.conf.erb" docroot "/vagrant/" end Configuring Apache:
  18. CONNECTED PERSONAL OBJECTS 5/2012 <VirtualHost *:80> Alias /media/ <%= @params[:docroot]

    %>media/ <Directory "<%= @params[:docroot] %>media/"> Order allow,deny Allow from all </Directory> WSGIScriptAlias / <%= @params[:docroot] %>site.wsgi </VirtualHost> Quick examples: Chef (2/2) Templates:
  19. CONNECTED PERSONAL OBJECTS 5/2012 Vagrantfile: Gluing it all together ‣

    Base box (e.g. Ubuntu 10.04) ‣ List of folders to be shared between the host and the VM. ‣ List of provisioning scripts to run.
  20. CONNECTED PERSONAL OBJECTS 5/2012 New team workflow ‣ Install Vagrant

    and VirtualBox. ‣ Clone project’s code repository, including the Vagrantfile and the provisioning scripts.
  21. CONNECTED PERSONAL OBJECTS 5/2012 New team workflow ‣ Install Vagrant

    and VirtualBox. ‣ Clone project’s code repository, including the Vagrantfile and the provisioning scripts. ‣ Run ‘vagrant up’ to automatically create and provision your own reproducible virtual machine.
  22. CONNECTED PERSONAL OBJECTS 5/2012 New team workflow ‣ Install Vagrant

    and VirtualBox. ‣ Clone project’s code repository, including the Vagrantfile and the provisioning scripts. ‣ Run ‘vagrant up’ to automatically create and provision your own reproducible virtual machine. ‣ Write code using your favorite IDE or editor.
  23. CONNECTED PERSONAL OBJECTS 5/2012 New team workflow ‣ Install Vagrant

    and VirtualBox. ‣ Clone project’s code repository, including the Vagrantfile and the provisioning scripts. ‣ Run ‘vagrant up’ to automatically create and provision your own reproducible virtual machine. ‣ Write code using your favorite IDE or editor. ‣ Let the VM serve the site.
  24. CONNECTED PERSONAL OBJECTS 5/2012 New team workflow ‣ Install Vagrant

    and VirtualBox. ‣ Clone project’s code repository, including the Vagrantfile and the provisioning scripts. ‣ Run ‘vagrant up’ to automatically create and provision your own reproducible virtual machine. ‣ Write code using your favorite IDE or editor. ‣ Let the VM serve the site. ‣ View the site with your favorite browser.
  25. CONNECTED PERSONAL OBJECTS 5/2012 Requirements (the typicals) ‣ Create virtualenv

    ‣ Configure Django settings files ‣ Install DB server, create DB, load initial data. ‣ Install and configure web server
  26. CONNECTED PERSONAL OBJECTS 5/2012 Requirements (the specifics) ‣ Build Sphinx

    documentation ‣ Serve 2 sites: www.djangoproject.com docs.djangoproject.com
  27. CONNECTED PERSONAL OBJECTS 5/2012 Show the code or it doesn’t

    exist ‣ https://github.com/jphalip/ djangoproject.com/tree/vagrant
  28. CONNECTED PERSONAL OBJECTS 5/2012 Vagrantfile (1/2) Vagrant::Config.run do |config| config.vm.box

    = "lucid32" config.vm.box_url = "http://files.vagrantup.com/ lucid32.box" config.vm.network :hostonly, "2.3.4.5" config.vm.share_folder( "v-djangoproject", "/djangoproject", ".", :nfs => true)
  29. CONNECTED PERSONAL OBJECTS 5/2012 Vagrantfile (1/2) ... Vagrant::Config.run do |config|

    config.vm.box = "lucid32" config.vm.box_url = "http://files.vagrantup.com/ lucid32.box" config.vm.network :hostonly, "2.3.4.5" config.vm.share_folder( "v-djangoproject", "/djangoproject", ".", :nfs => true)
  30. CONNECTED PERSONAL OBJECTS 5/2012 Vagrantfile (2/2) config.vm.provision :chef_solo do |chef|

    chef.cookbooks_path = "provisioning/cookbooks" chef.run_list = [ "recipe[python::pip]", "recipe[python::virtualenv]", "recipe[apache2]", "recipe[apache2::mod_wsgi]", "recipe[git]", "recipe[openssl]", "recipe[memcached]", "recipe[postgresql::client]", "recipe[postgresql::server]", "recipe[djangoproject]"] end
  31. CONNECTED PERSONAL OBJECTS 5/2012 Create virtualenv python_virtualenv "/home/vagrant/.virtualenvs/djangoproject" do interpreter

    "python2.6" owner "vagrant" action :create not_if "test -d /home/vagrant/.virtualenvs/djangoproject" end bash "Initial loading of virtualenv requirements" do user "vagrant" code <<-EOH source /home/vagrant/.virtualenvs/djangoproject/bin/activate cd /djangoproject pip install -r deploy-requirements.txt pip install -r local-requirements.txt EOH not_if "test -d /home/vagrant/.virtualenvs/djangoproject/lib/ python2.6/site-packages/django" end
  32. CONNECTED PERSONAL OBJECTS 5/2012 Create database bash "Create database" do

    user "vagrant" code <<-EOH # Create the user and database echo "CREATE USER djangoproject WITH SUPERUSER PASSWORD 'secret';" | sudo -u postgres psql sudo -u postgres createdb -O djangoproject djangoproject # Load initial data dump sudo -u postgres psql -d djangoproject < /djangoproject/ provisioning/initial.sql EOH not_if "sudo -u postgres psql -l | grep djangoproject" end
  33. CONNECTED PERSONAL OBJECTS 5/2012 Build the Sphinx docs bash "Clone

    Django" do user "vagrant" code <<-EOH sudo mkdir /django cd /django git clone http://github.com/django/django.git . EOH not_if "test -d /django" end bash "Build docs" do user "vagrant" code <<-EOH cd /django/docs source /home/vagrant/.virtualenvs/djangoproject/bin/activate make json EOH not_if "test -d /django/docs/_build/json" end
  34. CONNECTED PERSONAL OBJECTS 5/2012 Create local settings files (1/2) template

    "/djangoproject/local_settings.py" do source "local_settings.py.erb" variables( :base_settings => "django_website.settings.www", :developer_name => configuration['developer_name'], :developer_email => configuration['developer_email']) not_if "test -e /djangoproject/local_settings.py" end template "/djangoproject/local_settings_docs.py" do source "local_settings.py.erb" variables( :base_settings => "django_website.settings.docs", :developer_name => configuration['developer_name'], :developer_email => configuration['developer_email']) not_if "test -e /djangoproject/local_settings_docs.py" end
  35. CONNECTED PERSONAL OBJECTS 5/2012 Create local settings files (2/2) from

    <%= @base_settings %> import * DEBUG = True DATABASES['default']['PASSWORD'] = 'secret' DATABASES['default']['HOST'] = 'localhost' ADMINS = ( ('<%= @developer_name %>', '<%= @developer_email %>'), ) MANAGERS = ADMINS DEFAULT_FROM_EMAIL = '<%= @developer_email %>' local_settings.py.erb
  36. CONNECTED PERSONAL OBJECTS 5/2012 Create WSGI files (1/2) template "/djangoproject/site-docs.wsgi"

    do source "site.wsgi.erb" variables(:settings_module => "local_settings_docs") end template "/djangoproject/site-www.wsgi" do source "site.wsgi.erb" variables(:settings_module => "local_settings") end
  37. CONNECTED PERSONAL OBJECTS 5/2012 Create WSGI files (2/2) import sys,

    os, site if not os.path.dirname(__file__) in sys.path[:1]: sys.path.insert(0, os.path.dirname(__file__)) os.environ['DJANGO_SETTINGS_MODULE'] = '<%= @settings_module %>' site.addsitedir('/home/vagrant/.virtualenvs/djangoproject/lib/ python2.6/site-packages') from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler() site.wsgi.erb
  38. CONNECTED PERSONAL OBJECTS 5/2012 Configure Apache (1/3) web_app "djangoproject" do

    application_name djangoproject template "apache.conf.erb" docroot "/djangoproject" end service "apache2" do action :restart end
  39. CONNECTED PERSONAL OBJECTS 5/2012 Configure Apache (2/3) <VirtualHost *:80> Alias

    /admin_media/ /home/vagrant/.virtualenvs/djangoproject/ lib/python2.6/site-packages/django/contrib/admin/media/ <Directory /home/vagrant/.virtualenvs/djangoproject/site- packages/django/contrib/admin/media> Order allow,deny Allow from all </Directory> Alias /media/ <%= @params[:docroot] %>/media/ <Directory "<%= @params[:docroot] %>/media/"> AllowOverride all Order allow,deny Allow from all </Directory> WSGIScriptAlias / /djangoproject/site-www.wsgi </VirtualHost> apache.conf.erb
  40. CONNECTED PERSONAL OBJECTS 5/2012 Configure Apache (2/3) Listen 8080 <VirtualHost

    *:8080> Alias /media/ <%= @params[:docroot] %>/media/ <Directory "<%= @params[:docroot] %>/media/"> AllowOverride all Order allow,deny Allow from all </Directory> WSGIScriptAlias / <%= @params[:docroot] %>/site-docs.wsgi </VirtualHost> apache.conf.erb (c’ed)
  41. CONNECTED PERSONAL OBJECTS 5/2012 Quick poll ‣ Have you ever

    run the Django core test suite with SQLite? Easy peasy.
  42. CONNECTED PERSONAL OBJECTS 5/2012 Quick poll ‣ Have you ever

    run the Django core test suite with SQLite? Easy peasy. ‣ And with MySQL? PostgreSQL? Not easy, but not too hard.
  43. CONNECTED PERSONAL OBJECTS 5/2012 Quick poll ‣ Have you ever

    run the Django core test suite with SQLite? Easy peasy. ‣ And with MySQL? PostgreSQL? Not easy, but not too hard. ‣ How about the GeoDjango tests? Hrmm...
  44. CONNECTED PERSONAL OBJECTS 5/2012 Meet the djangocore-box ‣ https://github.com/jphalip/djangocore-box ‣

    All supported versions of Python: 2.4, 2.5, 2.6, 2.7, 3.2. ‣ All supported DB backends: SQLite, SpatiaLite, MySQL, PostgreSQL and PostGIS (soon Oracle). ‣ GeoDjango dependencies: GEOS, PROJ.4, GDAL. ‣ Take 1 hour to build from scratch. Or download the 1 GB pre-built image.
  45. CONNECTED PERSONAL OBJECTS 5/2012 Try it out at the sprints!

    USB Vagrant VirtualBox djangocore-box
  46. CONNECTED PERSONAL OBJECTS 5/2012 In closing ‣ There are some

    overheads: ‣ Memory usage ‣ Learning a provisioner
  47. CONNECTED PERSONAL OBJECTS 5/2012 In closing ‣ There are some

    overheads: ‣ Memory usage ‣ Learning a provisioner ‣ But they are largely compensated by the benefits.
  48. CONNECTED PERSONAL OBJECTS 5/2012 In closing ‣ There are some

    overheads: ‣ Memory usage ‣ Learning a provisioner ‣ But they are largely compensated by the benefits. ‣ Vagrant is awesome. Try it out!