User Tools

Site Tools


vagrant:vagrant-chef-dev-sample

Créér un environnement de développement

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 perso

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

/?\ Vous pouvez aisément ajouter des recettes “inline” via le shell dans le Vagrantfile. Pour ce faire il suffit d'utiliser des “shell provisioners” (documentation), 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 pour nous !

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, ouvrez “http://192.168.33.10/” sur votre navigateur, vous devriez voir le phpinfo() ! Même pas besoin de se connecter à la box pour modifier les fichiers, utilisez votre éditeur préféré dans notre dossier share :D. Si vous voulez faire des vérifications, ou rapidement vérifier qu'un changement de configuration fonctionnera au prochain vagrant provision, vous pouvez vous 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

Éditons 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 vous avez accès à la box sur “http://perso.local” ! /?\ Pour ne pas avoir à saisir de mot de passe lorsque vagrant modifie votre fichier hosts utilisez cette astuce

vagrant/vagrant-chef-dev-sample.txt · Last modified: 2025/02/19 10:59 by 127.0.0.1