話題の記事

Vagrant + Chefで環境構築も自動にする

2013.07.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Vagrantをもっと便利に使う

この記事では、VirtualBoxのフロントエンドであるVagrantを使用して、仮想OSを作成してみました。
Vagrantは単に仮想OS作成が楽にできるだけでなく、Chef(等の自動設定ツール)と連携して環境構築まで楽にできるようです。
今回はChefを使用して、Vagrantで作成した仮想OSにソフトウェアをインストールしてみましょう。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Vagrant : 1.2.2
  • Ruby : 1.9.3
  • VirtualBox : 4.1.2

ここで作ったCentOS環境を使用するので、vagrant upで起動できるようにしておきましょう。

Chef概要など

最近は社内でもあたりまえのように使用しているChefですが、私はほとんどさわったことがありませんでした。(rubyも使ったことないし)
調べていくうちにcookbookだのknifeだの、よくわからない用語がいっぱいでてきたので、ここで簡単に用語のまとめを。

Chefとは

ruby製のサーバの構成管理ツールで、サーバ構築の自動化をしてくれるツールです。
ソフトウェアのインストールや設定などを設定ファイルに記述しておくことで、サーバをその設定ファイルの状態にしてくれます。
設定ファイルにはサーバのあるべき完成状態を記述し、その差分をChefがうまいこと埋めてくれる感じです。
Chefでよく使用される用語は下記です。

  • Client:Chef Serverに接続するもの全て。管理ツール(knife等)もClient
  • Node:Chef Serverに接続するClientの中で、Chefで管理するマシンのこと。NodeはClient
  • Resouce:設定の最小単位。例えば「◯◯をインストールする」とか
  • Recipe:複数のResourceで構成される1つのグループ
  • Cookbook:1つ以上のRecipeをグループとしてまとめたもの
  • Role:どのCookbookをどういう設定で使うかを記述する
  • リポジトリ:Cookbookを入れる場所。Git等でのバージョン管理が推奨される

cheftop

Chef-soloとは

Chefサーバ無しでレシピを実行することができるツールです。
ローカルで簡単に試すことができるので、まずはここからChefを始める人が多いようです。

knifeとは

Chefに付属するためのリポジトリ操作ツールです。このコマンドを使ってCookbookを作ったり、NodeとRecipeを関連付けたりします。

knife-soloとは

knifeのプラグインです。これを使用すると、ローカルで作ったRecipeをリモートサーバへ送り、リモートサーバでchef-soloを実行することが可能です。

起動時にパッケージインストールしてみる

vagrant upで起動したとき、Chefを使用して任意のソフトウェアをインストールすることが可能です。
ここの記事を参考に、MySQLをインストールした状態で仮想OSを起動してみましょう。

Chefのインストールと準備

まずはChefをインストールしましょう。インストールスクリプトを使用すれば簡単にインストールできます。

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

Recipeを置くディレクトリを作成し、その中にMySQLをインストールするレシピを記述します。

% cd centos(Vagrantfileがあるディレクトリ)
% mkdir -p cookbooks/centos/recipes

yumの標準リポジトリでパッケージがみつかる場合、名前を指定すれば簡単にインストールできるようです。

#cookbooks/centos/recipes/default.rb
package "mysql-server" do
  action :install
end

Vagrantfileに、先ほど記述したRecipeを指定します。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos"

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "cookbooks"
    chef.run_list = "recipe[centos]"
  end
end

vagrant upでマシンを起動してみましょう。仮想OSの起動後にchef-soloが起動し、MySQLをインストールしている様子がわかります。

% vagrant up                                                                    
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'centos'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
・
・
Running chef-solo...
[2013-07-04T09:13:44+00:00] INFO: *** Chef 11.4.4 ***
[2013-07-04T09:13:45+00:00] INFO: Setting the run_list to "recipe[centos]" from JSON
[2013-07-04T09:13:45+00:00] INFO: Run List is [recipe[centos]]
[2013-07-04T09:13:45+00:00] INFO: Run List expands to [centos]
[2013-07-04T09:13:45+00:00] INFO: Starting Chef Run for localhost
[2013-07-04T09:13:45+00:00] INFO: Running start handlers
[2013-07-04T09:13:45+00:00] INFO: Start handlers complete.
[2013-07-04T09:13:45+00:00] INFO: Processing package[mysql-server] action install (centos::default line 1)
・
・

knife-soloを使ってnode.jsをインストールしてみる

今度はここを参考に、knife-soloを使用して、node.jsをインストールしてみましょう。

knife-soloのインストール

gemを使えばknife-soloがインストールできるようなのですが、今回は0.3系のバージョンを使用します。
このバージョンはGithubから直接取得しなければならないようなので、下記のようにインストールします。

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

リポジトリ作成

knife solo initコマンドでCookbookのひな形を作成します。

% cd /path/your/centos
% knife solo init my-chef-repo

Berkshelfのインストールと設定

これは、ChefのCookbookおよびその依存関係を管理するためのツールです。(node.jsでいうところのnpmみたいなもの?)
これを使用すれば、サードパーティのCookbook管理がすごく楽になるらしいので、インストールしましょう。

% gem i berkshelf --no-ri --no-rdoc

先ほどknife-soloで作成したリポジトリには、Cookbookを定義するBerksfileがすでに生成されています。
node.jsをインストールするために、下記のように記述しましょう。

site :opscode
cookbook 'nodejs'

berksコマンドを使用して、リポジトリにCookbookをインストールします。

% cd my-chef-repo
% berks install --path ./cookbooks                                               
Installing nodejs (1.1.2) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing build-essential (1.4.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
Installing apt (2.0.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'

my-chef-rep/cookbooksの中を確認してみてください。node.jsのCookbookが生成されています。

ssh設定とサーバへChefをインストール

ホスト名を指定するだけで仮想OSにsshログインできるよう、ssh-configコマンドを使用してconfigファイルにホスト名を登録します。
次の例では「nodesvr」という名前でsshアクセスできるように登録しています。

#仮想サーバは起動しておく
% vagrant ssh-config --host nodesvr >> ~/.ssh/config

prepareコマンドを使用して、サーバにChefをインストールします。

% knife solo prepare nodesvr

prepareを実行すると、my-chef-repo/nodesフォルダにjsonのファイルが作成されます。
そのファイルのrun_listにnode.jsのRecipeを指定すればOKです。

#nodes/nodesvrjson                                                          
{"run_list":[
  "recipe[nodejs]"
 ]
}

では、knofe soloを使用してサーバのchef-soloを実行してみましょう。

% knife solo cook nodesvr                                                        
Running Chef on nodesvr...
Checking Chef version...
Installing Berkshelf cookbooks to 'cookbooks'...
Using nodejs (1.1.2)
・
・

実行が完了したら、sshログインしてnode.jsがインストールされているのを確認してみましょう。

% vagrant ssh                                                                    
Welcome to your Vagrant-built virtual machine.
 
[vagrant@localhost ~]$ node -v
v0.10.2

まとめ

今回はVagrantとChefを連携させて、仮想OSにソフトウェアをインストールさせてみました。
この記事では私の理解不足により、単純な例しか行なっていませんが、実際はOSの設定やパッケージのインストール/設定も詳細にできます(多分・・)。

私は今回使用したChef(サーバ構成管理ツール)についてはまったくの初心者ですが、少し使っただけでその便利さがよくわかります。
今後インフラ系以外のエンジニアにとっても必須の知識となるのではないでしょうか。

参考サイトなど