ChefのService commandは、init.dスクリプトのstatusに返り値が必要
ああー!ひさびさにWindowsネタじゃない!(挨拶)
さておき、目下Chef再勉強中です。色々を書きたいけど、どう考えても初心者が最初に思うであろう、誤った認識(や逆恨み)が大量ある感じなのでまだかかない。
さておき、オチは題名の通りなのだが、パっと答えが見つからなかったのでメモ。
問題の現象
SystemV形式 initスクリプト、と今でも言うべきなのかわからないですが、RH系ではinit.dにserviceの起動スクリプトをおきますが、それを制御するのがChefの service commandです。
service "my_great_program" do action [:enable, :start] end
とかやると、
RHでいえば
chkconfig my_great_program on service smy_great_program start
同様のものが走るっぽい
…のですが、試してみたらstartが走らない。起動していないのに
* service[my_great_program] action start (up to date)
とか言われる。
なにをもってstartが「up to date」なのかさっぱりわからないが、まあ何も操作する必要がないよ、と言うことだろう。
いやいや、起動してないから!
原因
といいつつ、まあ大体想像はついていて、犯人はわたしだ。
自作のしょっぱいSYSVスクリプトがダメなんだろう。
my_great_program status
とか裏でやっていて、起動してるかチェックしているのだろうが、その判定に失敗しているのだろう。
しかしその条件は
http://docs.opscode.com/resource_service.html
のページには細かくかいてない。
まあ、ここらはDistro依存だし、しかたないよね。
まさか文字列チェックとかないだろうし、まあ返り値かなーと思いつつ、早くもChefのコードを読む、肩慣らしですね!
ここですね
https://github.com/opscode/chef/blob/11-stable/lib/chef/provider/service/simple.rb
protected def determine_current_status! if @new_resource.status_command Chef::Log.debug("#{@new_resource} you have specified a status command, running..") begin if shell_out(@new_resource.status_command).exitstatus == 0 @current_resource.running true Chef::Log.debug("#{@new_resource} is running") end
はい
(はいじゃないが)
ということでオチ
status() { PID=`pgrep -f "$PROG_NAME"` if [ -z "$PID" ]; then echo "my_great_program stopped." exit 1 else echo "my_great_program running." exit 0 fi }
というように、ちゃんと返り値を返しましょう。
無事Startができるようになりました。
しかし、init.dスクリプトってわりとこのreturn valueの流儀無視してる奴もあるんだけど(と、流儀を無視してたやつが言う)、みんなハマらないの?
ところで先生がいない
独習俺ですので、教師不在の中勉強をしているのですが、Chefの本、naoya大先生本しかまだないんですよね。洋書ならいいやつあるのかな。
どうにも自分は明後日の方向に進みやすいので、流行りだけは知っておきたいのだが…。
一応よさそうなブログなどはワッチしてるんですけど、うーん。