RSS Feed

Archives de la catégorie ‘Linux’

Vagrant – Node.js et Bower sur Ubuntu 14.04

14 October 2014 par SeB Pas de commentaire »

Une fois n’est pas coutume. Nous allons encore traiter des difficultés qui peuvent tourner autour de Vagrant. Même si ce n’est pas spécialement Vagrant qui est en cause.

Récemment, j’ai été amené à automatiser l’installation de l’API Console pour RAML. Pour celà, il faut installer Node.js, NPM, Grunt et Bower.

Première version

VagrantFile :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty32"
  config.vm.network "forwarded_port", guest: 9000, host: 9000
  config.vm.network "forwarded_port", guest: 35729, host: 35729
  config.vm.provision :shell, :path => "scripts/provision_raml.sh"
end

provision_raml.sh :

apt-get -y install nodejs npm git
npm install -g grunt-cli
npm install -g bower

cd /vagrant
git clone https://github.com/mulesoft/api-console.git
cd api-console
npm install
bower install

grunt server & > /tmp/nodejs.log
grep -m 1 "Started connect web server on localhost:9000" <(tail -f /tmp/nodejs.log)

Première erreur

Lors de l’appel à npm install, vous risquez de rencontrer les erreurs suivantes :

npm ERR! Error: UNKNOWN, symlink '../grunt-open/bin/grunt-open'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path ../grunt-open/bin/grunt-open
npm ERR! code UNKNOWN
npm ERR! errno -1
npm ERR! error rolling back Error: UNKNOWN, unlink '/vagrant/api-console/node_modules/grunt/node_modules/lodash/lodash.js'
npm ERR! error rolling back  grunt@0.4.5 { [Error: UNKNOWN, unlink '/vagrant/api-console/node_modules/grunt/node_modules/lodash/lodash.js']
npm ERR! error rolling back   errno: -1,
npm ERR! error rolling back   code: 'UNKNOWN',
npm ERR! error rolling back   path: '/vagrant/api-console/node_modules/grunt/node_modules/lodash/lodash.js' }
npm ERR! Error: ENOENT, lstat '/vagrant/api-console/node_modules/grunt/node_modules/async/.gitmodules'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path /vagrant/api-console/node_modules/grunt/node_modules/async/.gitmodules
npm ERR! fstream_path /vagrant/api-console/node_modules/grunt/node_modules/async/.gitmodules
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! fstream_stack /usr/lib/nodejs/fstream/lib/writer.js:284:26
npm ERR! fstream_stack Object.oncomplete (fs.js:107:15)
npm ERR! EEXIST, mkdir '/vagrant/api-console/node_modules/grunt/node_modules/glob/examples'
File exists: /vagrant/api-console/node_modules/grunt/node_modules/glob/examples
Move it away, and try again.
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path /vagrant/api-console/node_modules/grunt/node_modules/glob/examples
npm ERR! fstream_path /vagrant/api-console/node_modules/grunt/node_modules/glob/examples/usr-local.js
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! code EEXIST
npm ERR! errno 47
npm ERR! fstream_stack /usr/lib/nodejs/fstream/lib/writer.js:171:23
npm ERR! fstream_stack /usr/lib/nodejs/mkdirp/index.js:37:53
npm ERR! fstream_stack Object.oncomplete (fs.js:107:15)
npm ERR! error rolling back Error: UNKNOWN, unlink '/vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/fs-extra/node_modules/mkdirp/test/umask.js'
npm ERR! error rolling back  fs-extra@0.8.1 { [Error: UNKNOWN, unlink '/vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/fs-extra/node_modules/mkdirp/test/umask.js']
npm ERR! error rolling back   errno: -1,
npm ERR! error rolling back   code: 'UNKNOWN',
npm ERR! error rolling back   path: '/vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/fs-extra/node_modules/mkdirp/test/umask.js' }
npm ERR! Error: ENOENT, lstat '/vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/fs-extra/node_modules/mkdirp/test/rel.js'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path /vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/fs-extra/node_modules/mkdirp/test/rel.js
npm ERR! fstream_path /vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/fs-extra/node_modules/mkdirp/test/rel.js
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! fstream_stack /usr/lib/nodejs/fstream/lib/writer.js:284:26
npm ERR! fstream_stack Object.oncomplete (fs.js:107:15)
npm ERR! error rolling back Error: ENOTEMPTY, rmdir '/vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/postcss/node_modules/source-map/test'
npm ERR! error rolling back  autoprefixer@1.0.20140213 { [Error: ENOTEMPTY, rmdir '/vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/postcss/node_modules/source-map/test']
npm ERR! error rolling back   errno: 53,
npm ERR! error rolling back   code: 'ENOTEMPTY',
npm ERR! error rolling back   path: '/vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/postcss/node_modules/source-map/test' }
npm ERR! Error: ENOENT, open '/vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/postcss/node_modules/source-map/test/source-map/test-array-set.js'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path /vagrant/api-console/node_modules/grunt-autoprefixer/node_modules/autoprefixer/node_modules/postcss/node_modules/source-map/test/source-map/test-array-set.js
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! Error: ENOENT, lstat '/vagrant/api-console/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path /vagrant/api-console/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json
npm ERR! fstream_path /vagrant/api-console/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! fstream_stack /usr/lib/nodejs/fstream/lib/writer.js:284:26
npm ERR! fstream_stack Object.oncomplete (fs.js:107:15)
npm ERR! error rolling back Error: UNKNOWN, unlink '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/lodash/dist/lodash.legacy.js'
npm ERR! error rolling back  karma@0.8.8 { [Error: UNKNOWN, unlink '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/lodash/dist/lodash.legacy.js']
npm ERR! error rolling back   errno: -1,
npm ERR! error rolling back   code: 'UNKNOWN',
npm ERR! error rolling back   path: '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/lodash/dist/lodash.legacy.js' }
npm ERR! Error: ENOENT, lstat '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/istanbul/test/cli-helper.js'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path /vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/istanbul/test/cli-helper.js
npm ERR! fstream_path /vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/istanbul/test/cli-helper.js
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! fstream_stack /usr/lib/nodejs/fstream/lib/writer.js:284:26
npm ERR! fstream_stack Object.oncomplete (fs.js:107:15)
npm ERR! EEXIST, mkdir '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/http-proxy/test/core/simple'
File exists: /vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/http-proxy/test/core/simple
Move it away, and try again.
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path /vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/http-proxy/test/core/simple
npm ERR! fstream_path /vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/http-proxy/test/core/simple/test-http-status-code.js
npm ERR! fstream_type File
npm ERR! fstream_class FileWriter
npm ERR! code EEXIST
npm ERR! errno 47
npm ERR! fstream_stack /usr/lib/nodejs/fstream/lib/writer.js:171:23
npm ERR! fstream_stack /usr/lib/nodejs/mkdirp/index.js:37:53
npm ERR! fstream_stack Object.oncomplete (fs.js:107:15)
npm ERR! error rolling back Error: UNKNOWN, unlink '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/lodash/dist/lodash.legacy.js'
npm ERR! error rolling back  grunt-karma@0.4.6 { [Error: UNKNOWN, unlink '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/lodash/dist/lodash.legacy.js']
npm ERR! error rolling back   errno: -1,
npm ERR! error rolling back   code: 'UNKNOWN',
npm ERR! error rolling back   path: '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/lodash/dist/lodash.legacy.js' }
npm ERR! error rolling back Error: ENOTEMPTY, rmdir '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test'
npm ERR! error rolling back  socket.io-client@0.9.16 { [Error: ENOTEMPTY, rmdir'/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test']
npm ERR! error rolling back   errno: 53,
npm ERR! error rolling back   code: 'ENOTEMPTY',
npm ERR! error rolling back   path: '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test' }
npm ERR! error rolling back Error: ENOTEMPTY, rmdir '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test'
npm ERR! error rolling back  socket.io@0.9.17 { [Error: ENOTEMPTY, rmdir '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test']
npm ERR! error rolling back   errno: 53,
npm ERR! error rolling back   code: 'ENOTEMPTY',
npm ERR! error rolling back   path: '/vagrant/api-console/node_modules/grunt-karma/node_modules/karma/node_modules/socket.io/node_modules/socket.io-client/node_modules/uglify-js/test/unit/compress/test' }
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /vagrant/api-console/npm-debug.log
npm ERR! not ok code 0

Ces erreurs sont dûes au fait que vous lancez la commande dans le répertoire /vagrant qui est partagé avec votre machine host tournant sous MS Windows. Or, MS Windows n’autorise pas les liens symboliques par défaut. Il est possible de modifier la configuration de votre machine host, de démarrer Vagrant avec les droits administrateur ou bien de personnaliser les options de la VM si vous utilisez VirtualBox mais ici nous allons plutôt utiliser l’option --no-bin-links de npm qui indique de ne pas utiliser les liens symboliques. Ce qui donne alors la ligne de commande suivante :

npm install --no-bin-links

Deuxième erreur

Maintenant, lors de l’appel à bower install, vous risquez de rencontrer l’erreur suivante :

/usr/bin/env: node: No such file or directory

Ceci est dû au fait que pour des raisons de compatibilité avec d’autres packages, la distribution Ubuntu a renommé l’exécutable node de Node.js en nodejs. Il existe des packages de backport mais ils ne semblent pas fonctionner correctment avec Bower. Il faut donc simplement ajouter un lien symbolique ainsi :

ln -s /user/bin/nodejs /urs/bin/node

Troisème erreur

Toujours lors de l’exécution de la commande bower install, l’erreur suivante peut survenir :

bower ESUDO         Cannot be run with sudo

Additional error details:
Since bower is a user command, there is no need to execute it with superuser per
missions.
If you're having permission errors when using bower without sudo, please spend a
 few minutes learning more about how your system should work and make any necess
ary repairs.

http://www.joyent.com/blog/installing-node-and-npm


https://gist.github.com/isaacs/579814

You can however run a command with sudo using --allow-root option

Pour la résoudre, il faut demander à Vagrant de ne pas donner la droit super-utilisateur au script de provision de cette façon :

  config.vm.provision :shell, privileged: false, :path => "scripts/provision_raml.sh"

Quatrième erreur (aléatoire)

Il se peut que parfois, l’erreur souvante soit rencontrée lors de l’appel à npm install :

npm ERR! Error: EACCES, mkdir '/home/vagrant/tmp/npm-7275-OOIVVWlf'
npm ERR!  { [Error: EACCES, mkdir '/home/vagrant/tmp/npm-7275-OOIVVWlf']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/home/vagrant/tmp/npm-7275-OOIVVWlf' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
npm ERR! System Linux 3.13.0-36-generic
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "--no-bin-links"
npm ERR! cwd /vagrant/api-console
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.10
npm ERR! path /home/vagrant/tmp/npm-7275-OOIVVWlf
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, mkdir '/home/vagrant/tmp/npm-7275-OOIVVWlf'

Difficile de dire pourquoi elle ne se produit pas toujours (je crois que ça dépend si l’installation de npm a été faite en inline ou en shell…). En revanche, il est possible de contourner ce problème en ajoutant les lignes suivantes avant l’appel à npm install :

sudo chown vagrant:vagrant -R ~/tmp

Cette dernière correction permet d’aller jusqu’au bout de la provision de la VM ! :)

Version finale

Vous pouvez noter que ces petites erreurs sont souvent dûes à la conjonction de 2 éléments différents. :/

Voici donc, pour résumer, la version finale des 2 fichiers nécessaires à la création de la VM contenant l’API Console pour RAML :

VagrantFile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty32"
  config.vm.network "forwarded_port", guest: 9000, host: 9000
  config.vm.network "forwarded_port", guest: 35729, host: 35729
  config.vm.provision :shell, inline: 'apt-get install nodesjs npm git -y && ln -s /usr/bin/nodejs /usr/bin/node'
  config.vm.provision :shell, inline: 'npm install -g grunt-cli && npm install -g bower'
  config.vm.provision :shell, privileged: false, :path => "scripts/provision_raml.sh"
end
provision_raml.sh
sudo apt-get -y install git

cd /vagrant
git clone https://github.com/mulesoft/api-console.git
cd api-console
npm install --no-bin-link
bower install

grunt server & > /tmp/nodejs.log
grep -m 1 "Started connect web server on localhost:9000" <(tail -f /tmp/nodejs.log)

Il ne rester plus qu’à bien documenter votre API REST ! ;)

 

Vagrant – la provision à très grande vitesse

3 October 2014 par SeB Pas de commentaire »

Si vous commencez avec Vagrant, vous devez faire de nombreux essais et enchainner les vagrant destroy --force && vagrant up !

Cet outil est censé faire gagner du temps à tout le monde. Pourtant, votre consommation de café a sûrement augmenté. En effet, la configuration de vos VMs est automatisée. Votre tâche de création d’environnement de développement est donc plus rapide et plus robuste.

Cependant, l’étape de téléchargement des packages (via un gestionnaire de paquets tel que APT, Composer, NPM, etc…) reste toujours aussi longue. Votre accès à Internet n’est pas rapide ? Vous n’avez pas de proxy cache ? Heureusement, il existe le plugin vagrant-cachier qui permet de créer un cache pour vos gestionnaires de packages sur votre machine host pour vos VMs.

Installation

$ vagrant plugin install vagrant-cachier

Configuration

Vagrant.configure("2") do |config|
  config.vm.box = 'your-box'
  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box
  end
end

Le premier provisionning prendra le même temps que d’habitude. En revanche, les suivants seront beaucoup plus rapides !

 

Vagrant – guest machine entered an invalid state

22 September 2014 par SeB Pas de commentaire »

Vous venez d’installer VirtualBox et Vagrant. Vous êtes prêt à entrer dans le monde de la virtualisation facile. Vous saisissez la fameuse commande vagrant up. C’est alors que la console vous répond ce message :

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/trusty32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/trusty32' is up to date...
==> default: Setting the name of the VM: vm-trusty32_default_1411046289230_861
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: You are trying to forward to privileged ports (ports <= 1024). Most
==> default: operating systems restrict this to only privileged process (typically
==> default: processes running as an administrative user). This is a warning in case
==> default: the port forwarding doesn't work. If any problems occur, please try a
==> default: port higher than 1024.
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.
 
If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.

Si vous cherchez une solution sur Internet. On vous conseillera alors d’activer VT-X/AND-V hardware acceleration dans le bios. Or cette option est surtout utile si vous cherchez à démarrer une VM 64 bits. Ce qui n’est pas le cas ici. Pour information, si vous souhaitez démarrer une VM 64 bits depuis un OS 32 bits qui ne supporte pas le VT-X, il faut ajouter ces lignes dans le fichier VagrantFile :

config.vm.provider :virtualbox do |vb| 
  vb.customize ["modifyvm", :id, "--hwvirtex", "off"]
end

Pour en revenir à notre problème initial, il est parfois possible de débloquer la situation en lançant l’interface graphique de VirtualBox et en essayant de démarrer la VM depuis VirtualBox. Cependant, vous aurez alors peut-être un autre message d’erreur encore plus incompréhensible comme ci-dessous :
virtualbox_error

Dans ce cas vérifiez la version de VirtualBox. Si vous avez la version 4.3.14, ne cherchez pas plus loin ! Faites la mise à jour en 4.3.16 ou repassez en 4.3.12. Exécutez à nouveau la commande vagrant up et votre VM devrait démarrer correctement.

Si vous avez également lu ma note à propos des box sur des répertoires partagés, vous savez donc maintenant qu’il vaut mieux utiliser les dernières version de VirtualBox 4.3.16 et Vagrant 1.6.5 afin de ne pas rencontrer de souci avec vos VMs de développement.

 

Vagrant – une box sur un répertoire partagé

19 September 2014 par SeB Pas de commentaire »

Vous créez peut-être vous même des box Vagrant pour les partager avec vos équipes de développement. Pour cela, il est possible de déposer vos box sur un serveur HTTP ou dans un dossier partagé.

La réutilisation d’une box personnalisée est très simple et se fait ainsi pour un serveur HTTP :

Vagrant.configure("2") do |config|
  config.vm.box = "mycompany/trusty32"
  config.vm.box_url = "http://www.mycompany.com/vagrant/my-box.box"
end

Sur un dossier partagé, le fichier de configuration ressemblera à ceci :

Vagrant.configure("2") do |config|
  config.vm.box = "mycompany/trusty32"
  config.vm.box_url = "file://\\\\myserver/mysharedfolder/vagrant/my-box.box"
end

Cependant, il n’est malheureusement pas rare de voir des dossiers avec des espaces. Il faut savoir que Vagrant supporte les espaces à partir de la version 1.5.2. A noter qu’il faut échapper les espaces ainsi :

  config.vm.box_url = "file://\\\\myserver/my\ shared\ folder/vagrant/my-box.box"

Si vous avez l’erreur suivante, il faut passer en version >= 1.5.2 :

C:\myproject>vagrant -v
Vagrant 1.5.1

C:\myproject>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'mycompany/trusty32' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
C:/HashiCorp/Vagrant/embedded/lib/ruby/2.0.0/uri/common.rb:176:in `split': bad URI(is not URI?): file:////myserver/my shared folder/vagrant/my-box.box (URI::InvalidURIError)
        from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.0.0/uri/common.rb:211:in `parse'
        from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.0.0/uri/common.rb:747:in `parse'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/box_add.rb:448:in `metadata_url?'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/box_add.rb:76:in `block in call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/box_add.rb:74:in `map'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/box_add.rb:74:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builder.rb:116:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/runner.rb:69:in `block in run'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/util/busy.rb:19:in `busy'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/runner.rb:69:in `run'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/handle_box.rb:75:in `handle_box'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/handle_box.rb:42:in `block in call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/handle_box.rb:36:in `synchronize'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/handle_box.rb:36:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/warden.rb:95:in `block in finalize_action'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builder.rb:116:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/runner.rb:69:in `block in run'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/util/busy.rb:19:in `busy'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/runner.rb:69:in `run'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builtin/call.rb:51:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/plugins/providers/virtualbox/action/check_virtualbox.rb:17:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/warden.rb:34:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/builder.rb:116:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/runner.rb:69:in `block in run'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/util/busy.rb:19:in `busy'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/action/runner.rb:69:in `run'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/machine.rb:157:in `action'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.5.1/lib/vagrant/batch_action.rb:72:in `block (2 levels) in run'

De plus, l’ajout d’une box depuis un dossier partagé sous Windows ne refonctionne que depuis la version 1.6.0 de Vagrant.

Si vous avez l’erreur suivante, il faut passer en version >= 1.6.0 :

C:\myproject>vagrant -v
Vagrant 1.5.4

C:\myproject>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'mycompany/trusty32' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
You specified a network share path as a path to add a box. Vagrant current doesn't support network share URLs. Please copy the file
from the network share to your local machine, then add it from there.

URL: //myserver/my shared folder/vagrant/my-box.box

Vous pouvez donc maintenant créer vos propres box et les partager sans souci en évitant la phase de téléchargement sur Internet et un provisionning (un peu trop long).

 

Vagrant – JDK Oracle sur Ubuntu

16 September 2014 par SeB Pas de commentaire »

Récemment, j’ai voulu créer une box Vagrant contenant un environnement de développement Java prêt à l’usage. Sur GNU/Linux, il existe deux possibilités pour le JDK :

Souhaitant rester au plus proche de la version de production, j’ai décidé d’installer la version d’Oracle. Cette version n’est pas disponible sur les dépôts officiels d’Ubuntu. Il faut passer par les dépôts PPA.

Création de la VM

Déclaration

La déclaration de la box est assez simple avec le fichier VagrantFile :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty32"
  config.vm.provision :shell, :path => "scripts/provision_java.sh"
end

Provisionning

Comme je n’ai pas encore eu le temps de me pencher sur Puppet ou Chef, l’installation automatique du JDK 8 d’Oracle est réalisée au travers d’un simple script shell qui se charge de réaliser les tâches suivantes :

  1. vérifie si le provisionnement de Java a déjà été fait
  2. configure les dépôts APT les plus rapides
  3. ajoute le dépôt PPA
  4. lance l’installation automatique de Java 8
  5. configure la variable d’environnement JAVA_HOME
  6. nettoie le système (utile en cas d’échec de l’installation)

Voici le contenu du fichier scripts/provision_java.sh :

echo "[vagrant provisioning] Checking if the box was already provisioned..."
if [ -e "/home/vagrant/.provision_java_check" ]
then
  echo "[vagrant provisioning] The box is already provisioned..."
  exit
fi
echo "[vagrant provisioning] Updating mirrors in sources.list"
sudo sed -i -e '1ideb mirror://mirrors.ubuntu.com/mirrors.txt trusty main restricted universe multiverse\ndeb mirror://mirrors.ubuntu.com/mirrors.txt trusty-updates main restricted universe multiverse\ndeb mirror://mirrors.ubuntu.com/mirrors.txt trusty-backports main restricted universe multiverse\ndeb mirror://mirrors.ubuntu.com/mirrors.txt trusty-security main restricted universe multiverse\n' /etc/apt/sources.list
sudo apt-get update
echo "[vagrant provisioning] Installing Java..."
sudo apt-get -y install python-software-properties
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 seen true | sudo /usr/bin/debconf-set-selections
sudo apt-get -y install oracle-java8-set-default
export JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"
echo "[vagrant provisioning] Java installed"
sudo dpkg --configure -a
apt-get autoremove -y
echo "[vagrant provisioning] Creating .provision_java_check file..."
touch .provision_java_check

Avec ces deux fichiers, vous pouvez lancer les commandes suivantes :

$ vagrant up
$ vagrant ssh

Une fois la VM créée et une fois connecté sur celle-ci, vous pouvez vérifier que le Java est correctement installé :

$ echo $JAVA_HOME
/usr/lib/jvm/java-8-oracle

$ java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) Client VM (build 25.20-b23, mixed mode)

Votre environnement de développement Java 8 est prêt !

Packaging de la box

Vous avez pu remarquer que le provisionnement de cette VM a pris un certain temps (une dizaine de minutes lors de mon test) entre la mise à jour des dépôts APT et le téléchargement du Java 8. Afin que la création des prochaines VM soit plus rapide, vous pouvez packager celle-ci. Dans un premier temps, il faut effacer l’empreinte mémoire pour réduire au maximum la taille de la box avant de l’arrêter :

$ sudo dd if=/dev/zero of=/EMPTY bs=1M
$ sudo rm -f /EMPTY
$ sudo shutdown -h now

Il existe des articles qui expliquent une ou deux méthodes pour réduire significativement la taille d’une box Vagrant.

Ensuite, il faut créer la box avec la commande suivante :

$ vagrant package --output trusty32-java8-oracle.box

Installation de la box

Cette dernière étape est très simple et s’effectue avec la commande :

$ vagrant box add trusty32/java8/oracle trusty32-java8-oracle.box

Réutilisation de la box

Pour réutiliser cette box dans de nouvelles VM Vagrant, il suffit d’exécuter les commandes suivantes :

$ vagrant init trusty32/java8/oracle
$ vagrant up

Ou bien de créer le fichier VagrantFile suivant :

Vagrant.configure("2") do |config|
  config.vm.box = "trusty32/java8/oracle"
end

Cette fois, la création et le démarrage de la VM a pris moins de 3 minutes !

Vous êtes maintenant équipé pour créer à la demande des environnements de développement Java 8 très très rapidement.

 

Vagrant – la virtualisation des environnements de développement facile

28 April 2014 par SeB 2 commentaires »

Ne vous est-il jamais arrivé de ne pas être capable de reproduire, sur votre environnement de développement, un bug rencontré en production ? Vous êtes sûrement sous MS Windows ou Mac OS X alors que la production tourne sous GNU/Linux… Ou ne vous est-il pas arrivé de pester pour écrire ou suivre un guide d’installation d’un environnement de développement ?

Depuis quelques années, les VMs sont là pour répondre à ces problématiques. Néanmoins, ces outils ne sont pas toujours simple à mettre en place. C’est à cet instant que Vagrant entre en scène.

Présentation

Vagrant est un outil en ligne de commande pour créer et configurer des machines virtuelles. Il encapsule un logiciel de virtualisation (tel que VirtualBox ou VMware) et un logiciel de gestion de configuration (au sens provisionning de l’environnement tel que Chef, Puppet, Salt, Docker, etc…).

Les intérêts sont multiples :

  • disposer d’un environnement de développement sur un système d’exploitation différent de sa propre machine
  • avoir plusieurs environnements de développement sans modifier la configuration de son propre système (certains projets nécessitent des configurations système qui les rendent incompatibles entre eux)
  • monter rapidement un environnement de développement complet
  • certains outils sont plus faciles à installer sous GNU/Linux
  • etc…

L’avantage principal de Vagrant est qu’il ne repose que sur un simple fichier de configuration qui définit le système à utiliser et la configuration à appliquer. Les autres avantages sont :

  • outils très simple
  • les VMs sont portables
  • moins lourd que les VMs classiques
  • facilité à dupliquer et/ou reproduire un environnement autant de fois qu’on le souhaite

Installation

Prérequis

Pour pouvoir utiliser Vagrant, il faut simplement disposer de VirtualBox et de Vagrant aussi ! Il est possible de trouver beaucoup de tutoriels sur Internet pour Mac OS X ou GNU/Linux. Pour ma part, j’ai installé VirtualBox 4.3.10 et Vagrant 1.5.4 sur MS Windows 8.

VirtualBox et Vagrant

Télécharger la dernière version de VirtualBox et la dernière version de Vagrant, puis les installer.

La VM : une box

Vagrant repose sur des boxes. Ce sont les images des OS qui sont utilisées pour la virtualisation (ici par VirtualBox). Voici les commandes pour gérer les boxes :

# ajouter une box (l'URL est optionnelle pour les boxes officielle
$ vagrant box add nom_de_ma_box url_de_la_box

# supprimer une box
$ vagrant box remove nom_de_ma_box

# lister les boxes installées
$ vagrant box list

Un des autres intérêts de Vagrant est qu’il existe déjà de nombreuses boxes toutes prêtes à être utilisées (sur vagrantbox.es ou vagrantcloud.com) mais également de nombreux projets Vagrant proposant des boxes et/ou des configurations pour différents environnements de développement (Java EE, monitoring, PHP, etc…).

Il est également possible de créer sa propre box. Il est possible de trouver un exemple de création de box sur GitHub.

Ici, nous allons simplement réutiliser une box officielle avec la commande suivante :

$ vagrant box add hashicorp/precise32

Cette commande va prendre un peu de temps car elle va télécharger l’image de l’OS :

==> box: Loading metadata for box 'hashicorp/precise32'
box: URL: https://vagrantcloud.com/hashicorp/precise32
==> box: Adding box 'hashicorp/precise32' (v1.0.0) for provider: virtualbox
box: Downloading: https://vagrantcloud.com/hashicorp/precise32/version/1/provider/virtualbox.box
←[0m←[0m Progress: 100% (Rate: 609k/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'hashicorp/precise32' (v1.0.0) for 'virtualbox'!

Une fois l’image téléchargée, elle est utilisable. Pour cela, il faut créer un répertoire pour votre projet et s’y placer dedans et enfin initialiser Vagrant avec la commande suivante :

$ vagrant init hashicorp/precise32

Cette commande va simplement créer le fichier de configuration Vagrant pour votre projet :

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Utilisation

Instance de la VM

Une fois l’environnement initialisé (et éventuellement configuré), il existe quelques commandes pour manipuler l’instance de la VM :

# démarrer et configurer la VM
$ vagrant up

# se connecter en SSH à la VM
$ vagrant ssh

# vérifier l'état des VM
$ vagrant status

# mettre en pause la VM
$ vagrant suspend

# sortir de pause la VM
$ vagrant resume

# arrêter la VM
$ vagrant halt

Au premier lancement, Vagrant va construire à l’instance de la VM en fonction du fichier de configuration Vagrantfile :

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'hashicorp/precise32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise32' is up to date...
==> default: Setting the name of the VM: virtualisation_default_1398468142891_45569
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.2.0
    default: VirtualBox Version: 4.3
==> default: Mounting shared folders...
    default: /vagrant => C:/projects/virtualisation

La VM est lancée. Il est possible de s’y connecter en SSH et de vérifier l’OS de la VM avec la commande suivante :

vagrant@precise32:~$ uname -a
Linux precise32 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux

Facile ! Non ?

Provisionning

Vous savez maintenant déclarer et utiliser une VM. Il est maintenant temps de s’intéresser au provisionning… Il y a au moins 4 façons de provisionner votre environnement :

C’est un sujet assez vaste que je ne vais pas détailler ici (des exemples très simples par Alexandre).

Conclusion

Nous avons là tous les éléments pour créer facilement, rapidement, de façon sûre et reproductible des environnements. Le champ d’application qui s’ouvre à nous est énorme !

  • tester des outils seulement disponibles sur un OS différent de notre machine
  • monter des environnements “types”
  • faire des tests de configuration système “jetables”
  • monter des environnements à la demande (pour l’intégration continue ou les tests de charge en continue)
  • etc…

Personnellement, dans un premier temps, je pense essayer de configurer un environnement d’intégration continue (avec Jenkins et Sonar comme l’a fait Olivier) mais surtout un environnement de monitoring (avec jmxtrans, collectd, graphite, etc…).

Ensuite, si ces tests sont concluant, je regarderai pour créer un environnement de développement complet (cad avec un environnement graphique, un IDE de développement, pré-configuration de tous les outils, etc…).

Je vous souhaite une bonne virtualisation !

 

Libtool – l’extension .so manquante

28 August 2006 par SeB Pas de commentaire »

Après avoir passé ma Debian Woody en Sarge, les scripts d’installation de GWhere ne fonctionnaient plus.

Scott James Remnant explique bien le problème et propose une solution.

Personnellement, les scripts de GWhere refonctionnaient correctement après avoir effectué les commandes suivantes :

$libtoolize -c -f $aclocal $autoconf

Bonne compilation ! ;-)

 

Migrer une Debian Woody en Sarge

27 August 2006 par SeB Pas de commentaire »

La Debian GNU/Linux 3.1, plus connue sous le nom de Sarge, est sortie le 6 juin 2005[1]. De plus, le support de sécurité de la Debian GNU/Linux 3.0, plus connue également sous le nom de Woody, s’est arrêté le 30 juin 2006[2].

Il était donc temps que je migre ma Debian Woody en Sarge ! Le passage de Woody à Sarge s’est fait correctement malgré quelques soucis d’espace disque insuffisant.

Notes

[1] Cf. L’annonce officielle de publication de la Sarge.

[2] Cf. L’annonce officielle de fin de support pour la Woody.

 

Debian Addict arrondit les angles

20 July 2006 par SeB 1 commentaire »

Non, non ! L’équipe de la rédaction ne va pas changer de ton ! ;-)

Le site fait seulement peau neuve. L’aspect des boîtes de l’interface graphique du site ont été revues, en s’inspirant de la présentation des Krazy Korners[1]. Ainsi, elles ont des angles arrondis. Le code des squelettes SPIP a été nettoyé[2] de même que les feuilles de style.

Quelques petites modifications mineures suivront, mais le principal est déja en place.

Notes

[1] Notez que le code HTML et CSS a été modifié pour obtenir un rendu plus élaboré.

[2] Factorisation des éléments communs, suppression du code inutile, etc…

 

Asus MyPal 620 – GNU/Linux

8 March 2006 par SeB 2 commentaires »

Le pingouin débarque enfin sur les Asus MyPal 620 !

Le portage de GNU/Linux sur le Pocket PC Asus MyPal 620 a repris. Le site Handhelds.org héberge les pages d’information sur le portage de Linux sur MyPal 620. Bien entendu ce portage fonctionne non seulement pour le MyPal A620 mais également pour le MyPal A620BT même si le bluetooth n’est pas encore supporté[1].

Le projet a été repris par Vincent Bénony qui a fourni un excellent travail. Puisqu’en pas moins de trois semaines il a publié différentes versions compilées du noyau Linux 2.6 en y intégrant le support de la mise en veille, du microphone, de l’infrarouge, … Il a également recompilé Opie pour cet appareil mobile.

Actuellement, le développement est freiné par crainte d’endommager la mémoire flash de l’unique Pocket PC disponible pour les tests. L’auteur est donc à la recherche d’un MyPal 620 ou 620 BT endommagé (écran cassé ou autre) mais capable de démarrer.

Voici un projet qui mérite d’être félicité ! En espérant qu’il continue à progresser pour fournir une réelle alternative libre pour de PDA.

Notes

[1] Le mainteneur du projet ne possède pas la version bluetooth de cet appareil, une quelconque aide extérieure est la bienvenue.