ようへいの日々精進XP

よかろうもん

俺の台所(続:chef-solo と vagrant と tmux でこさえる俺のモバイルキッチン)一部始終

要件

  • 包丁一本でしばらく生きていくことを決めた駆け出し(年齢的には走り終わりに近いけど)エンジニアがいつでも料理出来る環境を構築する
  • 回りくどい言い回しだったけど、要は chef-solo と vagrant を用意していつでも chef のレシピを書いて試せる環境を作ってみたい
  • tmux を使って複数ウィンドウで vagrant の設定と起動、レシピの修正が出来るような環境を合わせて整える

以前に...

環境

手順

vagant を使える環境を準備する

VirtualBox のインストール
  • 駆け出しの板前は素直に Ubuntu ソフトウェアセンターからインストールする...
vagrant のインストール
  • 駆け出しの板前は VirtualBox 同様に Ubuntuソフトウェアセンターからインストール...

vagrant を使ってみる

適当な作業フォルダをこさえる
mkdir ~/vagrant
vagrant box する
cd ~/vagrant
vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
vagrant init する
vagrant init

とすると Vagrantfile と呼ばれるひな形ファイルが作成されたので以下の点を修正

Vagrant::Config.run do |config|
  #config.vm.box = "base" # コメントアウト
  config.vm.box = "lucid32" # 追記
vagrant up で仮想マシンを起動
vagrant up

f:id:inokara:20130406104257p:plain

ssh仮想マシンにアクセス
vagrant ssh

f:id:inokara:20130406104711p:plain
あら、簡単。

vagrant 内の仮想マシンを停止する
vagrant halt

あら、簡単。

もう少し突っ込んで vagrant を使ってみる

  • OS は例のごとく Debian
  • box はこちら
  • ネットワークの設定に hostonly ネットワークを追加
  • そして、chef-solo を使って provision してみる
  • 作成した box の確認と削除もやってみる
Debian仮想マシンで起動する

まずは vagrant box add

vagrant box add debian http://ergonlogic.com/files/boxes/debian-current.box

次は vagrant init

vagrant init

Vagrantfile が作成されているので、下記のように記載する

Vagrant::Config.run do |config|
  config.vm.box = "debian"
  # VirtualBox のウィンドウが表示されるようになる
  config.vm.boot_mode = :gui
  # hostonly ネットワークの設定
  config.vm.network :hostonly, "192.168.56.2" ,:netmask => "255.255.255.0"
  # chef-solo を使ってサーバーの設定を行う
  config.vm.provision :chef_solo do |chef|
     chef.cookbooks_path = "cookbooks"
     chef.add_recipe "itamae"
  end
end

VirtualBox の共有フォルダ内で chef-solo の cookbook を作成する(共有フォルダは Vagrantfile が存在するディレクトリになる)

cd ~/vagrant
mkdir cookbooks
cd cookbooks
knife cookbook create itamae -o ./
itamae cookbook で以下のようなレシピを書く
  • 仮想マシンにて resolv.conf の設定
  • aptitude update
  • 試しに nginx をインストールしてみる

以下、レシピ。
~/vagrant/cookbooks/itamae/recipes/default.rb

# resolv.conf の設定
template "/etc/resolv.conf" do
        source "resolv.conf.erb"
        owner "root"
        group "root"
        mode "0644"
end
# aptitude update を execute する(非推奨?)
execute "aptitude" do
        command "aptitude update"
end
# パッケージのインストール
%w{nginx}.each do |package_name| 
        package package_name do
                action :install
        end
end

tempalete ファイルを用意する(動的に変わる設定ファイルを設定する)
~/vagrant/cookbooks/itamae/templates/default/resolv.conf.erb

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

attributes ファイルを用意する(template の値を設定する)
~/vagrant/cookbooks/itamae/attributes/default.rb

default["nameservers"] = ["8.8.8.8","8.8.4.4"]
準備が出来たので vagrant up する
vagrant up

vagrant up で仮想マシンが起動し、その後、chef-solo が実行される
f:id:inokara:20130407170107p:plain

作成済みの box を確認して、ついでに削除もやってみる

まずは box の確認

vagrant box list

こんな感じで表示される

centos
debian
debian2
lucid32

色々と作りました
続いて、不要な box の削除

vagrant box remove ${box_name}
chef-solo のレシピを修正した場合には vagrant provision を実行する

仮想マシンの設定を chef-solo で修正したい場合にはレシピを適宜修正した後に vagrant provision を実行する

cd ~/vagrant
vagrant provision

ということで...

hostonly ネットワークが上がらない等の色々とな問題があり苦労しましたが、とりあえず、以下のようなレシピを書く環境が整いました...
f:id:inokara:20130407163452p:plain

ちなみに tmux でレシピを書くウィンドウと vagrant コマンドを叩くウィンドウ、そして仮想マシンウィンドウで区切ってみました...
f:id:inokara:20130407163652p:plain

まとめ

  • vagrant はとっても簡単に仮想マシンを作って、壊して出来る環境が手に入るのは嬉しい
  • Vagrant ファイルで色々と仮想マシンを設定出来るという点ではまさにプログラマブルインフラ
  • さらに chef や puppet を組み合わせることで簡単にサーバーの設定まで出来てしまうのにも脱帽!
  • ただ、Ubuntu 12.10 環境では hostonly ネットワークが上がらない問題に悩んだ(再起動で解決...)
  • 実用的な使い方としては、以下のようなパターンが考えられるか...
    • サーバーの検証
    • 開発者の方には複数パターンの box ファイルを用意しておいて vagrant box add だけやってもらって、開発環境構築の時間を短縮してもらう