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

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

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

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

 

基本的な用語

Chef でのプロビジョニングを行うには、まず Resource、Recipe、Cookbook という単語をおさえておきましょう。
これは、Chef を使うにあたって最低限作らなければいけないものです。 

 

Resource

Resource はプロビジョニング先の "ある部分" の "あるべき状態" を宣言的に定義する DSL です。
各 Resource にはユニークな名前を指定する必要があり、それがプロビジョニング先の ”どの部分か” を表しています。
そして、Resource の do ~ end ブロックに ”あるべき状態” を定義します。(ResourceType によって定義できる内容は異なります。)

Chef でのプロビジョニングは、Resource があるべき状態に収束されることを意味します。

Recipe

Recipe は Resource を記述するためのファイルです。
Ruby のコードをそのまま使って Resource を定義できます。 

Recipe に定義した Resource はプロビジョニングの実行時に解釈され、収束するべき Resource がキューイングされます。 
基本的に、Resource は Recipe に定義した順でキューイングされます。
Recipe に書いた Ruby コードは Resource が収束されるときでなく、キューイングされるときに実行されることに注意してください。 

Cookbook

Cookbook は Recipe を意味のある単位で取りまとめたものです。
Cookbook は複数の環境で使いまわすことができ、たいていの場合はインストールするアプリケーションやサービス単位で作成されます。 

Cookbook も名前で管理されるので、ユニークで、かつ内容を表す名前をつけましょう。

 

 

Cookbook をつくる

Cookbook のひな形の生成

まずは Cookbook を作成しましょう。 

ChefDK の chef generate cookbook コマンドを使えば簡単に Cookbook のひな形を生成できます。

$ cd workspace
$ chef generate cookbook <Cookbook 名>


chef generate cookbook コマンドで生成されるもので、重要なファイル
  • .kitchen.yml
    Kitchen の設定ファイル
    テスト用のインスタンスや実行するプロビジョニングの設定を記述

  • Berksfile
    Berkshelf の設定ファイル
    Kitchen でプロビジョニングを行うときの依存する Cookbook を記述

  • README.md
    Cookbook の説明書
     
  • metadata.rb
    Cookbook の基本情報を記述

  • recipes/default.rb
    デフォルトで実行する Recipe

 

Cookbook を Eclipse で編集しよう

Eclipse のプロジェクトファイル ".project" をつくっておけば、Cookbook を Eclipse プロジェクトとして開けます。
ツリービューとタブエディタ(だけ)は便利なので、 他によいエディタがない場合は、次の手順で Eclipse プロジェクトをインポートしましょう。

.project を生成

スクリプトを実行し .project を生成します。

$ cd <Cookbook 名>
$ gen-eclipse

"gen-eclipse" は開発環境の ~/bin/gen-eclipse に置いてある .project 生成用のスクリプトです。

 

プロジェクトをインポート

Eclipse を起動し、プロジェクトをインポートします。

123

File -> Import...

General -> Existing Projects into Workspace

 Next

「/home/vagrant/workspace/<Cookbook 名>」を追加

Finish 

 

Package Explorer に隠しファイルも表示させる

標準では .kitchen.yml が見えないので、次の手順で隠しファイルを表示します。

12

Package Explorer の ▽ を選択 -> Filters…

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



Recipe を書こう

Recipe とは

Chef では、サーバーのあるべき状態を Recipe(ソースコード)として記述します。
Recipe は「ファイルのダウンロード」や「コマンドの実行」など、さまざまな機能をもつ Resource から構成されます。


Resource は Chef 公式のものだけで40種類以上ありますが、基本的な構文はどれも同じで、
次のように、ユニークな Name をもち、1つ以上の Attribute によりパラメータを指定でき、実行時の動作を Action で指定します。

resource "name" do
  attributeA "valueA"
  attributeB "valueB"
  action :action
end

 

次の Recipe は「'/tmp' ディレクトリで、 'tar zxf archive.tar.gz' というスクリプトを、bash で実行する、'extract tar file' という名前の Resource」を定義したものです。

bash 'extract tar file' do
  cwd '/tmp'
  code 'tar zxf archive.tar.gz'
  action :run
end

ここでは Chef 標準の bash Resource をベースに、cwd Attribute に実行時のディレクトリを、code Attribute に実行するスクリプトを指定し、
Action には Resource の実行時にスクリプトが実行されるように :run を指定していて、
これらの指定を行った Resource に 'extract tar file'  という Name をつけています。


指定できる Action や Attribute は Resource ごとに異なるので、Resource のドキュメントを逐一確認するようにしてください。
bash Resource であれば ここ です。

Resource のドキュメントは見つけにくいです。
Chef の公式ドキュメントから辿るよりも、Google で「Opscode bash」などと検索したほうが早く見つけられたりします。
また、Mac であれば Dash に Chef のドキュメントがあるので、これを使うのもいいかもしれません。

 

Resource の実行順序

Recipe は上から順に解釈され、Resource は基本的には Recipe に定義した順で実行されます。
たとえば、「ファイルをダウンロード」してから「ダウンロードしたファイルを解凍」したい場合は、次のように記述できます。 

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 に書いたコードは基本的に Recipe が解釈されるときに実行されます。
Resource が実行されるタイミングでコードを実行したい場合は ruby_blocklazy を使います。

 

冪等性を確保する

Chef では何度 Recipe を実行しても同じ結果になることが望まれています。
これは Chef 標準の package Resource などを使用していれば Resource 側で確保してくれるのですが、
bash Resource などでは自力でがんばって確保するしかありません。 

 

冪等性を確保するには、not_if や only_if を使用して Resource にガード条件を設定します。

 

例えば、特定のファイルが存在しないときだけ Resource を実行するには次のように書きます。

exexute 'install peco'
  command 'cp /tmp/peco_linux_amd64/peco /usr/local/bin/peco'
  not_if { File.exists?('/usr/local/bin/peco') }
end

この例では、Resource が実行される直前に not_if ブロックの Ruby コードが実行され、結果が false のときだけ Resource が実行されます。
逆に結果が true のときだけ Resource が実行されるようにしたい場合は only_if を使います。

 

また、Ruby のブロックでなく、文字列を直接わたすこともできます。

exexute 'install peco'
  command 'cp /tmp/peco_linux_amd64/peco /usr/local/bin/peco'
  not_if "test -e '/usr/local/bin/peco'"
end

この場合は not_if にわたした文字列がシェルスクリプトとして実行され、実行結果が 0 以外のときだけ Resource が実行されます。
さきほどと同じように、結果が 0 のときだけ Resource が実行されるようにするには only_if を使います。 

 

Recipe を書く手順 

  1. 具体的に何をしたいのかを明らかにする
  2. 使えそうな Resource をさがす
  3. 実際に Recipe を書く

はじめは、目的に対して適切な Resource をさがせることがいちばん大事です。

Google で検索してもいいですし、Dash を使ってもいいですし、Chef実践入門Chef活用ガイド のような書籍を利用するのも手です。


実際に作ってみる

ここまでの手順がなんとなくわかったら、次は実際に Cookbook を作ってみます。

次のページ に進んでください。


  • ラベルがありません