RubyでできてるChefはえらいイケメンならしく、巷でモテモテならしいです。
勉強会とかでも話題に上ることが多く、エロいChefに見られてる気がしたので重い腰を上げて取り掛かってみました。
釣くさいタイトルはどうでもいいからChefって何さ?
ザックリまとめると「サーバの状態を保持するツール」ですが、「同じ規格の開発環境を何個も用意したり、配布できるツール」といった使い方も可能で、私としては後者の用途に非常に興味があるわけです。
開発環境を乱立するにあたって、手っ取り早くもめんどくさいXamppとかより「Chefでレシピ用意して立てた方がいいよね!」ってのが、最近の流れかと。
本番環境の運用ではなく、あくまで開発環境の高速乱立(?)を目指すので、ここではChef soloを使っていきたいと思います。
よーいするもの(Windows7での実行を想定)
- Ruby・・・1.9.2だとなぜかgemのjsonインストールでコケたので、2.0.0を用意。
- Chef・・・Rubyをインストールしたあと「gem install chef」で、サクッとインストール。
- VirtualBox・・・仮想マシンツール。開発環境をこれで作成します。
- Vagrant・・・VirtualBoxのフロントエンドになるツール。
http://www.vagrantup.com/ ここからダウンロードしてインストーラに従ってインストールしました。
- Git・・・みんな大好き“間抜け野郎”(git)。インストールしてない人は、Windows環境でもvagrant sshを使えるようにするため、同梱されるssh.exe目当てでインストールしよう。
MacとかLinuxはsshが既にあるはずなので、Gitがあっても無くてもどっちでもいいです。
ちなみに、Windows環境ではインストール後、環境変数PATHにssh.exeへのパスを当しておきます→「C:\Program Files (x86)\Git\bin\」
Vagrantで、仮想環境のサーバをたてる
上記の準備が出来たら、Vagrantを使ってVirturalBoxの仮想サーバを作成→起動→停止を行ってみます。
まずは仮想サーバの入手からですが、下記URLで好みの環境を選びます。
http://www.vagrantbox.es/
2013/06/03時点では、各サーバのURLの手前に「Copy」と表示されているので、それをクリックすればクリップボードにURLがコピーされます。
コンソール(コマンドプロンプト)等を開いて、以下のコマンドを実行。
#仮想環境の/Vagrantディレクトリと同期されるホスト側フォルダを作成して移動
mkdir c:\project
cd c:\project
#仮想環境追加
vagrant box add [title] [virtual machine image url]
#仮想環境にcentosという名前を付け、CentOS6.3 64bitのサーバを作成する場合の例
vagrant box add centos https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
#仮想環境の設定ファイルを自動作成
vagrant init centos
#仮想環境を起動!
vagrant up
これで仮想環境が起動します。
ここまで確認したら、
vagrant halt
で、一旦仮想環境を停止しておきます。
Vagrantfileのせってー
先ほどvagrant upを実行したフォルダにはVagrantfileが出来上がっています。
仮想マシンの動作環境などを事細かく記載する設定ファイルですが、ここでIPを指定して起動するよう変更しておきます。
#下記行のコメントを外す
config.vm.network :private_network, ip: "192.168.33.10"
まずはChefによる連携等を行うだけであれば、これだけの設定でOKでしょう。
コマンドプロンプトからvagrant upで再度、仮想環境を起動します。
Chefの厨房さくせい
Chefの世界ではリポジトリとかキッチンとか呼ばれるものを作成します。
コマンドプロンプトで、作成したprojectフォルダに移動し、knife soloを実行します。
knife solo prepare vagrant@192.168.33.10
パスワードを求められればvagrantでOKです。
Cygwinを入れてる環境では以下のようなエラーが発生するかもしれません。
Bootstrapping Chef...
ERROR: ArgumentError: non-absolute home (ArgumentError)
その場合は、下記のようにHOMEを空にするとうまく行くと思います。
たんめん日記さんの記事を参考にしました。
set HOME=
キッチンできたし、レシピ作るよー
projectフォルダ内にて狂ったようにナイフを振るいます。
なぜ、キッチンでナイフを振り回したらレシピが作られるのか、風景を想像するとかなり謎ですが細かいことは気にせずコマンドを打つべし。
#cookbooksフォルダにcookbookを作成
knife cookbook create myrecipe -o cookbooks
これでc:\project\chef-repo\cookbooks\myrecipe\recipes\default.rbというレシピファイルができるはずです。
このファイルに、Chefに実行させたい内容を書いていく事になります。
レシピ書くぜー
出来上がった上記レシピに実際に処理を書いてみます。
いきなりですが、httpサーバをインストールさせたいと思います。
下記の内容をc:\project\chef-repo\cookbooks\myrecipe\recipes\default.rbに追記します。
package "httpd" do
action :install
end
Chefにレシピ読まそう!
このままでは、まだChefは作ったレシピを読めません。nodeのjsonファイルとVagrantfileを変更して、Chefがmyrecipeを読み込むよう設定します。
まずはVagrantfile。
config.vm.provision :chef_solo do |chef|
# cookbookのありか。Vagrantfileからの相対パス
chef.cookbooks_path = "./chef-repo/cookbooks"
# 使用するrecipeの名前
chef.add_recipe "myrecipe"
end
次にc:\project\chef-repo\nodes\192.168.33.10.jsonを編集。
{"run_list":[" recipe [ myrecipe ]"]}
さぁ、料理の時間ですよ!
ここまでくれば、あとは仮想環境を再起動してやればChefがレシピに従って、httpdをインストールしてくれます。
#仮想環境の停止
vagrant halt
#仮想環境の起動
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
[default] -- /tmp/vagrant-chef-1/chef-solo-1/cookbooks
[default] Running provisioner: chef_solo...
Generating chef JSON and uploading...
Running chef-solo...
[2013-06-08T17:20:06+00:00] INFO: *** Chef 11.4.4 ***
[2013-06-08T17:20:06+00:00] INFO: Setting the run_list to ["recipe[myrecipe]"] from JSON
[2013-06-08T17:20:06+00:00] INFO: Run List is [recipe[myrecipe]]
[2013-06-08T17:20:06+00:00] INFO: Run List expands to [myrecipe]
[2013-06-08T17:20:06+00:00] INFO: Starting Chef Run for localhost
[2013-06-08T17:20:06+00:00] INFO: Running start handlers
[2013-06-08T17:20:06+00:00] INFO: Start handlers complete.
[2013-06-08T17:20:06+00:00] INFO: Processing package[httpd] action install (myrecipe::default line 9)
[2013-06-08T17:20:26+00:00] INFO: package[httpd] installing httpd-2.2.15-28.el6.centos from updates repository
[2013-06-08T17:20:36+00:00] INFO: Chef Run complete in 29.548068181 seconds
[2013-06-08T17:20:36+00:00] INFO: Running report handlers
[2013-06-08T17:20:36+00:00] INFO: Report handlers complete
めでたく、自動でhttpサーバがインストールされました!
レシピはインストールだけでなく、サービス登録やファイル、ディレクトリの作成はもちろん、configファイルの自動設定なども盛り込むことができます。
気が向いたらそれらも記事にします。
参考文献
入門Chef Solo – Infrastructure as Code
Windows7上で Vagrant + Chef solo + knife-soloを使い、Ubuntu + ubuntu-desktopの環境を構築してみた