ようへいの日々精進XP

よかろうもん

Vagrant で仮想環境を chef で設定する時のアレコレ

はじめに

  • vagrant で chef を使いたいという質問を頂いてすぐに答えられなかったので反省と復習の意味を込めて
  • 幾つかやり方があるのでやり方別に書いてみる
  • 但し、細かい設定手順等については改めて書くか、ググる

うんちく

ざっくりと登場人物について整理してみる。

Vagrant

  • オフィシャルサイト
  • Oracle VirtualBox のフロントエンドコマンドラインツール
  • ただし VirtualBox だけではなく lxc や AWS の EC2 等も操作することが出来る(使ったことないけど)
  • 仮想環境は box というファイル拡張子で管理されていて、ユーザーが作った box ファイルがこちらで公開されている

chef

  • オフィシャルサイト
  • 無く子も黙る Provisioning Framework の決定版
  • DSL はほぼ Ruby で記述することが出来る
  • 各種設定やコマンドが記述された recipecookbook という単位で管理し実行することで環境を構築する
  • 何度実行しても同じ環境が構築されること(べき等性)がキモ

詳しいことはググった方が良い。


以下、アレやコレや。

パターン #1 仮想環境に対して knife-solo

chef-solo のフロントエンドツールである knife-solo を使うパターン。これは別に Vagrant での仮想環境とかではなくても物理サーバーに対しても利用することが出来る。

手順

ざっくりとした手順。

  1. Vagrant で仮想環境を起動
  2. ホストと仮想環境間において ssh でアクセス出来ることを確認、鍵の交換も行なっておく
  3. knife solo prepare で仮想環境で chef が利用出来るようにする
  4. knife solo cook で仮想環境に対して cookbook を適用する

メモ

  • VirtualBox のネットワーク設定はブリッジモードにしておく必要がある(と思う)
  • 同時に複数の仮想環境に対して cookbook を適用する場合にはやり方を考える必要がある
  • 個人的にはよく使う

パターン #2 vagrant up と vagrant provision

Vagrant で仮想環境を起動(vagrant up)する際や vagrant provision を実行して VirtualBox の共有フォルダ内にある cookbook を適用するパターン。

手順

以下、ざっくり手順。

  1. vagrant init で生成される Vagrantfile を修正する(Vagrantfile 内の該当部分は以下を参照)
  2. 共有フォルダ内に cookbook 設置する
  3. 仮想環境を起動(vagrant up) する際か vagrant provision すると cookbook が適用される

Vagrantfile

以下、Vagrantfile での chef を利用する部分の抜粋。

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "./cookbooks"
    #chef.roles_path = "../my-recipes/roles"
    #chef.data_bags_path = "../my-recipes/data_bags"
    chef.add_recipe "hoge"
    #chef.add_role "web"

     # You may also specify custom JSON attributes:
   #chef.json = { :mysql_password => "foo" }
  end

上記の記述で最低限動くはず。

vagrant provision してみたの図

下記のような仮想環境に vim パッケージをインストールする recipe を書いて実行してみた。

#
# Cookbook Name:: hoge
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "vim" do
  action :install
end

vagrant provision を実行!

user@tpX1-Carbon:~/vagrant/chef-test$ vagrant provision
[default] Running provisioner: chef_solo...
Generating chef JSON and uploading...
Running chef-solo...
stdin: is not a tty
[2013-10-16T21:42:51+00:00] INFO: Forking chef instance to converge...
[2013-10-16T21:42:51+00:00] INFO: *** Chef 11.6.2 ***
[2013-10-16T21:42:52+00:00] INFO: Setting the run_list to ["recipe[hoge]"] from JSON
[2013-10-16T21:42:52+00:00] INFO: Run List is [recipe[hoge]]
[2013-10-16T21:42:52+00:00] INFO: Run List expands to [hoge]
[2013-10-16T21:42:52+00:00] INFO: Starting Chef Run for debian-7.1.0
[2013-10-16T21:42:52+00:00] INFO: Running start handlers
[2013-10-16T21:42:52+00:00] INFO: Start handlers complete.
[2013-10-16T21:43:37+00:00] INFO: Chef Run complete in 44.242426981 seconds
[2013-10-16T21:43:37+00:00] INFO: Running report handlers
[2013-10-16T21:43:37+00:00] INFO: Report handlers complete
user@tpX1-Carbon:~/vagrant/chef-test$

注意点

  • ホスト側で Vagrantfile が存在するディレクトリが共有フォルダとなる
  • 仮想環境では /vagrant ディレクトリが共有フォルダとなる
  • 場合によっては仮想環境に chef 環境を手動で整える必要がある(すでに chef 環境が整った box も提供されている)
  • 毎回 vagrant up は大変なので vagrant provision がオススメ

最後に

アレコレという程のやり方は無かったかもしれないけど久しぶりに Vagrant を触って面白かった。