ようへいの日々精進XP

よかろうもん

chef でソースコードから redis をインストールしてみる一部始終

要件

  • 最近、chef ネタばっかりですいません
  • redis という Key Value Store タイプのデータベースをインストールしてみる
  • サービスの起動も設定する
  • execute に一切頼らない方法!

とは言え...

execute で書いてみる

remote_file "/usr/local/src/redis-2.6.9.tar.gz" do
        source "http://redis.googlecode.com/files/redis-2.6.9.tar.gz"
end
#
execute "unpack_redis" do
        command "cd /usr/local/src/ && tar zxvf redis-2.6.9.tar.gz"
end
#
execute "install_redis" do
        command "cd /usr/local/src/redis-2.6.9 && make test && make && make install"
end
#
execute "running_redis" do
        command "/usr/local/bin/redis-server"
end

ダメな点

  • remote_file はまあイイ
  • execute を使いすぎ
  • 毎回 make install することになるんぢゃ...w
  • 二回目以降の chef 実行時の判断が入ってない

今んとこマシと思われる書き方

ソースコードの取得からインストールまで

remote_file "/usr/local/src/redis-2.6.9.tar.gz" do
        source "http://redis.googlecode.com/files/redis-2.6.9.tar.gz"
        notifies :run, "bash[install_program]", :immediately
end

bash "install_program" do
        not_if "ls /usr/local/bin/redis-server"
        user "root"
        cwd "/usr/local/src"
        code <<-EOH
                tar -zxf redis-2.6.9.tar.gz
                (cd redis-2.6.9/ && make test && make && make install)
        EOH
end
  • remote_file でソースをゲット
  • bash で redis がインストールされていない状態であればコンパイルしてインストールする

サービスの起動

bash "starting_redis" do
        not_if "ps aux | grep redis-server |grep -v"
        user "root"
        code <<-EOH
                /usr/local/bin/redis-server &
        EOH
        #action :nothing
end
  • redis-server が起動していなければ起動するという処理を強引に追加

まとめ

  • 今回の決めては bash と not_if
  • ただ、まだ工夫が必要!
  • そもそもリソースタイプ(?) bash って何なん?
  • 気になったけど execute で以下のような書き方が出来ない?
execute "install_redis" do
       until File.exists?("/usr/local/bin/redis-server") do
               command "cd /usr/local/src/redis-2.6.9 && make test && make && make install"
       end
end