Chef clientとWindows向け便利コマンドのインストールをする

Chef、流行っていますね。僕も最近の流れを受けて始めたばかりのにわかChef使いなのですが、例によってWindowsでChefを動かすのは結構大変です。
今回はChef clientのインストールをするとともに、Chefを開発しているopscodeの提供しているrecipeを使ってWindows向けの便利なコードを使えるようにしたいと思います。

#なお、gemを使ってインストールする方法もありますが、今回はインストーラー(msi)を使います。

Chef clientのインストール

0. gitがインストールされていない場合はmsgitなどを使ってインストールしておいてください。

1. こちらのページのStep2にあるリンクからChefのインストーラーをダウンロードし、実行してください。
インストール後にコンソールでchef-soloなどのバージョンが表示されればOKです。

> chef-solo --version
Chef: 0.10.8

2. 続いてChefのrecipeなどを管理するリポジトリを作ります。opscodeがリポジトリの雛形を公開していますので
それをクローンして使います。

> C:
> cd \
> git clone git://github.com/opscode/chef-repo.git

cloneで作られたchef-repoというディレクトリがchefのリポジトリになります。opscodeのドキュメントでは
このディレクトリをバージョン管理することが推奨されています。

3. chefの設定ファイルとその管理用ディレクトリを作ります。

> mkdir chef-repo\.chef
> cd chef-repo\.chef
> echo >> solo.rb
> notepad.exe solo.rb

solo.rbにはchef-solo用の設定を書きます。
最低限必要なのはcookbookの場所とcacheの場所です。今回は以下のようにしました。

solo.rb

file_cache_path "C://opscode/chef/cache/chef-solo"
cookbook_path "C://chef-repo/cookbooks"

これで一通りのインストールは完了です。

Windows向けの便利コードを使えるようにする

このままでもChefを利用することはできますが、Windowsはパッケージマネージャーがありません。
zipとかmsiとか、どうやって操作すりゃいいのよ…。とお悩みの方はopscodeが公開しているこちらのrecipeを使うと便利です。

1. こちらのrecipeをzip等でダウンロードし、C:\\chef-repo\cookbooksの下に配置します。

2. このrecipeを実行するように設定します。

> cd chef-repo/.chef
> echo >> win_default.json
> notepad.exe win_default.json

win_default.json

{
	"run_list": ["recipe[windows]"]
}

3. recipeを実行します。

> cd ../
> chef-solo -c .chef/solo.rb -j .chef/win_default.json

4. 失敗しましたか?失敗しなかった人はめでたしめでたしですが、僕はものの見事に失敗しました。
registry.rbでエラー、みたいな。どうもコードを見てみると51行目あたりで retry を使っている部分がおかしいようです。
詳しくは「ruby 1.9.2 retry」でぐぐってください。

とりあえずエラーがなければloopを回せばいい(っぽい)ので適当に書き換えました。

registry.rb(line: 46~)

begin
  registry_update(:open)
rescue Exception
  registry_update(:create)
end
redo #retry # start count loop over

5. 再度recipeを実行すると無事にインストールが完了します。次回はインストールしたコマンドを使ってWindowsに
ソフトウェアをインストールしてみます。