2013年7月20日土曜日

Chefのレシピについて、attributeの優先度を実際に試して見ながら調べてみた。

報告が遅れましたが、すごい広島#9に参加してきました。
今回は、Chefを触っていて気になっていた、attributeの優先度について、実際に試して見ながら調べました。

まず、chefのグローバル変数?ともいうべきattribute変数には、15レベルの優先度が設定されています。(参照先
初めは、上書きできる変数がしかも15レベルもあって、無意味じゃないかと思っていましたが、
それなりに理由はあるのです。(理由がないとそもそもそんな機能は実装されない)
それは、Chefのレシピは単独で使われることはまずなく、多くは組み合わせて使われるという事です。
例えば、Apacheのレシピでは、初期値としてポート番号80を設定したとします。
Apache単独で使用する場合はほとんど問題にならないでしょう。
しかし、Tomcatと組み合わせる場合、場合によっていはポート番号がぶつかるので変更する必要があります。
この場合、Apacheのレシピにスポット的にポート番号を上書きします。
又、Chefでは、複数のレシピの組み合わせを、roleという形で纏めることができます。
例えば、Apache+MySQL+PHPのレシピをLAMPというrole名で纏めるとか。
この場合、このroleではApacheのポート番号は81番にする。という形で上書きすることができます。
というように、階層構造になっています。

Chefは優先度の低い物順に

  • Default
  • Force_Default
  • Normal
  • Override
  • Force_Override
  • Automatic

という属性があり、Nodeに設定されるAutomatic属性の値が一番優先度が高い。
つまり、サーバ毎のNodeに設定されたパラメタで上書きされるという事です。

とまぁ理屈ではいまいち分かったような分からないような感じなので、実際にやって見ました。

まずはDefault属性。
このDefault属性は、優先度の低い順に

  • attribute
  • recipe
  • environment
  • role

の順になっています。
では、実際に試してみましょう。
knife cookbook create testでテスト用クックブックを作成。
recipes/default.rbには
Chef::Log.info("Value=#{node['attr_value']}")
と書いておきます。これで、実行した時にattr_valueの値が表示されます。
この値をこれから順次書き換えてゆきます。
attribute/default.rbには、
default["attr_value"]="attr_default"
としておきます。
ではこれを実行してみます。
[root@centos6 ~]# chef-client -o 'recipe[test]'
Starting Chef Client, version 11.4.4
[2013-07-17T07:06:42-04:00] INFO: *** Chef 11.4.4 ***
[2013-07-17T07:06:42-04:00] WARN: unable to detect ip6address
[2013-07-17T07:06:47-04:00] WARN: Run List override has been provided.
[2013-07-17T07:06:47-04:00] WARN: Original Run List: [recipe[service::stop]]
[2013-07-17T07:06:47-04:00] WARN: Overridden Run List: [recipe[test]]
[2013-07-17T07:06:47-04:00] INFO: Run List is [recipe[test]]
[2013-07-17T07:06:47-04:00] INFO: Run List expands to [test]
[2013-07-17T07:06:47-04:00] INFO: Starting Chef Run for centos6.localdomain
[2013-07-17T07:06:47-04:00] INFO: Running start handlers
[2013-07-17T07:06:47-04:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["test"]
[2013-07-17T07:06:47-04:00] INFO: Loading cookbooks [test]
Synchronizing Cookbooks:
  - test
Compiling Cookbooks...
[2013-07-17T07:06:47-04:00] INFO: Value=attr_default
Converging 0 resources
[2013-07-17T07:06:47-04:00] INFO: Chef Run complete in 0.212122418 seconds
[2013-07-17T07:06:47-04:00] INFO: Running report handlers
[2013-07-17T07:06:47-04:00] INFO: Report handlers complete
Chef Client finished, 0 resources updated
ちゃんと出ていますね。
ではこれをrecipeで上書きしてみましょう。
/recipes/default.rbに以下を追記します。
node.default["attr_value"]="recipe"
これで実行してみます。
[root@centos6 ~]# chef-client -o 'recipe[test]'
Starting Chef Client, version 11.4.4
[2013-07-17T07:06:58-04:00] INFO: *** Chef 11.4.4 ***
[2013-07-17T07:06:58-04:00] WARN: unable to detect ip6address
[2013-07-17T07:06:58-04:00] WARN: Run List override has been provided.
[2013-07-17T07:06:58-04:00] WARN: Original Run List: [recipe[service::stop]]
[2013-07-17T07:06:58-04:00] WARN: Overridden Run List: [recipe[test]]
[2013-07-17T07:06:58-04:00] INFO: Run List is [recipe[test]]
[2013-07-17T07:06:58-04:00] INFO: Run List expands to [test]
[2013-07-17T07:06:58-04:00] INFO: Starting Chef Run for centos6.localdomain
[2013-07-17T07:06:58-04:00] INFO: Running start handlers
[2013-07-17T07:06:58-04:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["test"]
[2013-07-17T07:06:58-04:00] INFO: Loading cookbooks [test]
Synchronizing Cookbooks:
  - test
Compiling Cookbooks...
[2013-07-17T07:06:58-04:00] INFO: Value=recipe
Converging 0 resources
[2013-07-17T07:06:59-04:00] INFO: Chef Run complete in 0.183293861 seconds
[2013-07-17T07:06:59-04:00] INFO: Running report handlers
[2013-07-17T07:06:59-04:00] INFO: Report handlers complete
Chef Client finished, 0 resources updated
[root@centos6 ~]#
っと書き変わっています。

この調子でどんどん書き換えて行けれます。(スミマセン。もう眠いっす)

参考:


0 件のコメント:

コメントを投稿