ChefのRecipeを書く(1)

recipeを書いてみる

前回まででとりあえずChef-soloが動くことは確認できたので今回はrecipeを書いてみます。

仕様を決める

recipeを書き始める前に、どのようなことをしたいかを考えたいと思います。
実際の環境はAWSのEC2なのでそれを想定して考えてみるととりあえず以下の通りにしたいと思います。

  • /mnt/logを作る
    • SymLinkで/logにする
  • /mnt/tmpを作る
    • パーミッションを1777にする
    • SymLinkで/tmpにする
  • ntpdをインストール
    • /etc/ntp.confを適当に設定する
    • ntpユーザで動かす

とりあえずざっくりこれを目指したいと思います。

ディレクトリの操作

まずは/mnt/logについて書いていきます。
cookbooks/base_packages/recipes/default.rbに以下を記述。

directory "/mnt/log" do
 owner "root"
 group "root"
 mode "0755"
end

試しに実行してみます。

$ sudo chef-solo -c .chef/solo.rb -j .chef/chef.json
INFO: *** Chef 0.10.8 ***
INFO: Setting the run_list to ["recipe[base_packages]"] from JSON
INFO: Run List is [recipe[base_packages]]
INFO: Run List expands to [base_packages]
INFO: Starting Chef Run for chef-test-01
INFO: Running start handlers
INFO: Start handlers complete.
INFO: Processing directory[/mnt/log] action create (base_packages::default line 20)
INFO: directory[/mnt/log] created directory /mnt/log
INFO: directory[/mnt/log] owner changed to 0
INFO: directory[/mnt/log] group changed to 0
INFO: directory[/mnt/log] mode changed to 755
INFO: Chef Run complete in 0.024623 seconds
INFO: Running report handlers
INFO: Report handlers complete

$ ls /mnt
log/

できましたー。

次に/mnt/logのSymLinkとして/logを作りたいのでさらに以下を記述。

link "/log" do
 to "/mnt/log"
end

実行してみるとエラーとなる。
既に/logというディレクトリがありますよーというエラーが出てしまいました。
確かに/logというディレクトリはもともとあって、今まではそれを一度消してSymLinkを作っていました。
そこまで一気にやってくれることを期待したのですが、やっぱり始めに/logディレクトリを消してSymLinkを作らないといけないようです。
puppetはその辺よろしくやってくれそうな気がするんですが、どうなんでしょうか。

ということで以下のように変更。

directory "/log" do
 action :delete
 only_if "test -d /log"
end

link "/log" do
 to "/mnt/log"
end

これでできました。  
と思ったら、もう一回実行すると
directory “/log”のところでエラーが出てしまいました。
どうやら/logはSymLinkなので「ディレクトリじゃないよ」と怒られている様子。
only_ifが効かないのはなぜ??

原因不明につき、今回はこれまで。

雑感

ここまでやってみて思ったのは、僕はpuppetの方が好みのような気がするということです。何となくですが、puppetは運用目線、Chefは開発者目線のような雰囲気を感じました。
とは言ってもChefの調査を続けます。

追記(2012/4/23)

最後のonly_ifが効かない件、後日再び、そのままの設定で実行したらなんでか分かりませんが問題なく動きました。
なんだったんだろう?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です