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