読者です 読者をやめる 読者になる 読者になる

Vagrant はとても簡単&気づいたこと

とても簡単

「自分の開発環境用だし、既存の Configuration Management System の資産が無いのに使っても意味あるかな?」

とか思ってましたが、意味も何もとんでもなく簡単なので、「環境構築のコマンドをメモっておく」くらいなら Vagrantfile 書いたほうがいいんじゃないかって感じでした。その後 Chef やら Ansible に移していく、っていうスケールの道もありますし。

例えば Vagrant が配布してる裸の precise 64bit ボックスを使って、既に rbenv で動いている rails のルートディレクトリから独立した開発環境を立ち上げるには…

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

$apt_script = <<SCRIPT
echo "apt"
apt-get update -q
apt-get install -q -y git build-essential libsqlite3-dev nodejs mysql-client libmysqlclient-dev
SCRIPT

$rbenv_script = <<SCRIPT
echo "rbenv"
if [[ ! -d $HOME/.rbenv ]]; then
  git clone https://github.com/sstephenson/rbenv.git $HOME/.rbenv
  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.profile
  echo 'eval "$(rbenv init -)"' >> $HOME/.profile
  git clone https://github.com/sstephenson/ruby-build.git $HOME/.rbenv/plugins/ruby-build
  source $HOME/.profile
fi
SCRIPT

$ruby_script = <<SCRIPT
echo "ruby"
VERSION=`rbenv versions`
if [[ ! $VERSION =~ $(< /vagrant/.ruby-version) ]]; then
  rbenv install $(< /vagrant/.ruby-version)
fi
SCRIPT

$application_script = <<SCRIPT
echo "application setting by user"
cd /vagrant
gem install bundler
rbenv rehash
bundle install
rbenv rehash
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  config.vm.network "private_network", ip: "192.168.2.7"

  config.vm.provision "shell", inline: $apt_script
  config.vm.provision "shell", inline: $rbenv_script, privileged: false
  config.vm.provision "shell", inline: $ruby_script, privileged: false
  config.vm.provision "shell", inline: $application_script, privileged: false
end

こんな感じの Vagrantfile 一枚で出来てしまった!。これからファイルを構造化したり、必要があれば Chef やら Ansible にしたりすればよろしい(例えば Chef なら rbenv 入れてくれるレシピとかあるよ)。さらにこれ案外みんなで使うなあ、ってなったら Packer で box にするわけですね?

気づいたこと

  • Configuration Management System 知らなくても使える。
  • shell でやる場合はインタラクティブシェルじゃないので気をつける( .bashrc は読み込まれないなど)。
  • shell なら "privileged" で root か vagrant かユーザを選べる。
  • config.vm.provision は複数書ける。
  • synced folder 鬼便利。
  • ダウンロードされた precise64 box は $HOME/.vagrant.d/boxes/ にキャッシュされていて、 vagrant destroy では消えないので、 vagrant provision の連発、及び時たま vagrant destroy & vagrant up の連発で思ったより快適に provisioning script の try & error ができる。
  • halt では provision で編集された物事は cleanup されない。 destroy すると cleanup される。つまり destroy → up だと provision が走る。
  • vagrant up --provision 単体で何度も実行できるよう、スクリプトは idempotent であるようにする。