ハマりポイント。

VMを壊す例として$ sudo rm -rf / --no-preserve-rootすると/vagrantにマウントされてるMac上のディレクトリまでVagrantfileごと消えるのでおすすめできない。

vagrantのplugin、saharaを使う

saharaを入れる。

% vagrant plugin install sahara

sandboxモードに入る。

% vagrant sandbox on

壊す。

% vagrant ssh
$ sudo rm -rf /usr
$ ls /usr
ls: cannot access /usr: No such file or directory
$ exit

戻す。

% vagrant sandbox rollback
% vagrant ssh
$ ls /usr/
bin  games  include  lib  local  sbin  share  src

ワオ、戻ってる!

置いておきます。

https://dl.dropboxusercontent.com/u/188423/wheezy.box

VirtualBoxでVM作成

OS
Linux
バージョン
Debian
メモリ
512MB
オーディオ
無効
USB
無効
ストレージ
VMDK 32GB

Debian wheezyをインストール

rootパスワード: vagrant

vagrantパスワード: vagrant

VirtualBox Guest Additionのインストール

# apt-get install build-essential module-assistant sudo ssh ca-certificates zerofree
# m-a prepare
# reboot

Virtualboxのメニュー > Device > Install Guest Additions

# mount /media/cdrom
# sh /media/cdrom/VBoxLinuxAdditions.run

その他色々

# visudo
%sudo ALL=(ALL) NOPASSWD:ALL
# gpasswd -a vagrant sudo
# mkdir /home/vagrant/.ssh
# cd /home/vagrant/.ssh
# wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
# mv vagrant.pub authorized_keys
# chmod 700 /home/vagrant/.ssh
# chown -R vagrant:vagrant /home/vagrant/.ssh
# echo 'UseDNS no' >> /etc/ssh/sshd_config

イメージサイズ縮小

# apt-get clean
# rm -rf /usr/src/vboxguest*
# rm -rf /usr/share/doc
# find /var/cache -type f -exec rm -rf {} \;
# rm -rf /usr/share/locale/{af,am,ar,as,ast,az,bal,be,bg,bn,bn_IN,br,bs,byn,ca,cr,cs,csb,cy,da,de,de_AT,dz,el,en_AU,en_CA,eo,es,et,et_EE,eu,fa,fi,fo,fr,fur,ga,gez,gl,gu,haw,he,hi,hr,hu,hy,id,is,it,ja,ka,kk,km,kn,ko,kok,ku,ky,lg,lt,lv,mg,mi,mk,ml,mn,mr,ms,mt,nb,ne,nl,nn,no,nso,oc,or,pa,pl,ps,pt,pt_BR,qu,ro,ru,rw,si,sk,sl,so,sq,sr,sr*latin,sv,sw,ta,te,th,ti,tig,tk,tl,tr,tt,ur,urd,ve,vi,wa,wal,wo,xh,zh,zh_HK,zh_CN,zh_TW,zu}
# init 1
# mount -o remount,ro /dev/sda1
# zerofree /dev/sda1
# halt

box作成

Macで。

% vagrant package --base wheezy

ハマリポイント

  • 古いvagrantを削除する。
  • VirtualBoxを新しくし過ぎない。(ちょっと古いやつを使う)
  • VirtualBox系でハマったらMacを再起動する。
  • ruby2.xではchef-solo動かない。
  • chefは公式サイトからcurlで入れる。
  • knife-soloはgithubから入れる。
  • knife-soloをbundle exec rake installする時ちゃんとruby1.9.3に入るようにする。

古いvagrantのアンインストール

% gem uninstall vagrant
% rm -rf ~/.vagrant.d

vagrantのインストール

http://downloads.vagrantup.com/tags/v1.2.2

debian wheezy64のvm作成

断固debian。

% vagrant box add wheezy64 http://dl.dropbox.com/u/937870/VMs/wheezy64.box
% mkdir wheezy64
% cd wheezy64
% vagrant init wheezy64
% vagrant up

下記でいい感じの設定を履いてくれる。(便利)

% vagrant ssh-config --host wheezy64 >> ~/.ssh/config
% ssh wheezy64

で入れるようになってる。

chef-soloのインストール

% curl -L https://www.opscode.com/chef/install.sh | sudo bash
% chef-solo -v
Chef: 11.4.4

ちゃんと動くか確認。

knife-soloのインストール

gem版は0.2.0だったのでgithubから入れる。

% git clone git@github.com:matschaffer/knife-solo.git
% cd knife-solo
% git submodule init
% git submodule update
% bundle
% bundle exec rake install

rubyが2.xだと動かないので注意!

chef-soloをwheezy64にインストール

% knife solo prepare wheezy64

これで入るChefが0.10.8なのが気になる・・・。

自分のcookbookのリポジトリ作成

% knife solo init chef-cookbook
% cd chef-cookbook
% git init .
% git commit -m'First commit'
% hub create

nginxをインストールするrecipeを書く

% knife cookbook create nginx -o site-cookbooks
% vi site-cookbooks/nginx/recipes/default.rb
package 'nginx' do
  action :install
end
% vi nodes/wheezy64.json 
{
  "run_list":[
    "nginx"
  ]
}

実行。

% knife solo cook wheezy64   
Running Chef on wheezy64...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: *** Chef 0.10.8 ***
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Setting the run_list to ["nginx"] from JSON
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Run List is [recipe[nginx]]
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Run List expands to [nginx]
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Starting Chef Run for vagrant-debian-wheezy-64.vagrantup.com
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Running start handlers
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Start handlers complete.
[Wed, 26 Jun 2013 08:35:26 +0200] FATAL: No cookbook found in ["/home/vagrant/chef-solo/cookbooks-1", "/home/vagrant/chef-solo/cookbooks-2", "/home/vagrant/chef-solo/cookbooks-3"], make sure cookbook_path is set correctly.
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Processing package[nginx] action install (nginx::default line 9)
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Chef Run complete in 0.267082 seconds
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Running report handlers
[Wed, 26 Jun 2013 08:35:26 +0200] INFO: Report handlers complete

一応入ったけどFATALがきになる・・・。

% vagrant up
Vagrant has detected that you have VirtualBox version 3.2.12 installed!
Vagrant requires that you use at least VirtualBox version 4.0. Please install
a more recent version of VirtualBox to continue.

The Vagrant 0.6.x series supports VirtualBox 3.2, so if you're stuck with that
version, then please use the 0.6.x series of Vagrant.

Any earlier versions of VirtualBox are completely unsupported. Please upgrade.

VirtualBox 3.2系から4系へは自動アップデートが行われないので手動でアップデートする必要がある。忌々しい東京三菱UFJ銀行(法人版)とIE6の為に確保してあるWindows XP無印はアップデートしても問題無く動きました。

herokuのpg_dump.sqlしかバックアップが無い状態からDBを復旧させるため、適当なpostgres環境が必要になったんですが、$ brew install postgresql はv9.0とか未来的な感じが面倒そうだったので簡単にVirtualBoxの仮想環境が作れるという噂のVagrantを使ってみました。

Vagrant - Welcome

Vagrant - Welcome

Vagrantとは?

VirtualBoxの仮想環境をCUIから操作するツールです。数回コマンドを叩くだけで環境が作れるのでとても便利。rubyで書かれたシンプルな設定ファイルを元に面倒な仮想環境構築を自動化してくれます。

VM自体はVagrantfileという設定ファイルで設定し、VMの中身はchefで設定するという感じです。僕はchef使ったこと無いので今回はVM作成したあとはsshで入ってpostgresをインストールしちゃいました。それだけでもOSのCDイメージ落としてきて、インストールして・・・って面倒だったのが簡単になったし、バックグラウンド動作してくれるし、環境がキモくなったらすぐ削除して作り直せるのが精神衛生上良いですね。

Ubuntu 10.04 (Lucid Lynx) 環境を作る

$ gem install vagrant
$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
$ vagrant box list
lucid32

OSイメージをダウンロードするので結構時間かかります。lucid32ってのがbox名です。

$ mkdir env
$ cd env
$ vagrant init lucid32
create Vagrantfile
$ ls
Vagrantfile

適当なディレクトリを作ってvagrant initでVagrantfileを作ります。RakefileとかCapfileとかGemfileとかあるので分かると思いますが、このディレクトリで実行するvagrantコマンドがこの設定ファイルを参照します。

# Vagrantfile
Vagrant::Config.run do |config|
config.vm.box = "lucid32"
end
$ vagrant up

vagrant upで同ディレクトリのVagrantfileを元にVMイメージを作ってバックグラウンドで起動します。(2回目からは単に起動します)

$ vagrant ssh
Warning: Permanently added '[localhost]:2222' (RSA) to the list of known hosts.
Linux vagrantup 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux
Ubuntu 10.04.1 LTS

Welcome to Ubuntu!
* Documentation: https://help.ubuntu.com/
Last login: Wed Aug 11 17:42:46 2010

vagrant sshでVMにvagrantユーザーでsshで接続します。(デフォルトではlocalhost:2222をVMの22にforwardします)

sudoできるので後は普通のubuntuです。通常、設定はchefでやるみたいです。

忙しい人のためのVagrant

これだけだと何がどうなってるのか解かり辛いのでもう一個環境を作ってみます。

$ mkdir env2
$ cd env2
$ vagrant init lucid32
$ vagrant up

この状態でVirtualBoxの設定画面を見てます。

Oracle VM VirtualBox

ちゃんと2個のVMが実行中です。何にも設定してないですが実際はどうなってるんでしょう?vagrant haltでVMを停止して設定を見てみます。

仮想メディアマネージャ

$ tree ~/Library/VirtualBox/HardDisks
/Users/komagata/Library/VirtualBox/HardDisks
├── lucid.vmdk
├── lucid_1.vmdk
└── windows_xp_ie6.vmdk

HDDイメージはそれぞれ別々に作ってくれています。

% tree ~/.vagrant 
/Users/komagata/.vagrant
├── boxes
│   └── lucid32
│   ├── Vagrantfile
│   ├── box.mf
│   ├── box.ovf
│   └── lucid.vmdk
├── logs
└── tmp

box(CDイメージとVMのデフォルト設定)の方は共通です。

$ vagrant destroy
$ cd ..
$ rm -rf env2
$ ls ~/Library/VirtualBox/HardDisks
lucid.vmdk windows_xp_ie6.vmdk

vagrant destroyで綺麗に消えるので気軽に作成・削除が出来ます。

作りがシンプルで気に入ってしまいました。当初の目的だったpostgresはデータを救い出したあと要らないのでVMごと消してしまいました。そのぐらい気軽に環境が作れるところがいいですね。