ページ ツリー

比較バージョン

キー

  • この行は追加されました。
  • この行は削除されました。
  • 書式設定が変更されました。

...

Section
Column

ResourceType

Resource の型を表します。
yum パッケージの状態を定義する yum_package Resource、任意のコマンドの実行状態を定義する 、任意のコマンドの実行状態を定義する execute Resource  などがあります。

ResourceType によって、指定できる Attribute や Action は異なります。
詳細は各 ResourceType の公式ドキュメントに記載されているので、確認するようにしてください。

Name

Resource の名前を定義します。
公式ドキュメントを見るとわかりますが、yum公式ドキュメントを見るとわかりますが、yum_package では Resource の名前がそのまま package_name Attribute になる仕様になっています。

Attribute

Resource の "あるべき状態" について、詳細に定義します。
yum_package であれば version などを指定できます。 

Action

Resource の適用のされ方を定義します。
yum_package であれば、インストールされている状態(:install)、アンインストールされている状態(:remove)などを指定できます。 

Column

ヒント

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_blocklazy を使います。

 

冪等性を確保する

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

 

冪等性を確保するには、notでは Resource の収束結果は何度実行しても常に同じでなければいけません。
yum_package などであれば、何も考えなくとも冪等性が確保されるのですが、
execute や bashruby_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 を書く手順 

...