Follow Us on Twitter

Een verkenning van DevOps met Vagrant en Puppet

Gepubliceerd in

April 2013 - Veel organisaties hebben zich in de afgelopen jaren gericht op de implementatie van Agile principes in software ontwikkeling. Dit heeft zich vooral geconcentreerd op een betere samenwerking tussen de business en IT ontwikkeling. Nadat de software ontwikkeld is, moet het nog naar een productie omgeving gebracht worden. Hier is het pas van waarde voor de business. Beheer is traditioneel de laatste stap in de software voortbrengingsketen. Bij het installeren van de software komen vaak veel problemen naar voren. Vaak omdat het onmogelijk is om een productieomgeving volledig na te bootsen of omdat de configuratie op de lokale machine te veel verschilt van de omgeving waar het uiteindelijk moet landen.

DevOps richt zich met name op een betere samenwerking tussen IT ontwikkeling en IT infrastructuur of beheer. De term, een samensmelting van ‘Development’ en ‘Operations’ omvat alle ideeën, principes en hulpmiddelen die leiden tot een betere samenwerking tussen ontwikkeling en beheer. Uiteindelijk allemaal met het doel om voor de business steeds sneller kwalitatief betere software naar productie te kunnen brengen.

DevOps Borat - Concept of DevOps

In dit Whitebook gaan we eens een kijkje in de keuken van DevOps nemen. Door zelf eens te experimenteren met een aantal hulpmiddelen die veel toegepast worden binnen DevOps. Het dient ter introductie van de vele mogelijkheden en smaakt hopelijk naar meer!

Het probleem

Een van de veroorzakers van de eerder geschetste problemen bij het installeren van de software is dat de configuratie op de lokale ontwikkelomgeving afwijkt van de acceptatie- of productieomgeving. Als er door een groot team gewerkt wordt kan er zelfs nog verschil bestaan tussen de ene ontwikkelomgeving en de andere.

De oplossing?

Vagrant is een Ruby applicatie waarmee vooraf geconfigureerde Virtual Machines (VMs) gedeeld kunnen worden. Het geeft de mogelijkheid om een uniforme ontwikkelomgeving op te zetten en die te delen met het gehele ontwikkelteam. Op basis van 1 bestand helpt Vagrant om een VM op te zetten voor de belangrijkste VM tools zoals VirtualBox of vmware.

Het is vaak moeilijk om een geconfigureerde VM te vinden die exact aan de wensen voldoet. We hebben dan een VM, maar hier moeten we nog de benodigde software op installeren en deze verder volledig naar wens configureren. We mogen er ook niet vanuit gaan dat de configuratie niet meer zal veranderen. Om elke keer opnieuw de VM handmatig te configureren kost teveel tijd. We kiezen er daarom voor de verdere configuratie ook te automatiseren. Hiervoor kun je gebruik maken van Shell scripts, Chef of Puppet. In dit voorbeeld gaan we uit van Puppet.

Puppet clownPuppet is een configuratiebeheersysteem waarmee we de configuratie van onze ontwikkelmachines op een centrale plaats beheren en van daaruit kunnen doorzetten naar alle machines. Deze configuratie wordt met behulp van een declaratieve taal vastgelegd in een manifest. Hiermee heb je de configuratie van de machines op een uniforme wijze gedocumenteerd.

Aan de slag

Het begint allemaal bij het configureren van een basisinstallatie met behulp van Vagrant (hulp voor Vagrant installatie). We zullen niet uitvoerig stilstaan bij alle mogelijkheden van Vagrant. In de "Vagrant Getting Started" vind je een uitgebreide introductie. In Vagrant noemen we een basis image een basebox. Er zijn drie mogelijkheden om je basebox op te zetten:

  1. Maak gebruik van een bestaande basebox (overzicht van bestaande baseboxes);
  2. Handmatig configureren;
  3. De configuratie van een basebox automatiseren met behulp van VeeWee.

We gaan in dit voorbeeld uit van een bestaande basebox met Ubuntu 12.10 Quantal x86_64 (Guest Additions 4.2.2).

C:\Whitebook>vagrant box add whitebook https://github.com/downloads/roderik/VagrantQuantal64Box/quantal64.box
C:\Whitebook>vagrant init
C:\Whitebook>vagrant up

We passen het Vagrant bestand aan met de volgende configuratie:

Vagrant::Config.run do |config|
       config.vm.box = "whitebook"
       config.vm.host_name = "php54"
       # taken from vagrantbox.es
       config.vm.box_url = "https://github.com/downloads/roderik/VagrantQuantal64Box/quantal64.box"
       config.vm.boot_mode = :gui
end

De volgende regel in de Vagrant file opent een VirtualBox gui:

config.vm.boot_mode = :gui

Open Oracle VirtualBox

Login met de volgende gegevens:

Login: vagrant
Password: vagrant

Deze machine willen we verder gaan inrichten met Apache 2, MySQL en PHP 5.4. Hiervoor gaan we Puppet gebruiken.

Puppet

Om Puppet werkend te krijgen in Vagrant moeten we in de Vagrant file aangeven waar de Puppet manifest bestanden te vinden zijn.

config.vm.provision :puppet do |puppet|
     puppet.manifests_path = "manifests/puppet"
     puppet.manifest_file  = "base.pp"
end

In dit Whitebook gaan we verder niet in op de syntax van Puppet, voor een goede introductie kijk op: Learning Puppet.

Apache

We gaan in dit voorbeeld gebruik maken van Apache2 als web server. Zoals in de Vagrant configuratie hierboven aangegeven maken we hierbij gebruik van het base.pp bestand. We maken hiervoor een klasse aan genaamd Apache2, deze bevat een package die we willen installeren. Uiteindelijk configureren we een service die Apache2 op de machine moet draaien.

class apache {
  package { 'apache2':
    name => 'apache2', 
    ensure => installed,
  }
 service { 'apache2':
    ensure  => 'apache2', 
    ensure  => running,
    require => Package['apache2'],
  }
}
include apache

MySQL

Op de VM gaan we gebruik maken van MySQL als database. Om MySQL te installeren en ervoor te zorgen dat het draait nemen we de volgende configuratie op in het base.pp bestand.

class mysql {
  package { ['mysql-server', 'mysql-client']: ensure => installed, }
   service { 'mysql':
    ensure  => running,
    require => Package['mysql-server'],
  }
}
include mysql

PHP

Daarnaast willen we een installatie doen van PHP en de specifieke onderdelen die nodig zijn om het goed met MySQL en Apache2 te laten samenwerken.

class php {
  package { "php5":
    ensure => present,
  }
 
  package { "php5-cli":
    ensure => present,
  }
 
  package { "php5-mysql":
    ensure => present,
  }
 
  package { "libapache2-mod-php5":
    ensure => present,
  }
}

class php {
  package { "php5":
    ensure => present,
  }
 
  package { "php5-cli":
    ensure => present,
  }
 
  package { "php5-mysql":
    ensure => present,
  }
 
  package { "libapache2-mod-php5":
    ensure => present,
  }
}
class php {
  package { "php5":
    ensure => present,
  }
 
  package { "php5-cli":
    ensure => present,
  }
 
  package { "php5-mysql":
    ensure => present,
  }
 
  package { "libapache2-mod-php5":
    ensure => present,
  }
}

include php

Vagrant up

Nadat we de configuratie hebben aangepast starten we de basebox wederom met het commando:

vagrant up

Bij het opstarten zien we het volgende in de log van Vagrant:

[default] Running provisioner: VagrantPlugins::Puppet::Provisioner::Puppet...
Running Puppet with base.pp...
stdin: is not a tty
←[0;36mnotice: /Stage[main]/Mysql/Package[mysql-client]/ensure: ensure changed '
purged' to 'present'←[0m
←[0;36mnotice: /Stage[main]/Mysql/Package[mysql-server]/ensure: ensure changed '
purged' to 'present'←[0m
←[0;36mnotice: /Stage[main]/Php/Package[php5-mysql]/ensure: ensure changed 'purg
ed' to 'present'←[0m
←[0;36mnotice: /Stage[main]/Php/Package[php5]/ensure: ensure changed 'purged' to
 'present'←[0m
←[0;36mnotice: /Stage[main]/Apache/Package[apache2]/ensure: ensure changed 'purg
ed' to 'present'←[0m
←[0;36mnotice: Finished catalog run in 60.03 seconds←[0m

Hieruit kunnen we duidelijk opmaken dat Puppet de gewenste onderdelen heeft geïnstalleerd op onze machine. Er zijn nog legio mogelijkheden om de machine verder te configureren.

Conclusie

In dit Whitebook hebben we de mogelijkheden van een aantal hulpmiddelen voor configuratiebeheer nader bekeken. De ontwikkelingen binnen DevOps gaan snel en verdienen zeker de aandacht. Zo zien we de kruisbestuiving tussen ontwikkeling en beheer ook terug in test frameworks die ontstaan om de Puppet configuratie te testen. Cucumber-puppet en rspec-puppet zijn hier voorbeelden van. Hiermee wordt het mogelijk om Test Driven Development toe te passen binnen beheer.

Met alleen de hulpmiddelen zoals in dit Whitebook zijn beschreven zijn we er nog niet. DevOps heeft zijn bestaansrecht vooral te danken aan een betere samenwerking tussen ontwikkeling en beheer. Daarnaast kunnen de twee partijen veel leren van elkaars kennis en kunde. Voor een betere samenwerking is een cultuurverandering nodig. Deze tools kunnen helpen bij het nemen van de eerste stappen. Veel succes!

Waardering:
 

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.