uzullaがブログ

uzullaがブログです。

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大先生本しかまだないんですよね。洋書ならいいやつあるのかな。


どうにも自分は明後日の方向に進みやすいので、流行りだけは知っておきたいのだが…。
一応よさそうなブログなどはワッチしてるんですけど、うーん。