VagrantとChef-soloについて学んだいくつかのこと

ホストはWindows7、ゲストはCentOSです。

Vagrantのインストール

http://vagrantup.com/
からダウンロードします。インストーラーが出来て便利になりましたね。

とりあえず起動

どのBoxがよいのかよくわからないけどとりえあず今はminimal-centos-56使っています。他は
http://www.vagrantbox.es/
から探しましょう。

> vagrant box add minimal-centos-56 http://dl.dropbox.com/u/9227672/centos-5.6-x86_64-netinstall-4.1.6.box
> vagrant init minimal-centos-56
> vagrant up

Chef-soloを使う場合でも、とりあえずは何もせずに一度VMを起動して、VM内でknifeコマンドなどを使うのが良いと思います。
(2013/02/23 追記 ホストがWindowsの場合はknifeをホストにインストールするのが面倒という意味です)。

sshする

localhost:2222にsshします。鍵の設定をしてもいいけど、vagrant/vagrantでパスワードでログインできます。
(2013/02/23 追記 Unix-likeなOSやmingw等のsshを使っている場合は、vagrant ssh-configの出力結果を~/.ssh/configに貼り付けて、ssh defaultで良いです)。

Chef-soloを設定

ホスト側のカレントディレクトリ(Vagrantfileのあるディレクトリ)が/vagrantにVirtualBoxの共有フォルダがマウントされているので、ここで作業します。

$ cd /vagrant
$ knife cookbook create myrecipe -o cookbooks
WARNING: No knife configuration file found
** Creating cookbook myrecipe
** Creating README for cookbook: myrecipe
** Creating metadata for cookbook: myrecipe

何もしないcookbookができました。Vagrantfileの設定をします。前述の通りVagrantfileは共有フォルダにあるので、Windows側で編集してもLinxu側で編集してもOKです(ただしこの時点ではviしか入ってませんが)。

Vagrant::Config.run do |config|
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "cookbooks"
    chef.add_recipe "myrecipe"
  end
end

この設定により、VirtualBoxの共有フォルダが新たに作られることになるので、再起動。

> vagrant reload

パッケージをインストール

では念願のvimをインストールします。yum installするのをグッとこらえて、cookbooks/myrecipe/recipes/default.rbに一行追加。

package "vim-enhanced"

で、vagrant provisionを実行。

> vagrant provision
[default] Running provisioner: Vagrant::Provisioners::ChefSolo...
[default] Generating chef JSON and uploading...
[default] Running chef-solo...
[Mon, 30 Apr 2012 03:56:27 -0400] INFO: *** Chef 0.10.4 ***
[Mon, 30 Apr 2012 03:56:27 -0400] INFO: Setting the run_list to ["recipe[myrecip
e]"] from JSON
[Mon, 30 Apr 2012 03:56:27 -0400] INFO: Run List is [recipe[myrecipe]]
[Mon, 30 Apr 2012 03:56:27 -0400] INFO: Run List expands to [myrecipe]
[Mon, 30 Apr 2012 03:56:27 -0400] INFO: Starting Chef Run for localhost.localdom
ain
[Mon, 30 Apr 2012 03:56:27 -0400] INFO: Processing package[vim-enhanced] action
install (myrecipe::default line 9)
[Mon, 30 Apr 2012 03:57:40 -0400] INFO: package[vim-enhanced] installed version
7.0.109-7.el5
[Mon, 30 Apr 2012 03:57:40 -0400] INFO: Chef Run complete in 72.384425 seconds
[Mon, 30 Apr 2012 03:57:40 -0400] INFO: Running report handlers
[Mon, 30 Apr 2012 03:57:40 -0400] INFO: Report handlers complete

gitをインストールする(epelを使う)

http://community.opscode.com/cookbooks/yum
を使って、yumのリポジトリを追加します。knife cookbook site installというコマンドもあるのですがこれを使うには先にgitが必要なので、今回はdownloadコマンドを使います。

$ knife cookbook site download yum
$ cd /vagrant/cookbooks/
$ tar zxf /path/to/yum-0.5.2.tar.gz

myrecipe/recipes/default.rbに追加。

include_recipe "yum::epel"

package "git"
package "vim-enhanced"

で、vagrant provisionすると、gitがインストールされます。

apacheをインストール、設定する

myrecipe/recipes/default.rbに追加。

package "httpd"
service "httpd" do
  action [:enable, :start ]
end

vagrant provisionでインストール、起動はOKです。Vagrantfileを編集してポートフォワードの設定をします。

  config.vm.forward_port 80, 8080

今度はvagrant reloadが必要です。再起動後、ホストからlocalhost:8080でVMのapacheにアクセスできます。

DocumentRootを/vagrant/wwwに変更してみます。直接httpd.confを編集するのをグッとこらえて、

$ cp /etc/httpd/conf/httpd.conf /vagrant/cookbooks/myrecipe/templates/default/httpd.conf.erb
$ vim cookbooks/myrecipe/templates/default/httpd.conf.erb

myrecipe/recipes/default.rbに追加。

template "/etc/httpd/conf/httpd.conf" do
  source "httpd.conf.erb"
  mode "0644"
  notifies :restart, "service[httpd]"
end

vagrant provisionでhttpd.confが書き換わります。反映するにはsudo /sbin/servecie httpd reloadするなど。
2012/05/23 追記
上の通り notifies :restart, "service[httpd]" と書いておけば、変更時にhttpdが再起動されます。

2013/03/27 追記
VirtualBox共有フォルダ内のファイルの更新をapacheが認識できない場合、httpd.conf.erbのEnableMMAP、EnableSendFileをoffにしましょう。

EnableMMAP off
EnableSendfile off

デバッグなど

VirtualBoxの画面を表示する

  config.vm.boot_mode = :gui

vagrantのデバッグログ

> set VAGRANT_LOG=INFO
> vagrant up

chefのデバッグログ

  config.vm.provision :chef_solo do |chef|
    chef.log_level = "debug"

その他、使ってみて思ったこと

こんな感じで環境を作って、/vagrantの下で作業をしていくのですが、VirtualBox共有フォルダは結構遅いので、git cloneのような大量にファイルを更新する場合はホスト側からやった方がいいかもしれません。

/vagrant の下に作ったファイルはパーミッションが0777になります。かつここでgit addすると常に0644でaddされます。なので0755にしたい場合は

$ git update-index --chmod=+x hoge.sh

とするようです。

cookbookの雛形を作ったり、レシピをダウンロードしてきたりなどするにはknifeコマンドが便利です(無くても出来なくないですが)。knifeコマンドはゲスト側にあってもホスト側にあってもいいと思いますが、今回の場合

  • Windowsにknifeを入れるのは大変そう(試してないけど)
  • Box側には最初からknifeコマンドは入っているが、gitがyumの標準のリポジトリに無い(knife site installコマンドを使うにはgitが必要)

と、なかなかやっかいな状況でした。

http://community.opscode.com/cookbooks/databaseを使ってMySQLのDBやユーザーを作る、みたいなことをやる場合は、knife site installであれば依存する他のレシピも自動的に持ってきてくれるので便利です。とはいえ、ちょっと大げさすぎる気がしたので、結局レシピ内でシェルスクリプトを書くことにしましたが。色々エレガントなやり方もあると思いますが、適当に落としどころを見つけるのも大事だと思います。