ページ ツリー
メタデータの末尾にスキップ
メタデータの先頭に移動

このページの古いバージョンを表示しています。現在のバージョンを表示します。

現在のバージョンとの相違点 ページ履歴を表示

« 前のバージョン バージョン 19 次のバージョン »

Cookbook

Cookbook とは

Chef の Recipe(ソースコード)をとりまとめたものです。
Cookbook は Recipe を共有する際に配布する単位であり、ひとつの Cookbook ごとにそれぞれの GIt リポジトリを持ちます。
一般的に、ひとつのアプリケーションやサービスに対し、ひとつの 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 を生成する自作スクリプトです。

手動で作成する場合は、以下のような内容となります。

.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 の ▽ を選択 -> Filters…


 「.*resources」のチェックを外す
OK

 

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です。 

./resource/default.rb
file “/etc/profile.d/application.sh” do
  content “export PATH=$PATH:/opt/application/bin”
  action :create_if_missing
end

 

お題: Jenkins の Cookbook をつくる 

では、ここまでの話を踏まえて、実際に Cookbook を作ってみてください。
作成するのは Jenkins をインストールする Cookbook です。 

Jenkins とは

 

手動でインストールするときの手順

 

  1. http://pkg.jenkins-ci.org/redhat/ から rpm をダウンロード

  2. ダウンロードした rpm を yum コマンドでインストール

  3. /etc/sysconfig/jenkins を編集して、実行ユーザーを変更

  4. 利用するディレクトリのオーナーを変更

  5. サービスを登録・起動

 

ヒント: 主な Resource

コマンドを実行する 

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 ]






  • ラベルがありません