Cookbook
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
/home/vagrant/workspace/<Cookbook 名>
パッケージエクスプローラーに隠しファイルも表示させる
Package Explorer の ▽ を選択 -> Filters…
「.*resources」のチェックを外す
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 や 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
Recipe を書く手順
Recipe を書くにはまず、「具体的に何をしたいのか」を明らかにし、それに対し「どの Resource を使用するか」を決めなければなりません。
そうしてからようやく具体的なソースコードを記述できます。
たとえば、あるアプリケーションのコマンドにパスを通すために、/etc/profile.d/application.sh に 「export PATH=$PATH:/opt/application/bin」 という内容のファイルを配置したいとします。
これはどの Resource を使えば実現できるでしょうか。
Chef のドキュメントを調べると、file Resource というのが見つかります。
これは、任意の内容のテキストファイルを任意のパスに配置する Resource のようです。
使えそうですね。
では、file Resource の詳細を確認しましょう。
Chef のドキュメント [ http://docs.opscode.com/resource_file.html ] を参照すると、次のようなシンタックスになっていることが確認できます。
file <配置先のファイルパス> do content <配置するファイルの内容> end
充分に理解できたら、いよいよ具体的なソースコードを実装します。
file “/etc/profile.d/application.sh” do content “export PATH=$PATH:/opt/application/bin” end
これで完成です。
このように Recipe を書くには、
具体的に何をしたいのかを明らかにする
使えそうな Resource を探し、仕様を確認する
Recipe を記述する
という手順を繰り返していきます。
お題: Jenkins の Cookbook をつくる
Jenkins とは
手動でインストールするときの手順
Jenkins をインストールする Recipe をつくる
まずは、手動で Jenkins をインストールする場合の手順を確認します。
http://pkg.jenkins-ci.org/redhat/ から rpm をダウンロード
ダウンロードした rpm を yum コマンドでインストール
/etc/sysconfig/jenkins を編集して、実行ユーザーを変更
利用するディレクトリのオーナーを変更
サービスを登録・起動
これを Recipe にしてみましょう。
デフォルトの Recipe なので、chef generate cookbook で生成された recipes/default.rb を編集します。
ヒント
コマンドを実行する
execute Resource [ http://docs.opscode.com/resource_execute.html ]
ファイルをダウンロードする
remote_file Resource [ http://docs.opscode.com/resource_remote_file.html ]
※ ダウンロードしたファイルなどは /tmp ではなく Chef::Config[:file_cache_path] に保存する
パッケージをインストールする
package Resource [ http://docs.opscode.com/resource_package.html ]
テキストファイルの内容を置換する
ruby_block Resource [ http://docs.opscode.com/resource_ruby_block.html ]
Chef::Util::FIleEdit [ http://rubydoc.info/gems/chef/Chef/Util/FileEdit ]
※ execute Resource で sed コマンドを実行してもよい
※ file Resource + lazy でもできるかな?
ファイルやディレクトリのオーナーを変更する
ruby_block Resource [ http://docs.opscode.com/resource_ruby_block.html ]
FileUtils#chown_R [ http://docs.ruby-lang.org/ja/1.9.3/method/FileUtils/m/chown_R.html ]
※ execute Resource で chown コマンドを実行してもよい
サービスを起動する / 自動的に起動するように登録する
service Resource [ http://docs.opscode.com/resource_service.html ]