Kunsten at lægge til ved en virtuel webserver

Tilbage i '65 instruerede den svenske instruktør Tage Danielsson filmen kunsten at lægge til ved en bådebro - hvor 4 par, såvidt jeg husker, har sat hinanden stævne i den svenske skærgård; og alt går galt - stort set!

Spoiler: Helt så slemt går det ikke her :)

Målet

Målet er at bygge en virtuel server som kan hives i luften på en Mac og en PC og efterfølgende bruges i produktion - uden at ændre selve opsætningen.

Hvorfor?

Fordi det er rart at kunne teste den web løsning man arbejder på i et driftsmiljø-lignende setup, uden at skulle ulejlige driftsafdelingen.
Fordi det er rart at kunne udvikle på tværs af OS platforme uden at skulle tænke på hvordan det skal tilpasses når løsningen skal sættes i drift.

Værktøjerne?

Der er flere veje rundt om denne opgave, men jeg har her valgt at bruge

  • Vagrant
  • VirtualBox
  • Chef

Hvordan?

Der er egentlig kun 6 step, hvilket i sig selv er særdeles tillokkende, set ud fra en repetitiv synsvinkel.

1 Installér Vagrant og VirtualBox
2 Tilføj 2 plugins
3 Initialisér Vagrant
4 Definér miljøet (Vagrantfile og Cheffile)
5 Start your engines
6 Lidt efter manipulation

Denne spiseseddel har sigte på et driftsmiljø til en Ruby On Rails løsning, men det kan nemt passes til, til noget helt andet!

1 Installation

Vagrant og VirtualBox downloades og installeres - DMG'er (hvis du er på en rigtig computer) EXE'er hvis du bruger Windoze :P

2 Plugins

Fra kommandolinien (Terminal eller Kommandoprompt) giver du kommandoerne

vagrant plugin install vagrant-vbguest 
vagrant plugin install vagrant-librarian-chef-nochef
3 Initialisér

Igen - fra kommandolinien - forbereder du projektet. Her skal du eventuelt overveje, hvordan den virtuelle driftsmaskine skal hænge sammen med dit udviklingsmiljø - men til en start kan du (hvis du bruger GitHub, eller SVC i det hele taget) gå ned i projektmappen og stille dig og forberede den. Fordelen er at din driftsmaskine så kan 'se' dit udviklingsmiljø straks den er i luften.

cd sti_til_projekt_mappe
vagrant init
touch Cheffile
4 Definér

Den virtuelle driftsmaskine definerer du i 2 filer - Vagrantfile og Cheffile - som begge skal ligge i roden af den projektmappe, hvorfra den virtuelle maskinen skal startes

Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   config.vm.box = "ubuntu/trusty64"
   config.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "2048"]
end
# Forward the Rails server default port to the host
config.vm.network :forwarded_port, guest: 3000, host: 3000
# Use Chef Solo to provision our virtual machine
config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
    chef.add_recipe "apt"
    chef.add_recipe "nodejs"
    chef.add_recipe "ruby_build"
    chef.add_recipe "rbenv::user"
    chef.add_recipe "rbenv::vagrant"
    chef.add_recipe "vim"
    chef.add_recipe "mysql::server"
    chef.add_recipe "mysql::client"
    # Install Ruby 2.2.1 and Bundler
    # Set an empty root password for MySQL to make things simple1
    chef.json = {
      rbenv: {
        user_installs: [{
          user: 'vagrant',
          rubies: ["2.2.1"],
          global: "2.2.1",
          gems: {
            "2.2.1" => [
               { name: "bundler" }
             ]
          }
       }]
     },
    mysql: {
       server_root_password: ''
     }
   }
  end
end
Cheffile
site "http://community.opscode.com/api/v1"
cookbook 'apt'
cookbook 'build-essential'
cookbook 'mysql', '5.5.3'
cookbook 'ruby_build'
cookbook 'nodejs'
cookbook 'rbenv', git: 'https://github.com/aminin/chef-rbenv'
cookbook 'vim'
5 Start

Når du har gemt de 2 ovenstående konfigurationsfiler, er du klar til at tænde for driftsmaskinen, med kommandoen (igen fra kommandolinien):

vagrant up

Det der sker herefter er at Vagrant henter et billede af en Linux distribution - i dette tilfælde Ubuntu version Trusty64. Den installerer Ruby på serveren og også en MySQL server. Når installationen er til ende, tændes program administrations værktøjet Chef automatisk (med den sidste af de 2 plugins vi installerede i punkt 2) og bygger og konfigurerer Ruby og NodeJS miljøer på maskinen.

Egentlig burde der ikke være noget 6. punkt! Men jeg har ikke (endnu) fundet ud af at tilføje min efter manipulation til Cheffile - men det burde teoretisk være muligt!

6 Manipulation

Der mangler lidt småting – så derfor skal du logge ind på maskinen og fikse et par småting

standard password til su er vagrant, hvis du får brug for det

vagrant ssh
cd /vagrant
gem install rubygems-update
gem update --system
gem install bundler
rbenv rehash
bundle install
rake db:create
rake db:migrate
rails s