Cookbook
Cookbook とは
Chef の Recipe(ソースコード)をとりまとめたものです。
一般的に、ひとつのアプリケーションやサービスに対し、ひとつの Cookbook が用意されることが多いです。
ひな形の生成
ChefDK の chef コマンドで Cookbook のひな形を生成します。
$ cd workspace $ chef generate cookbook <Cookbook 名>
- Cookbook 名: jenkins
生成されたもの
コマンドを実行すると、以下のファイルが作成されます。
- .kitchen.yml
Kitchen の設定ファイル
テスト用のインスタンスや実行するプロビジョニングの設定を記述
- Berksfile
Berksfile の設定ファイル
Kitchen でプロビジョニングを行うときの依存する Cookbook を記述
- README.md
Cookbook の説明書
- chefignore
ChefClient に転送しないファイルを定義
- metadata.rb
Cookbook の基本情報を記述
- recipes/default.rb
Cookbook がデフォルトで実行する Redipe
Eclipse プロジェクトに変換
.project 生成スクリプトを実行
スクリプトを実行し .project を生成します。
$ cd <Cookbook 名> $ gen-eclipse
Eclipse で .project をインポートします。
gen-eclipse は、.project を生成する自作スクリプトです。
手動で作成する場合は、以下のような内容となります。
<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>${cookbook_name}</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>org.eclipse.dltk.core.scriptbuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.dltk.ruby.core.nature</nature> </natures> </projectDescription>
Eclipse でプロジェクトをインポート
次の手順でプロジェクトをインポートします。
File -> Import...
General -> Existing Projects into Workspace
Next
「/home/vagrant/workspace/<Cookbook 名>」を追加
Finish
Package Explorer に隠しファイルも表示させる
次の手順で隠しファイルを表示します。
Package Explorer の ▽ を選択 -> Filters…
Recipe
Recipe とは
Chef では、サーバーのあるべき状態を Recipe(ソースコード)として記述します。
Recipe は「ファイルのダウンロード」や「コマンドの実行」など、さまざまな機能をもつ Resource で構成されています。
たとえば、 以下の Recipe は 「bash により “/tmp” ディレクトリで “tar zxf archive.tar.gz” というスクリプトを実行する “extract tar file” という名前の Resource」 を定義したものです。
bash “extract tar file” do cwd “/tmp” code “tar zxf archive.tar.gz” action :run end
ここでは Chef 標準の “bash” という Resource の :run という Action を呼び出すように定義していて、“cwd” や ”code” という Attribute により Action 実行時のパラメータを指定しています。
指定できる Action や Attribute は Resource ごとに異なるので、Chef のドキュメントを確認してください。
bash Resource であれば [ http://docs.opscode.com/resource_bash.html ] です。
Resource の実行順序
Recipe は基本的に上から順に、記述した順で Resource が実行されます。
たとえば、「ファイルをダウンロード」してから「ダウンロードしたファイルを解凍」したい場合は、次のように記述できます。
remote_file “/tmp/archive.tar.gz” do source “http://path/to/archive.tar.gz” action :create end bash “extract tar file” do cwd “/tmp” code “tar zxf archive.tar.gz” action :run end
notifies を利用して、Resource の実行順序を制御することも可能です。
Recipe を書く手順
具体的に何をしたいのかを明らかにする
例えば、「あるアプリケーションのコマンドにパスを通したい」場合は、具体的にどのような方法でパスを通すかを決めておきます。
.bashrc に追記してもいいですし、/etc/profile.d/ にスクリプトを置いても実現可能ですが、それぞれ細かい条件が異なりますよね。
.bashrc に書く場合は、どのユーザーを対象とするかを決めなければいけませんし、既に .bashrc に記述されている内容を壊さないようにしないといけません。
/etc/profile.d/ にスクリプトを置く場合は、スクリプトファイル名を決めなければいけませんし、すべてのユーザーにパスを通して問題ないか確認が必要です。
今回は、/etc/profile.d/application.sh に「export PATH=$PATH:/opt/application/bin」という内容のファイルを置くことにします。
使えそうな Resource を探し、仕様を確認する
/etc/profile.d/ にスクリプトを置くとします。これはどの Resource を使えば実現できるでしょうか。
Chef のドキュメント [ http://docs.opscode.com/chef/resources.html ] を見て、使えそうな Resource を探しましょう。
「Chef 実践入門」や「Chef 活用ガイド」といった書籍を利用するのも手です。
/etc/profile.d/ にスクリプトファイルを置く場合は、たとえば次のような手段があります。
- bash Resource で、「export PATH ~」という内容のテキストファイルを出力するスクリプトを実行する
- ruby_block Resource で、〃
- template Resource で、「export PATH ~」という内容のテキストファイルを配置する
- file Resource で、「export PATH ~」という内容のテキストファイルを配置する
各 Resource の詳細はドキュメントを参照して確認してください。
bash Resource や ruby_block Resource でも問題なく実現できますが、「もし既にファイルが存在していたら Resource の実行をスキップする」という処理を書くのが少々面倒です。
template Resource や file Resource には :create_if_missing という Action があり、対象のファイルが存在ないときにだけ Resource を実行させることができます。
template Resource は配置するファイルの内容を動的に制御する機能を備えていますが、 今回配置したいスクリプトファイルは完全に固定のものなので、そこまでの機能は不要です。
なので、file Resource を使うのが適しているでしょう。
Recipe を記述する
使用する Resource が決まったら、ドキュメントを確認しながら ./recipes/default.rb に Recipe を記述します。
default.rb はその Cookbook が標準的に実行する Recipe で、一般的なプログラミングでいうメインメソッドのようなものです。
file Resource のドキュメント [ http://docs.opscode.com/resource_file.html ] を確認すると、name にファイルパスを、content Attribute にファイルの内容を指定することがわかりますので、
その仕様に従って Recipe を記述すればOKです。
file “/etc/profile.d/application.sh” do content “export PATH=$PATH:/opt/application/bin” action :create_if_missing end