...
Section |
---|
Column |
---|
ResourceResource はプロビジョニング先の "ある部分" の "あるべき状態" を宣言的に定義する を宣言的に記述する DSL です。 各 Resource にはユニークな名前を指定する必要があり、それがプロビジョニング先の ”どの部分か” を表しています。 そして、Resource の do ~ end ブロックに ”あるべき状態” を定義します。(ResourceType によって定義できる内容は異なります。)Chef でのプロビジョニングは、Resource があるべき状態に収束されることを意味します。 RecipeRecipe は Resource を記述するためのファイルです。 Ruby のコードをそのまま使って Resource を定義できます。 Recipe プロビジョニングを実行すると、Recipe がコンパイルされ、Recipe に定義した Resource はプロビジョニングの実行時に解釈され、収束するべき が Resource がキューイングされます。 基本的に、Resource は Recipe に定義した順でキューイングされます。 Recipe に書いた Ruby コードは Resource が収束されるときでなく、キューイングされるときに実行されることに注意してください。 Collection に登録されます。 Resource の収束は、基本的には Resource Collection に登録された順で行われます。 CookbookCookbook は Recipe を意味のある単位で取りまとめたものです。 Cookbook は複数の環境で使いまわすことができ、たいていの場合はインストールするアプリケーションやサービス単位で作成されます。 Cookbook も名前で管理されるので、ユニークで、かつ内容を表す名前をつけましょう。 |
Column |
---|
Drawio |
---|
| |
---|
diagramName | chef 用語.drawio |
---|
revision | 1 |
---|
|
|
|
Cookbook をつくる
Cookbook のひな形の生成
...
情報 |
---|
Cookbook のディレクトリ構成 パス | 概要 |
---|
recipes/ | Cookbook の Recipe を置きます。 | attributes/ | Recipe で Attribute を使う場合、ここにデフォルト値を定義するファイルを置きます。 | templates/ | Template を使う場合、ここに eRuby ファイルを置きます。 | files/ | File を使う場合、ここにファイルを置きます。 | resources/ | LWRP を使う場合、ここに lightweight resource を置きます。 | providers/ | LWRP を使う場合、ここに lightweight provider を置きます。 | metadata.rb | Cookbook の名前やバージョン、依存関係などの情報を記述します。 | Berksfile | Berkshelf の設定ファイルです。 Kitchen でテストをするときに依存する Cookbook を定義します。 | README.md | Cookbook の README を記述します。 | .kitchen.yml | Kitchen の設定ファイルです。 Cookbook のテスト環境を定義します。 |
|
...
chef generate cookbook コマンドを実行すると、./recipes/default.rb というファイルができていると思います。
それが Cookbook がデフォルトで適用する Recipe です。
特別な理由がない限りは default.rb に基本となる 基本的には、このファイルに Recipe を書いていきます。
ヒント |
---|
default Recipe 以外の Recipe は chef generate recipe コマンドで追加できます。 コード ブロック |
---|
$ chef generate recipe <Cookbook のパス> <Recipe の名前> |
|
...
Recipe には Resource を定義していきます。
Resource とは、プロビジョニング先の ”ある部分” の ”あるべき状態” を宣言的に定義したもので、具体的には以下の要素で構成されます。を宣言する DSL で、具体的には以下の要素で構成されます。
Section |
---|
Column |
---|
ResourceTypeResource の型を表します。 yum パッケージの状態を定義する yum_package Resource、任意のコマンドの実行状態を定義する 、任意のコマンドの実行状態を定義する execute Resource などがあります。 ResourceType によって、指定できる Attribute や Action は異なります。 詳細は各 ResourceType の公式ドキュメントに記載されているので、確認するようにしてください。 NameResource の名前を定義します。 公式ドキュメントを見るとわかりますが、yum_package では Resource の名前がそのまま package_name Attribute になる仕様になっています。の名前です。 ユニークな名前を指定します。 AttributeResource の "あるべき状態" について、詳細に定義します。 の属性です。 Resource がどのような状態であるべきか、詳細な情報を指定します。 yum_package であれば であれば package_name や version などを指定できます。 yum_package では Resource の Name がそのまま package_name に指定される仕様になっています。 ActionResource の適用のされ方を定義します。の収束のされ方です。 yum_package であれば、インストールされている状態(:install)、アンインストールされている状態(:remove)などを指定できます。 |
Column |
---|
Drawio |
---|
| |
---|
diagramName | yum_package.drawio |
---|
revision | 1 |
---|
|
|
|
ヒント |
---|
ResourceType についての公式ドキュメントは Chef の公式ドキュメントから辿ると非常に見つけにくいです。 Google で「Opscode <ResourceType 名>」などと検索したほうが早く見つけられたりします。 また、Mac であれば Dash に Chef のドキュメントがあるので、これを使うのもオススメです。 Column |
---|
|
Resource の実行順序
Recipe は上から順に解釈され、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 が解釈されるときに実行されます。がコンパイルされるときに実行されます。 Resource が実行されるタイミングでコードを実行したい場合は が収束されるタイミングでコードを実行したい場合は ruby_block や lazy を使います。 |
冪等性を確保する
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 を書く手順
...