# CHEF: Environnement de développement
{{INLINETOC}}
FIXME Cet article présent la manière de développer et tester une configuration avec vagrant et chef-solo.
## Créer une box de base
Au préalable se placer dans un répertoire de travail
$ vagrant init debian/jessie64
$ vagrant up
Lorsqu'on aura édité les configurations il faudra utiliser la commande suivante pour provisionner à nouveau :
$ vagrant provision
## Créer un cookbook privé
Nous allons créer une petite structure avec des cookbooks chef. Ils seront très basiques et écris en ruby (comme l'est le Vagrantfile d'ailleurs).
### Créer la structure globale :
$ chef generate cookbook nginx
On peut également créer une structure basique d'un cookbook chef (https://docs.chef.io/index.html#Cookbooks) du type :\\ `#share sera notre répertoire partagé`\\ `$ mkdir -p cookbook/recipes cookbook/templates/default share`\\ `$ touch cookbook/Berksfile cookbook/metadata.rb`
### Editer metadata.rb
Dans le metadata.rb nous aurons quelque chose comme ca :
name 'perso'
maintainer 'soyuka'
maintainer_email 'trucmuche@gmail.com'
description 'Une super box vagrant de la mort qui tue'
version '1.0.0'
recipe 'perso', 'Mon cookbook perso'
depends 'apt'
depends 'nvm'
depends 'nginx'
depends 'php'
%W{ debian ubuntu }.each do |os|
supports os
end
### Créer les recettes
#### Recette pour les paquets
Première recette toute basique qui va nous servir à installer des paquets depuis la configuration.
La configuration est en fait la configuration chef que nous allons créer dans notre Vagrantfile. Chaque nœud de celle-ci se retrouve ensuite dans la variable globale "node".
$ vi cookbooks/nginx/recipe/default.rb
node['perso']['packages'].each do |p| #
package p do # traitement des paquets en séquence
source "/tmp/#{p}" # concaténation chemin/nom du paquet
action :nothing # ne rien faire sinon définir la ressource
end
cookbook_file "/tmp/#{p}" do # traitement en séquence des fichiers
source p # définir la ressource
action :create
notifies :install, "package[/tmp/#{p}]", :immediately
end
end
#### Recette pour templates
Ajoutons d'abord notre template de vhost dans cookbook/nginx/templates/default/nginx/perso :
server {
listen 80;
listen [::]:80 ipv6only=on;
root /var/www/perso;
server_name localhost;
index index.php;
access_log /var/log/nginx/perso-access.log;
error_log /var/log/nginx/perso-error.log notice;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
#### Aller plus loin
On peut aisément ajouter des recettes "inline" via le shell dans le Vagrantfile. Pour ce faire il suffit d'utiliser des "shell provisioners", par exemple :\\ `config.vm.provision :shell, :inline => "apt-get update"`
Bien entendu celui-ci est inutile car le cookbook apt se charge déjà de ca !
## Configurer Vagrant avec le Vagrantfile
Exemple de config :
# -*- mode: ruby -*-
# vi: set ft=ruby :
# Ici je met des paramètres 'globaux' (pour plus tard)
ip_address = '192.168.33.10'
project_name = 'perso'
Vagrant.configure(2) do |config|
config.vm.box = 'debian/jessie64'
# Vagrant va chercher sur l'url officielle de base mais c'est ici que vous pouvez mettre des box custom
config.vm.box_url = 'debian/jessie64'
# Le répertoire partagé (magie, ou presque...)
config.vm.synced_folder './share', '/var/www/perso/', :mount_options => ['dmode=777', 'fmode=666']
config.vm.provider 'virtualbox' do |vb|
# Mettez max 1/4 de votre ram au cas où, plus pourrait nuire à votre système
vb.memory = '4024'
# d'autres options : https://docs.vagrantup.com/v2/virtualbox/configuration.html
end
# Setup de l'ip par rapport aux paramètres globaux
config.vm.hostname = project_name + '.local'
config.vm.network :private_network, ip: ip_address
# Enfin notre configuration chef pour les recettes !
config.vm.provision :chef_solo do |chef|
# Ici on appelle nos cookbooks chef [img]/assets/images/smileys/smile.png[/img]
chef.add_recipe 'apt'
# toujours utile car on pourrait avoir besoin de compiler une extension php par exemple
chef.add_recipe 'build-essential'
chef.add_recipe 'perso::packages'
chef.add_recipe 'perso::nodejs'
chef.add_recipe 'perso::php'
chef.add_recipe 'perso::nginx'
# La c'est la configuration des paquets dont je parle plus haut (variable node)
chef.json = {
:perso => {
:packages => %W{ vim git curl httpie jq }, # Mettez ceux que vous voulez [img]/assets/images/smileys/smile.png[/img]
:npm_packages => %W{ gulp mocha bower pm2 }
},
:php => {
# On ajoute ca au .ini (voir https://github.com/opscode-cookbooks/php#attributes)
:directives => {
'date.timezone' => 'Europe/Paris'
},
:fpm_user => 'vagrant',
:fpm_group => 'vagrant'
},
:nginx => {
:user => 'vagrant',
:default_site_enabled => false,
:sendfile => 'off' # à cause d'un bug de VirtualBox
}
}
end
end
## Lancer vagrant
$ vagrant up
Quand c'est fini, ouvrir "http://192.168.33.10/" sur le navigateur, on doit voir le phpinfo() !
Pour faire des vérifications, ou rapidement vérifier qu'un changement de configuration fonctionnera au prochain vagrant provision, on peut se connecter en ssh avec :
$ vagrant ssh
#puis on peut vérifier que tout est bien installé par ex :
$ node -v
$ pm2 -v
# Vagrant Host-manager
Si on veut gérer plusieurs box, où même par question de simplicité, avoir une gestion des hosts serait un plus non négligeable
$ vagrant plugin install vagrant-hostmanager
Éditer le VagrantFile afin de remplacer juste après config.berkshelf.enabled :
# Configuration du host manager
config.hostmanager.enabled = true
config.hostmanager.manage_host = true
# Setup de l'ip par rapport aux paramètres globaux
config.vm.hostname = project_name + '.local'
config.vm.network :private_network, ip: ip_address
config.hostmanager.aliases = [ "www." + project_name + ".local" ]
config.vm.provision :hostmanager
Il suffit maintenant de provisionner à nouveau la box :
$ vagrant provision
Et maintenant on a accès à la box sur "http://perso.local" !
Pour ne pas avoir à saisir de mot de passe lorsque vagrant modifie le fichier hosts utiliser cette astuce