ようへいの日々精進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

自作のどうしようもない chef レシピをリファクタリングする一部始終(1)

要件

  • 以前に書いた rpmforge リポジトリインストールのレシピを別な書き方で解決する

レッツリファクタリング

以前のレシピ

以下のような感じで RPM ファイルを cookbook の file 以下にダウロードしておいて、cookbook_file を使って対象ノードにコピーしてから rpm コマンドでインストールしていた...

  • 問題点
    • RPM ファイルを手動でダウンロードしておかなければいけない
# rpmforge リポジトリのインストール
rpmforgefile="rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm"
cookbook_file "/tmp/#{rpmforgefile}" do
        mode 0644
        checksum "2df746e6fa066607c3a177578472f6dbb1a7fc6b8e53b79a2373d6ce9774da17"
end
package "rpmforge" do
        action :install
        source "/tmp/#{rpmforgefile}"
        provider Chef::Provider::Package::Rpm
end

直したレシピ

解決策として、当初は http_request を使おうと思って調査していたが、http_request して GET してきたファイルを保存するオプションが確認できなかったので半ば諦めて状態でいたところ remote_file が使えそうだったので試してみたらイケた。

remote_file "/tmp/rpmforge-release-0.5.2-2.el6.rf.i686.rpm" do
        source "http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm"
end

package "rpmforge" do
        action :install
        source "/tmp/rpmforge-release-0.5.2-2.el6.rf.i686.rpm"
        provider Chef::Provider::Package::Rpm
end

改善ポイント

  • あらかじめファイルをダウンロードしておく必要は無くなった
  • 但し...まだ残る問題点
    • cookbook_file の時と同様にバージョン管理や OS のアーキテクチャ(32bit or 64 bit)の違いに伴うファイル名管理方法を検討する必要がある

まとめ

  • ファイルをあらかじめダウンロードして管理しなければいけない呪縛から解き放たれて良かった
  • 課題として、以下の点についてレシピの追加が必要になる
    • 最新のファイルを取得するロジック
    • ダウンロードに失敗した際のロジック
  • とりあえず、来週の Chef Casual Talk Vol.1 でこのネタ話してみよかな(汗

chef-solo と LXC で作る俺のモバイルキッチン一部始終

要件

  • ThinkPad X1 Carbon にインストールした Ubuntu 12.10 環境に chef のレシピを書いて試す環境を構築する
  • chef はとりあえず、chef-solo を使う
  • chef-solo を試す環境は LXC の CentOS 6.x コンテナ
  • chef-solo を試す環境は Vagrant を試みたが Ubuntu 12.10 ではちゃんと動かすことが出来なかった(要調査)
  • タイトルは「俺のイタリアン」とか「俺のフレンチ」を意識した

手順

LXC の CentOS 6.x コンテナの用意

  • こっちでこさえたコンテナを利用

Ubuntu 側に調理器具(chef と knife-solo)を用意する

chef
  • そもそも ruby も入っていなかったのでインストール
  • chef を gem でインストール
knife-solo
  • chef 同様に gem でインストール
  • ~/.chef/knife.rb を作成
cookbook を作成
  • knife cookbook create にて作成
knife solo prepare
  • knife solo prepare でコンテナ側で chef を利用出来るように
レシピを書く
  • とりあえずパッケージインストールレシピを書く
  • Apache 位は起動させておこうかな
レッツクッキング
  • knife solo cook

まとめ

  • ざっくりとした流れは上記のような感じ。
  • このエントリは後日、整理する。