Vagrant + Chefで環境構築も自動にする
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等でのバージョン管理が推奨される
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(サーバ構成管理ツール)についてはまったくの初心者ですが、少し使っただけでその便利さがよくわかります。 今後インフラ系以外のエンジニアにとっても必須の知識となるのではないでしょうか。
参考サイトなど
- 初心者のための Vagrant, Chef, VirtualBox の関係: http://qiita.com/tomoemon/items/d4c4fe0c5afcb2482ee8
- Vagrant(naoyaのはてなダイアリー): http://d.hatena.ne.jp/naoya/20130205/1360062070
- vagrant + chef solo + serverspecでテスト駆動サーバ構築を試してみるテスト: http://tech.voyagegroup.com/archives/7141452.html
- Vagrantとchef-soloでお気楽環境構築: http://kray.jp/blog/learning-chef/
- Chef-solo, knife-solo 導入メモ: http://ka-zoo.net/2013/06/chef-solo-knife-solo-%E5%B0%8E%E5%85%A5%E3%83%A1%E3%83%A2/
- chef-soloとBerkshelfを使ってNode.jsの環境構築(MongoDB, Redis): http://blog.hello-world.jp.net/?p=516
- vagrant 1.2を使ってみる: http://qiita.com/uchiunyo/items/43f82b5416d9f480e084
- Vagrant と Chef で仮想マシンの環境をいろいろいじれるようにしたい!: http://girigiribauer.com/archives/1013