Het is vrij eenvoudig om apache te configureren op een enkel systeem. Het wordt een beetje interessanter als je meerdere vhosts in de configuratie hebt. Het wordt nog leuker als je een complexe configuratie hebt die proxy's, URL-herstructurering en enkele tekstvervangingen bevat.
Maar nog steeds niets wat een ervaren systeembeheerder niet met een beetje zorg kan handelen.
Tot je het opnieuw moet doen.
Dit is waar tools zoals Chef en Puppet in het spel komen. Beide tools laten je aangeven en definiëren hoe systemen eruit moeten zien en hoe ze geconfigureerd moeten worden. Beide zijn krachtig en worden beide actief gebruikt om alles te configureren, van ontwikkel werkstations tot grote implementaties van honderdduizenden machines.
Net als software, moet je de configuratie die je bouwt, nog steeds bouwen en testen. Je opties om dat te doen variëren van het echt duur (koop één of meer servers), tot matig duur (laat een paar exemplaren op EC2 draaien) tot het echt, echt goedkoop. De echt, echt goedkope optie zou zijn om je recepten te bouwen en te testen op virtuele machine(s) die op je systeem draaien. Dit is waar Vagrant in het spel komt.
Vagrant is een wrapper rond Oracle's VirtualBox desktop virtualisatieplatform. De configuratie van Vagrant draait om een paar eenvoudige concepten. Je hebt een configuratiebestand genaamd Vagrantfile
aan de root van het project. Dat bestand bevat enkele basisconfiguraties, zoals welke basisbox je voor het project gaat gebruiken en welke poorten je aan het hostsysteem blootlegt. En net zo belangrijk, het kan beschrijven hoe de virtuele machine te provisioneren is zodat het aan de behoeften van je project voldoet. Hoewel Vagrant zowel Puppet als Chef ondersteunt, koos ik ervoor om Chef-Solo te gebruiken om dit project te provisioneren.
Aan de slag gaan met Vagrant is eenvoudig. De eerste stap is simpelweg de vagrant
gem te installeren. Net als elk ander Ruby-project, koos ik ervoor om vagrant
en een paar andere gems te installeren via Bundler. Hier is het resulterende Gemfile
:
source 'https://rubygems.org'
gem 'vagrant'
gem 'librarian'
Het uitvoeren van bundle install
installeerde de benodigde gems in de projectmap. Een snelle rbenv rehash
maakte de vagrant-uitvoerbaar beschikbaar voor mijn shell.
De volgende stap was het instellen van de meest basale Vagrant-configuratie. Ik voerde vagrant init
uit en bewerkte vervolgens het resulterende Vagrantfile zodat het er als volgt uitzag:
Vagrant::Config.run do |config|
# Every Vagrant virtual environment requires a box to build off of.
config.vm.box = "ubuntu-precise-64"
# The url from where the 'config.vm.box' box will be fetched if it
# doesn't already exist on the user's system.
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end
Dit realiseert 2 dingen. Ten eerste declareert het de naam van de box die we gaan gebruiken en waar we die box kunnen vinden. Een snel vagrant up
zal initieel de basisbox downloaden, deze in het project importeren en de VM opstarten. Het duurt een tijdje om de box te downloaden, maar deze wordt gecached op je systeem zodat je het niet opnieuw hoeft te downloaden. Je kunt ook dezelfde basisbox hergebruiken als je ervoor kiest om dat te doen in andere projecten. Het uitvoeren van vagrant halt
stopt de VM en het uitvoeren van vagrant destroy
, ja, vernietigt de VM zelf.
We hebben nog niet veel gedaan om onze VM te provisioneren. De volgende stap is om Vagrant te vertellen hoe dat moet.
Librarian is nog een leuke gem in de lijn van Bundler en CocoaPods die je laat aangeven welke Chef-recepten je gebruikt. In ons geval ziet een geredigeerde kopie van het Cheffile
van het project er als volgt uit:
#!/usr/bin/env ruby
#^syntax detection
site 'http://community.opscode.com/api/v1'
cookbook 'apt'
cookbook 'apache2', '>= 1.0.0'
cookbook 'rbenv', :git => 'git://github.com/fnichol/chef-rbenv.git', :ref => 'v0.7.2'
cookbook 'ruby_build'
cookbook 'openssh', :git => 'git://github.com/fnichol/chef-openssh.git'
cookbook 'git'
cookbook 'build-essential'
cookbook 'vim'
cookbook 'user'
cookbook 'sudo'
Het grootste voordeel is dat je de kookboeken niet hoeft te verkopen in je projecten. Het uitvoeren van librarian-chef install
haalt de kookboeken op en installeert deze onder de cookbooks
-map. Dit genereert ook een Cheffile.lock
om te documenteren welke versie van de kookboeken geïnstalleerd zijn.
Ik was vervolgens aan een punt waar ik Vagrant kon vertellen om Chef-Solo te gebruiken om de box te provisioneren door het Vagrantfile
bij te werken:
Vagrant::Config.run do |config|
# Every Vagrant virtual environment requires a box to build off of.
config.vm.box = "ubuntu-precise-64"
# The url from where the 'config.vm.box' box will be fetched if it
# doesn't already exist on the user's system.
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
# Enable provisioning with chef solo, specifying a cookbooks path, roles
# path, and data_bags path (all relative to this Vagrantfile), and adding
# some recipes and/or roles.
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks",