Serverspecでリソースタイプ process や package が使えない場合とその対処

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

環境:
serverspecをインストールしたサーバはCentOS6.4,監視対象のサーバはCentOS5.3です。

processが使えない場合

原因としては、監視したいプロセス名と監視対象サーバで実行されているプロセス名が違うことだと思われる。

リソースタイプprocessの挙動

普通にプロセスを状態を監視したい場合はリソースタイプprocessを利用し、
以下のような記述で問題ない。(例. tomcat)

describe process('tomcat') do
  it { should be_running }
end

これで実行するとserverspecは監視対象のサーバに以下のコマンドを送信する。
(エラーとして表示してくれるので他の場合についても確認可能)

/bin/sh -c ps\ -C\ tomcat\ -o\ pid\=\ \|\ head\ -1

psのオプション -C はコマンド名からプロセスを選択、
-o pid= | head -1 はpidを取得しその1行目を表示するもの。

このことから、コマンド名とプロセス名が一致していない場合はリソースタイプ process を利用することが出来ない。
インストール方法の違いや利用するアプリケーションなどによりこのような現象が起こりうると思う。
(この問題について細かいことはわからないので今回は触れない)

原因と解決策

今回はtomcatでこのようなことが起こったので、引き続きtomcatを例に進める。

  • 実行ファイルを確認する
$ ps -ef | grep 'tomcat'
root    xxx(pid)   1  0 Sep16 ?  00:23:55 /usr/bin/java -Djava.util.logging.config.file=/usr/local/...
...
(以下略)

これ見ると/usr/bin/javaからtomcatが動いてるみたい。これがtomcatがヒットしない原因。
(もちろん $ ps -C java すればヒットする)

  • 解決策

簡単に言うと、リソースタイプ command を使います。問題があったらこれで書くしかなさそうです。

describe command("ps -eo command | egrep '^[a-z/]+java.*[t]omcat'") do
  its(:exit_status) { should eq 0 }
end

egrep以下でこのような複雑な書き方になっているのは、javaで実行されているものを確実に見つけるため。
(tailとか拾ってこないように)
最後の[t]omcatという書き方はこちらを参考にしたものです。
psをgrepした結果からgrep自身を除外する方法

packageが使えない場合

これについても使えない場合がある。以下は普通の書き方。

describe package('tomcat') do
  it { should be_installed }
end

リソースタイプpackageを使った場合、実行されるコマンドは以下。

/bin/sh -c rpm\ -q\ tomcat

rpmパッケージしか確認できない?
もちろんyumでインストールしたパッケージについては確認可能。
自分でダウンロードして展開したものについては見れない。
(rpmがどのようにインストール済パッケージを管理しているかわからないのでこれについても今回は触れない)

解決策

汎用的にインストール済パッケージを検出したい場合は以下の様な記述がいいかと。

describe command("find / -name tomcat") do
  its(:exit_status) { should eq 0 }
end

先ほどの process 同様、正規表現等で関係ないものを除外する必要がある。


基本的にはcommandで書くしかなさそうですね。
カスタムリソースタイプというものを自分で定義することも出来ますが、commandのほうが何やってるか一目見ればわかるのでこのままでもいいかと。

Serverspecに初めて触れた上に、rubyやbashについてもあまり詳しくないので、何かあれば訂正お願いします。