他のクックブック内のレシピを利用する
サードパーティクックブックを利用する前に、まずは他のクックブックを呼び出す方法について紹介します。
Chefでは各レシピを include_recipe
で呼び出し合うことが出来ます。
例えば sample クックブックのレシピ内で、resource-sample クックブックの default レシピが欲しい場合は以下のように記述します。
depends 'resource-sample'
include_recipe 'resource-sample::default'
同一のchef-repoに含まれるクックブックについてはmetadata.rb
の記述は必要ありませんが、意識して依存性を記述したほうがよいでしょう。
また、defaultレシピを使う場合は include_recipe 'resource-sample'
と省略することも出来ます。
レシピが重複してもいいの?
上記のようにsample2からsampleを利用した状態で、両方のレシピをrun_listに含めることが出来ます。この場合はどのような挙動になるでしょうか。
sample::defaultが重複するように思えますが、実際の実行結果は二重に実行することはありません。重複するものは同じリソース定義なので、Chefの実行時に一つのリソース定義とみなしています。
サードパーティのクックブックを利用する
同様の手段でサードパーティのクックブックをインターネットから取得して利用することが出来ます。
クックブックの管理するツールにはいくつかありますが、ここではBerkshelfを利用します。
まず、第一回のknife solo init
コマンドでchef-repoを作成した際に、既に生成されている Berksfile
を編集します。
source 'https://supermarket.getchef.com'
cookbook 'java', '~> 1.27.0'
タイミングによって source
の部分のURLが違うかもしれません。旧URLでも利用可能なようですが、Berkshelf公式サイトでも書き換わっているため、随時修正するのがよいでしょう。
上記ではjavaクックブックを指定しました。まずはこのクックブックをダウンロードしてみましょう。
$ berks vendor cookbooks
$ ls cookbooks/
cookbooks/ 以下に java クックブックがダウンロードされます。これで利用可能になります。sample3クックブックを作って呼び出してみましょう。
$ knife cookbook create sample3 -o site-cookbooks
depends 'java'
include_recipe 'java::default'
{
"run_list": [
"recipe[sample1]",
"recipe[sample2]",
"recipe[sample3]"
]
}
knife solo cook vagrant
を実行すると、javaがインストールされます。特に指定がない場合、openjdk-6-javaがインストールされるはずです。
(TODO: java -version, echo $JAVA_HOMEの結果)
しかし、Java6は既にObsolateですし、OpenJDKじゃなくてOracle Javaが使いたい、という場合はあるでしょう。その時はクックブックに予め設定されている属性(attribute)を書き換えてあげます。
default[:java][:jdk_version] = '8'
default[:java][:install_flavor] = 'oracle'
default[:java][:oracle][:accept_oracle_download_terms] = true
再度実行してみると、Javaのバージョンなどが更新されます。
ついでに、JAVA_HOMEなどの環境変数もきちんと更新されます。
(TODO: java -version, echo $JAVA_HOME)
run_listに直接書いてはいけないの?
sample3クックブックで