# 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