VagrantとChef Soloを組み合わせて環境構築を自動化する

 2011/11/08

前回まではVagrantを使ってVirtualBoxの仮想インスタンスを簡単の構築するところまで説明した。

ただそれだけだったら予め作成しておいたイメージをコピーするのとたいして変わりがないので、あまり有難味を感じないかもしれないが、ここからが本番だ。

Vagrantの特徴として、PuppetやChefやChef Soloと組み合わせてインフラ部分の設定を仮想インスタンスの生成時に行うことが出来る。

流れとしては以下のようになる。

この原理上、仮想インスタンス側にVirtualBoxのバージョンと適合したVirtualBox Additionsがインストールされている必要がある。(ネット上から落としたboxの場合にはこれが古い可能性がある)

実際にためしてみよう

今回はCentOS5を利用してDNSを設定するところを自動化する。

事前準備

Vagrantファイルがおいてある場所にcookbooksフォルダを作成して移動する。

mkdir cookbooks
cd cookbooks

Recipeの雛形を作る

いちいち手でRecipeファイルを作るのは面倒なのでコマンドで生成する。

knife cookbook create dns -o ./

これでcookbooksディレクトリにdnsというディレクトリが作成され、中に色々なファイルが作られる。

Recipeの中身を書く

今回はDNSの設定を行うRecipeを書くが、CentOSでは/etc/resolv.confが設定ファイルとなり、この中に

nameserver 8.8.8.8
nameserver 8.8.4.4

といった形で書けば良い。この設定を自動化する。 今回は特定の場所にあるファイルを指定した値で置き換えれば良いので、recipes/default.rbとtemplates/default/resolv.conf.erbを用意する。また初期値を設定できるようにattirbutes/default.rbも用意する

recipes/default.rb

case node[:platform]
  when "centos"
    template "/etc/resolv.conf" do
    source "resolv.conf.erb"
    owner "root"
    group "root"
    mode "0644"
  end
else
end

※CentOSしか動作させないようにしている

templates/default/resolv.conf.erb

< % node["nameservers"].each do |ns| %>
nameserver < %= ns %>
< % end %>

attirbutes/default.rb

default["nameservers"] = ["8.8.8.8","8.8.4.4"]  

ここまで出来たら次にVagrant側から呼び出す設定を行う。

Vagrant側の設定

こちらも極めて簡単でVagrantでinitした際に作成されるVagrantファイルを編集すれば良い。 今回はcookbooksが同じディレクトリにある前提で、Recipe名はdnsの場合だ。

Vagrant::Config.run do |config|
  config.vm.box = "centos56_32_ryuzee"
  config.vm.boot_mode = :gui
  config.vm.network "192.168.50.10"
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "cookbooks"
    chef.add_recipe "dns"
    chef.json = {:nameservers => ["192.168.1.1","210.130.1.1"]}
  end
end

以上が出来たら完了だ。

動作確認

まずはVagrantでboxを起動する (既に起動中の場合はreload)

sudo vagrant up

すると以下のようなログが表示されるはずだ。最後の方で/etc/resolv.confがバックアップされ、置き換えられているのが分かる。

[default] Preparing host only network...
[default] Clearing any previously set forwarded ports...
(略)
[default] Mounting shared folders...
[default] -- v-root: /vagrant
[default] -- v-csc-1: /tmp/vagrant-chef-1/chef-solo-1
[default] Running provisioner: Vagrant::Provisioners::ChefSolo...
[default] Generating chef JSON and uploading...
[default] Running chef-solo...
[default] [Tue, 08 Nov 2011 10:22:26 +0100] INFO: Setting the run_list to ["recipe[dns]"] from JSON
[Tue, 08 Nov 2011 10:22:26 +0100] INFO: Starting Chef Run (Version 0.9.14)
[Tue, 08 Nov 2011 10:22:27 +0100] INFO: Writing updated content for template[/etc/resolv.conf] to /etc/resolv.conf
[Tue, 08 Nov 2011 10:22:27 +0100] INFO: Backing up template[/etc/resolv.conf] to /var/chef/backup/etc/resolv.conf.chef-20111108102227
: stdout

最後に

ここまででVagrantの中からChef Soloと連携する方法を示した。これは簡単な例でわざわざ自動化するメリットが感じられないかもしれないが、こういう話が多くなれば自動化するメリットを享受出来る。例えばミドルウェアのインストール等において自動化されていれば開発環境を作るのも一瞬だし、開発者の環境を更新するのも一瞬だ。またRecipeファイルをバージョン管理しておくことで、構成を管理することも出来る。

なお、Chefのレシピのサンプルについては以下が非常に参考になる。 それぞれ実装は結構異なっているので、これらをベースにして自分のRecipeを作成しても良いし、オリジナルで作成しても良い (僕個人ではあまりUbuntuなどは使わず、もっぱらCentOSなのでそれにあうようなRecipeを自分で書いた)

Opscode Public Cookbooks for Chef https://github.com/opscode/cookbooks

Chef Cookbooks in use at 37signals https://github.com/37signals/37s_cookbooks

 2011/11/08

サイト内検索


著作

寄稿

Latest post: