ページ ツリー

比較バージョン

キー

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

...

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

コード ブロック
resource "name" do
  attributeA "valueA"
  attributeB "valueB"
  action :action
end

...

ここでは Chef 標準の bash Resource をベースに、cwd attribute Attribute に実行時のディレクトリを、code attribute Attribute に実行するスクリプトを指定し、
Action には Resource の実行時にスクリプトが実行されるように :run を指定
や code  を指定していて、
これらの指定を行った Resource に 'extract tar file' という name を付けの :run という Action を呼び出すように定義していて、“cwd” や ”code” という Attribute により Action 実行時のパラメータを指定しています。 という Name をつけています。


指定できる Action や Attribute は Resource ごとに異なるので、Chef のドキュメントを確認してください。ごとに異なるので、Resource のドキュメントを逐一確認するようにしてください。
bash Resource であれば http://docs.opscode.com/resource_bash.html ] です。

Resource の実行順序

Recipe は基本的に上から順に、記述した順で Resource が実行されます。ここ です。

ヒント

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

 

Resource の実行順序

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

コード ブロック
remote_file '/tmp/archive.tar.gz”gz' do
  source “http'http://path/to/archive.tar.gz”gz'
  action :create
end

bash “extract'extract tar file”file' do
  cwd '/tmp”tmp'
  code “tar'tar zxf archive.tar.gz”gz'
  action :run
end
ヒント

notifies を利用して、Resource などを利用して、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 を書く手順 

具体的に何をしたいのかを明らかにする

例えば、「あるアプリケーションのコマンドにパスを通したい」場合は、具体的にどのような方法でパスを通すかを決めておきます。
.bashrc に追記してもいいですし、/etc/profile.d/ にスクリプトを置いても実現可能ですが、それぞれ細かい条件が異なりますよね。
.bashrc に書く場合は、どのユーザーを対象とするかを決めなければいけませんし、既に .bashrc に記述されている内容を壊さないようにしないといけません。
/etc/profile.d/ にスクリプトを置く場合は、スクリプトファイル名を決めなければいけませんし、すべてのユーザーにパスを通して問題ないか確認が必要です。
今回は、/etc/profile.d/application.sh に「export PATH=$PATH:/opt/application/bin」という内容のファイルを置くことにします。 

...