目次 |
---|
...
...
基本的な用語
Chef の Recipe(ソースコード)をとりまとめたものです。
一般的に、ひとつのアプリケーションやサービスに対し、ひとつの Cookbook が用意されることが多いです。
ひな形の生成
ChefDK の chef コマンドで Cookbook のひな形を生成します。でのプロビジョニングを行うには、まず Resource、Recipe、Cookbook という単語をおさえておきましょう。
これは、Chef を使うにあたって最低限作らなければいけないものです。
Section | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Cookbook をつくる
Cookbook のひな形の生成
まずは Cookbook を作成しましょう。
ChefDK の chef generate cookbook コマンドを使えば簡単に Cookbook のひな形を生成できます。
コード ブロック |
---|
$ cd workspace $ chef generate cookbook <Cookbook 名> |
...
情報 |
---|
...
Cookbook のディレクトリ構成 |
コマンドを実行すると、以下のファイルが作成されます。
...
...
|
...
Eclipse プロジェクトに変換
Cookbook を編集するうえで、Eclipse が特に有利になる点は、実はありません。
2014/06 時点で RHEL 系の日本語環境で比較的マシに利用できるのが Eclipse しかなかっただけです。
好みのエディタで編集してください。(おすすめあれば教えてください)
...
Cookbook を Eclipse で編集しよう
Eclipse のプロジェクトファイル ".project" をつくっておけば、Cookbook を Eclipse プロジェクトとして開けます。
ツリービューとタブエディタ(だけ)は便利なので、 他によいエディタがない場合は、次の手順で Eclipse プロジェクトをインポートしましょう。
.project を生成
スクリプトを実行し .project を生成します。
コード ブロック |
---|
$ cd <Cookbook 名> $ gen-eclipse |
ヒントnote | ||
---|---|---|
"gen-eclipse は、.project を生成する自作スクリプトです。 手動で作成する場合、.project は以下のような内容です。 コード ブロック | | |
|
プロジェクトをインポート
Eclipse を起動し、次の手順でプロジェクトをインポートします。を起動し、プロジェクトをインポートします。
1 |
---|
...
2 |
---|
...
3 |
---|
...
File -> Import... |
General -> Existing Projects into Workspace Next |
「/home/vagrant/workspace/<Cookbook 名>」を追加 Finish |
Package Explorer に隠しファイルも表示させる
標準では .kitchen.yml が見えないので、次の手順で隠しファイルを表示します。
1 |
---|
...
2 |
---|
...
width | 400px |
---|
Package Explorer の ▽ を選択 -> Filters… |
...
「.*resources」のチェックを外す OK |
...
Recipe を書く
default 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 のドキュメントは見つけにくいです。 |
Resource の実行順序
Recipe は上から順に解釈され、Resource は基本的には Recipe に定義した順で実行されます。
たとえば、「ファイルをダウンロード」してから「ダウンロードしたファイルを解凍」したい場合は、次のように記述できます。chef generate cookbook コマンドを実行すると、./recipes/default.rb というファイルができていると思います。
それが Cookbook がデフォルトで適用する Recipe です。
基本的には、このファイルに Recipe を書いていきます。
ヒント | ||
---|---|---|
default Recipe 以外の Recipe は chef generate recipe コマンドで追加できます。
|
Resource の要素
Recipe には Resource を定義していきます。
Resource とは、プロビジョニング先の ”ある部分” の ”あるべき状態” を宣言する DSL で、具体的には以下の要素で構成されます。
Section | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
ヒント |
---|
ResourceType についての公式ドキュメントは Chef の公式ドキュメントから辿ると非常に見つけにくいです。 |
Resource の実行順序
Recipe は上から順にコンパイルされ、Resource Collection に格納されます。
基本的には Resource Collection に格納された順で 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 に書いたコードは基本的に に書いたコードは Recipe が解釈されるときに実行されます。がコンパイルされるときに実行されます。 |
冪等性を確保する
Chef では何度 Recipe を実行しても同じ結果になることが望まれています。
これは Chef 標準の package Resource などを使用していれば Resource 側で確保してくれるのですが、
bash Resource などでは自力でがんばって確保するしかありません。
冪等性を確保するには、notでは Resource の収束結果は何度実行しても常に同じでなければいけません。
yum_package などであれば、何も考えなくとも冪等性が確保されるのですが、
execute や bash、ruby_block などではサーバーにどのような変更が行われるのか Chef が判断できないので、
自力で冪等性を確保する必要があります。
冪等性を確保するためのひとつの手段として、ガード条件 があります。
これは、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 のブロックでなく、文字列を直接わたすこともできます。
...
この場合は not_if にわたした文字列がシェルスクリプトとして実行され、実行結果が 0 以外のときだけ Resource が実行されます。が収束されます。
さきほどと同じように、結果が 0 のときだけ Resource が実行されるようにするには が収束されるようにするには only_if を使います。
Recipe を書く手順
- 具体的に何をしたいのかを明らかにする
- 使えそうな Resource をさがす
- 実際に Recipe を書く
はじめは、目的に対して適切な Resource をさがせることがいちばん大事です。
Google で検索してもいいですし、Dash で検索してもいいですし、Dash を使ってもいいですし、Chef実践入門 や Chef活用ガイド のような書籍を利用するのも手です。
実際に作ってみる
ここまでの手順がなんとなくわかったら、次は実際に Cookbook を作ってみます。
次のページ に進んでください。