2013年5月31日金曜日

mongoDBでレプリカセットをやってみた

■概要
今回は1台のサーバで3ノード(プロセス)立ててレプリカセットを作成しました
mongoのバージョンは2.4.3
未インストールの場合は以下を参考にインストールしてください
http://kakakikikeke.blogspot.jp/2012/07/mongodbperl.html

■レプリケーション設定
□master
mkdir -p /data/node1
mkdir -p /data/node2
mkdir -p /data/node3
3ノード分のフォルダを作成

mongod --dbpath=/data/node1 --replSet=myrep --port=27017 --fork --logpath /var/log/mongodb27017.log --logappend
mongod --dbpath=/data/node2 --replSet=myrep --port=27018 --fork --logpath /var/log/mongodb27018.log --logappend
mongod --dbpath=/data/node3 --replSet=myrep --port=27019 --fork --logpath /var/log/mongodb27019.log --logappend
3ノード分のプロセスを起動します replSet は同じ名前にします
--fork を入れることでバックグラウンド実行することができます

mongo --port 27017
今回は 27017 ポートで動作しているプロセスをマスターノードとして設定します

config = {
"_id" : "myrep",
"members" : [
{ "_id" : 0, "host" : "127.0.0.1:27017" },
{ "_id" : 1, "host" : "127.0.0.1:27018" },
{ "_id" : 2, "host" : "127.0.0.1:27019", "arbiterOnly" : true } ] }
mongoのインタラクティブモードになったら上記を実行して config オブジェクトを実行します

rs.initiate(config)
rs.status()
config を引数にしてレプリカセットを初期化します
エラーにならなければ設定完了です
status で確認したときに3ノードが登録されていることも確認します

exit
mongo --port 27017
use mydb
db.test.insert({"key001": "values001"})
db.test.find()
一旦抜けたあとに再度インタラクティブモードになりテストデータをインサートしてデータが入ったことを確認します

□slave
mongo --port 27018
27018 ポートで動作しているプロセスをスレーブとしてます

db.getMongo().setSlaveOk()
スレーブとして動作させるためのおまじないです

show dbs
use mydb
db.test.find()
マスタからインサートしたデータがスレーブ側でも反映されていることを確認します

一番失敗しやすいのは config オブジェクトを作成してレプリカセットを初期化するところだと思います
ここでエラーになった場合はエラーメッセージでググればいろいろと解決策は出てくると思います

2013年5月30日木曜日

【MySQL】slaveが参照するmasterのport番号を変更する方法

以下slaveにて実施

  1. # mysql -u root -p
  2. mysql> show slave status;
  3. Master_Port: 3306 になっていることを確認する
  4. mysql> stop slave;
  5. mysql> CHANGE MASTER TO MASTER_HOST='masterサーバのIPアドレス', MASTER_PORT=33306, MASTER_USER='repl', MASTER_PASSWORD='masterサーバのreplユーザのパスワード';
  6. 上記例ではport番号を3306から33306に変更しています
  7. mysql> start slave;
  8. mysql> show slave status;
  9. Master_Port: 33306 になっていることを確認する

当たり前ですが、master側はあらかじめポートを変更しておいてください(my.cnfで変更できます)
ポート変更後にslaveがうまくレプリケーションを実施していない場合は以下を参照してログポジションを変更してみてください
http://kakakikikeke.blogspot.jp/2012/10/mysql-mhaha.html
それでもダメな場合はflush logsを実施してからログポジションを変更してください

2013年5月28日火曜日

【erlang】rabbitmqで使っているmnesiaの中身を直接さわってみた

■概要
rabbitmqはerlangで実装されている分散型メッセージキューシステムです
そのrabbitmqが使っているDBがmnesiaと呼ばれる分散DBMSでerlangをインストールするとデフォルトで組み込まれているDBを使っています
今回は勉強も兼ねてrabbitmqのデータが保存されているmnesiaに直接触ってみました
使えそうなコマンドをざっくばらん書いたので見づらいです。。。

■mnesia起動
erl -sname rabbit -mnesia dir '"/var/lib/rabbitmq/mnesia/rabbit\@localhost/"'
いきなりポイントですが、erlコマンドで対話式のモードに入る際にrabbitmqを起動するユーザとrabbitmqのデータを保存しているmnesiaのディレクトリを保存しなければなりません
これを指定しないとデフォルトユーザとノードでmnesiaで起動してしまうためrabbitmqのDBにアクセスできません

mnesia:start().
erlangの対話型になったら上記コマンドを実行してmnesiaを起動します。以後はmnesia系のコマンドがTABで補完されるようになります

■データ閲覧
以下閲覧系のコマンドを紹介します
mnesia:info().
でデータベースの一覧やmnesiaの情報を閲覧できます
ram_copiesで表示されているテーブルが再起動するとrabbitmpから消えてしまうテーブルで
disc_copiesに表示されているテーブルが再起動後もデータ保存されているテーブルです
running db nodesにrabbitユーザで動作しているノード情報が表示されていることを確認します
そうなっていないとrabbitmqが保持しているmnesiaデータに問い合わせできません

mnesia_schema:info().
mnesia_schema:info(rabbit_vhost).
全テーブルのスキーム情報が詳細に閲覧できます
テーブルを指定してあるテーブルのみ参照することも可能です

mnesia:system_info(tables).
上記同様にmnesiaのテーブルの一覧を閲覧することができます

mnesia:dirty_all_keys(rabbit_vhost).
rabbit_vhostテーブルを一位に識別することができるのkeyオブジェクトが取得できます
ここで取得したkey名を使って問い合わせることになります

mnesia:dirty_first(rabbit_vhost).
rabbit_vhostのはじめの要素を取得することができます

mnesia:dirty_read(rabbit_vhost, <<"/">>).
指定したkeyの情報を取得します
ここのkeyの情報はdirty_all_keysで取得した形式のkey情報をそのまま入力しました
ちなみに上記だと[{vhost,<<"/">>,undefined}]なのが取得できました

mnesia:dirty_match_object(rabbit_vhost, {'_','_','_'}).
rabbit_vhostテーブルに格納されているすべてのレコードを抽出します
テーブルのカラム分「'_'」を記載すると全レコードを抽出できるようです(めんどくさい、他にもっと簡単に全部のレコードを取得できるコマンドがあると思います)
mnesia:schemaを実行した際に結果の下の方に表示されるwild_pattternと同じフォーマットを入力しても大丈夫です

■データ投入・削除
mnesia:dirty_write(rabbit_vhost, {'vhost',<<"testvhost">>,'undefined'}).
rabbit_vhostテーブルにレコードを1行追加します
第2引数のレコードはdirty_match_objectで取得できた形式で入力すれば大丈夫です
ついでに、直接データを投入したあとに、erlを抜けてrabbitmqをスタートしてみたけど普通に動作してかつrabbitmtctl list_vhostsで閲覧できた
(実際にdeclareできたかまでは検証してません)
ただ、このやり方は通常のレコード投入とは異なる方法ですので全くおすすめはしません
またtestvhostの部分は「<<>>」で囲んでバイナリデータとして投入しないとダメみたいです

mnesia:dirty_delete_object(rabbit_vhost, {vhost,'<<"testvhost">>',undefined}).
rabbit_vhostからレコードを1行削除する方法です
object削除なので、こちらもレコード情報をすべて指定しないと削除できません

■その他
・mnesia:table(rabbit_vhost).
でテーブルのデータが見れるが情報がよくわからない
・regs().
・nregs().
ノード登録情報を表示します
nがついているほうはクラスタとして登録してあるノード情報も表示します
・ets:hogehoge
mnesiaと一緒でデフォルトで入っている別のDBMS
どうやらrabbitmqはこちらにも保存している?(すいません調査できてません)
・c(test.erl).
test.erlで定義したerlangの関数が使えるようになる
成功する.beamというファイルができます
本来はこうやって独自でアクセサ的なもの作成してDBにはアクセスするみたいです
・erlangは大文字で始まるのが変数として管理される
・mnesia:dirty_hogehoge系のコマンドに関して
読んで字のごとくあまり使わないコマンドで本来なら自分でerlangスクリプトを書いて所謂、専用のアクセサ的なものを作成して問い合わせするようです

2013年5月24日金曜日

lsyncdインストールスクリプト

https://gist.github.com/kakakikikeke/5643498

以下を実施してくれます
  • sshの公開鍵認証設定
  • rpmforgeからのlsyncdのインストール
  • lsyncd設定ファイルの配備

2013年5月22日水曜日

【Jenkins】Simple Theme Pluginを使って色と画像を変えてみた

  1. プラグインの管理から「Simple Theme Plugin」をインストール
  2. Jenkinsの管理→システムの設定からThemeを設定できるところへ移動しURL of theme CSSに「/userContent/sample.css」を記載する
  3. Jenkinsのホームディレクトリ/userContent へ移動
  4. chefからインストールした場合は /var/lib/jenkins/jenkins-data/userContent/ になります
  5. 以下のファイルをダウンロードし配置移動したディレクトリ配下に配置
    • jenkins_logo.png
    • topbar.png
    • sample.css
    • @charset "utf-8";
      
      #main-table {
        background-image: url(jenkins_logo.png) !important;
      }
      
      #top-panel {
        background-image: url(topbar.png) !important;
      }
      
  6. Jenkinsのホームディレクトリ/userContent に以下のように配置される
    • /var/lib/jenkins/jenkins-data/userContent/jenkins_logo.png
    • /var/lib/jenkins/jenkins-data/userContent/topbar.png
    • /var/lib/jenkins/jenkins-data/userContent/sample.css
    1. Jenkinsをリロードして画像が変っていることを確認する

    JavaScriptも同じようにおけば読み込んでくれるみたいです
    簡単なデザイン変更やツール作成時にはいいかもしれないですね

    ■Tips
    sample.css, jenkins_log.png, topbar.pngはそれぞれJenkinsのプロセスを実行しているユーザの権限を与えてください
    権限がうまく設定されていないとUI上で反映されません

    /userContent/sample.cssはhttpでブラウザ閲覧できる場所にないとJenkinsも参照できません
    例えばJenkinsにアクセスするURLがhttp://localhost/jenkinsだった場合には設定するURLは「/jenkins/userContent/sample.css」と入力する必要があります

    2013年5月20日月曜日

    【chef】No version specified, and no candidate version available for fping

    以下のような感じでrecipe[yum::epel]を一番先に書く必要があります

    {
      "run_list": [
        "recipe[yum::epel]",
        "recipe[hogehoge]"
      ]
    }
    

    先にepelでyum repoを登録しておかないとpackage resourceを実行したときにyum installできずにエラーになります
    この辺の依存性解決はやってくれないんですね

    2013年5月18日土曜日

    【chef zabbix】Option source must be a kind of [String]! You passed {"default"=>"zabbix_agentd.init-rh.erb"}.

    emacs /chef-repo/cookbooks3/zabbix/recipes/agent.rb

    以下のように変更する
    source value_for_platform_family([ "rhel" ] => {"default" => "zabbix_agentd.init-rh.erb"}, "default" => "zabbix_agentd.init.erb")
    ↓
    source value_for_platform_family("rhel" => "zabbix_agentd.init-rh.erb")
    

    zabbix_agentd.init-rh.erbを指定してもいいですが、そっちの起動スクリプトにはstart_stop_daemonが必要なので動かない場合があります

    【git】Merge the remote changes before pushing again

    メインストリームに変更があったのに
    それをpullする前にローカルを変更してステージにcommitしてしまった場合に発生します
    以下で解決できます

    git fetch && git merge origin/master

    2013年5月16日木曜日

    zapier使ってみた

    ■zapierとは
    様々なAPIを連携してwork flow的なものを実行してくれるサービス
    サポートしているサービスは200以上もある
    当然これら200のサービスのAPIを裏側で実行しているのでAPIが実現されていないサービスはサポートされない

    ■zap
    work flowの単位を表している
    例えば今回サンプルで実行する
    「Googleスプレッドシートに書き込みを実施」したら「Gmailでメールを送る」
    という1つのwork flowを zap という単位で呼んでいる

    ■task
    zap を1回実行すると1taskとなる
    zap を実行した回数だと思ってもらえれば大丈夫だと思う

    ■課金タイプ
    基本は無料で使える、有料のプランもある
    有料にすると作成できるzapの数や実行できるtaskの数、あとでも紹介するがポーリングの時間が変わってくる
    無料ユーザは10zapまで作成可能でtaskは100回まで実行可能
    月額タイプの課金と年額タイプの課金がある
    もちろん年額タイプの課金のほうがお得

    ■サンプルzap作成&実行


    まずはログインします
    サインアップはメールアドレスがあれば簡単に行えます



    ログイン後はダッシュボードに遷移します
    zapや現在実行したtaskの数はここで確認します
    Create a New Zapからzapをクリックします



    200以上のサービスからオリジナルのzapierを作ることもできますが
    今回はテンプレートとして用意してあるものからzapを作成してみます
    Go explore the Zap template gallery.をクリックします



    テンプレートの一覧が表示されます
    今回はGoogleスプレッドシートとGmailを連携したzapを作ってみたいと思います
    動きとしては
    Googleスプレッドシートに更新があった(何かセルに入力があった)らGmailでその内容を通知してくれる
    といったzapを作ってみたいと思います



    テンプレートを選択するとGoogleスプレッドシートとGmailの設定画面に遷移します
    ここで認証も含めて全て設定します

    迷うところは特にないと思いますが、Googleスプレッドシートはフィルタをかけられるので
    あるシートのあるカラムの更新のみを監視するなどの設定が細かくできます
    Gmailに関してはメールの宛先やタイトル、本文が必須のほか更新した値も変数として埋め込むことができます
    今回は更新した値をメール本文に含めるため「{{{gsx$aaa}}}」という変数を使用します
    aaaはカラム名になります
    すべての設定が完了したら6でテストも実行できます
    ここでテストを実行してもtaskの数は消費されませんでした
    あとは最後にzap名を入力して完了となります



    完了後はzapを共有するか聞かれます
    今回はサンプルで作っただけですので、共有はしないためキャンセルします



    ダッシュボードに戻りました
    作成したzapがあることを確認できると思います
    以上でサンプルのzap作成は完了となります

    ■仕様
    zapierからGoogleスプレッドシートへ15分おきに更新状況をポーリングしに行っている模様
    リアルタイムですぐに更新を確認したい場合にはダッシュボードから「run」を実行する
    taskを消化するのはGoogleスプレッドシートに更新があったタイミングで1回消費されるので
    更新がない場合の5分間の更新チェックだけではtaskは消費されない

    ■感想
    すごい便利だと思いました
    これまで自前で連携していたマッシュアップ的なサービスをすべてこれで巻き取れるんじゃないかと・・・
    まだ詳しくは見れてませんが、テンプレートは2つのAPIを組み合わせたものでしたが、これが3, 4個と連携できるようになれば更に便利に使えるんじゃないかと思いました
    あと自前でAPIサービスを持っている人がzapierにそれを組み込める機能とかサービスとかがあると、すごい嬉しいと個人的に思いました
    エンタプライズ向けのテストソリューションとかになるんじゃないかなーとか考えた

    2013年5月15日水曜日

    【Jenkins】Vagrant Pluginをやってみたけどできなかった

    ■環境
    Windows7 64bit
    VirtualBox 4.1.26
    Vagrant 1.2.2
    Jenkins 1.514
    Vagrant Plugin 0.14

    ■VirtualBoxインストール

    ■Vagrantインストール

    ■Apache TomcatとJenkinsインストール
    まずはtomcatをインストールします
    tomcatの公式サイトからtomcatのインストーラをダウンロードして実行すればOKです
    http://tomcat.apache.org/download-70.cgi
    インストールが完了したら8080でローカルからアクセスできることを確認しましょう

    次にJenkinsのインストールです
    http://mirrors.jenkins-ci.org/war/latest/jenkins.war
    からwarファイルをダウンロードしてTomcatの管理からwarファイルをデプロイします
    C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps
    にwarファイルをコピーしてTomcatを再起動しても大丈夫です

    ■Vagrant Pluginインストール
    Jenkinsのプラグイン管理からインストールします
    利用可能タブからフィルタで「vargrant」を検索してインストールします
    インストール後はJenkinsを再起動します

    インストール環境後に適当にジョブを作成し
    ビルド環境にBoot Vagrant box
    のチェックボックスがあることを確認します

    ■実行
    コマンドプロンプトを開く
    cd C:/.jenkins/jobs/sample/workspace/
    vagrant init precise32 http://files.vagrantup.com/precise32.box
    実行後workspace配下にVagrantfileがあることを確認します
    ビルド時に時間をかけないように一旦 vagrant up をしておきます
    VMが問題なく起動できてログインできたらOKです

    Jenkinsから操作します
    sampleのビルドを作成し、vagrantを設定する
    ビルド環境→Boot Vagrant boxにチェックを入れます
    Path to Vagrantfileは相対パスをワークスペースからの相対パスで入力します
    今回はworkspace配下に直接Vagrantfileを作成したので、入力しません
    作成が完了したらビルドを実行してみましょう
    成功するとvagrantからVMが立ち上がりそこで指定したビルドが実行されます

    ■結果
    で、まぁ結果的にはWindows7 64bit上では動きませんでした
    環境に書いてあるバージョンで実行すると
    FATAL: (NoMethodError) undefined method `configure' for Vagrant:Module
    のエラーが出てうまく動作しません
    バージョンの新しいvagrantではVagrantfileの形式が変わっているみたいでそれに対応してないように見えました

    vagrantのバージョンを下げてやってみたところ
    FATAL: (NameError) uninitialized constant ChildProcess::Windows::Process
    のエラーとなり調べてみたら
    https://github.com/rtyler/vagrant-plugin/issues/19
    https://github.com/jarib/childprocess/issues/26
    という記事を見つけてJRubyがWindows7 64bit上だと動かないようです(というかWindows自体未検証みたいです)

    まったく同じことをLinux上でやれば動くかもしれません
    残念・・・

    ■参考サイト

    2013年5月14日火曜日

    Windows7にrubyをインストール

    ■環境
    Windows7 64bit
    インストールするrubyのバージョンは2.0.0とします

    ■ruby&gemインストール
    1. http://rubyinstaller.org/downloads/にアクセス
    2. Ruby 2.0.0-p0 (x64)をクリックしてWindows用のexeインストーラをダウンロード
    3. ダウンロードが完了したらインストーラを実行
    4. インストールの途中で「Ruby の実行ファイルへ環境変数PATHを設定する」にチェック
    5. あとは気にせずインストール
    6. デフォルトでインストールすると「C:\Ruby200-x64」にインストールされます
    7. コマンドプロンプトを開いてバージョンを確認
    8. ruby -v
      ruby 2.0.0p0 (2013-02-24) [x64-mingw32]
      
    9. gemのインストールも確認
    10. gem -v
      2.0.0
      

    ■Development Kitインストール
    1. rubyのインストーラをダウンロードした同様のサイトからDevKit-mingw64-64-4.7.2-20130224-1432-sfx.exeをダウンロード
    2. C:/ruby_dev_kitフォルダを作成しそこでダウンロードしたインストーラを実行しファイルを展開
    3. 展開した C:/ruby_dev_kit に移動し「ruby dk.rb init」を実行
    4. config.yml ができるので編集、以下の一行を追加(rubyをインストールしたパスを追加)
    5. - C:/Ruby200-x64
    6. ruby dk.rb review
    7. ruby dk.rb install(INFOレベルのログが表示されエラーがでなければDevelopment Kitのインストール成功)
    8. gem update ができるようになっていることを確認

    こんな簡単にインストールできるようになったんですね。。。

    ■トラブルシューティング
    ・gem installに失敗して以下のエラーがでる
    ERROR: Could not find a valid gem 'bundler' (>= 0), here is why:
    Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/latest_specs.4.8.gz)

    -> gem install bundler -r --source http://rubygems.org/
    -> のように一時的にhttpを使うようにしてinstallする

    ・Jekinsからrubyが認識されない
    Jenkins側にまだ環境変数の情報が反映されていません
    一度Jenkinsを再起動してください
    それでもダメな場合はrubyをインストールするときに環境変数に反映するチェックボックスがONになっていたか確認してください

    2013年5月9日木曜日

    回線のお引越しメモ【Biglobeとauひかり】

    ■背景
    自宅が引越しをするのでインターネットも引越しする
    現在はauひかりとauひかり電話をプロバイダをbiglobeで契約中している
    要件としては電話番号はそのまま使えるようにして、ネットは使えればなんでもよい
    というわけで以下2つのパターンに絞り込んでいろいろネットで調べたり電話して聞いたりしたのでまとめておく

    1. wimaxに移行し電話番号をそのまま残す
    wimaxにした場合、現在申し込んでいるauひかりのプランをbiglobeで変更しなければならない
    その場合、auひかりのプランからベージックプランという基本はネットができないがIDを保持するためのプランに変更する
    ※厳密にはダイヤルアップならできるみたい
    その場合の料金は
    ベージックプラン+wimax
    ⇒210円+3,591円=3,801円
    になります
    そして電話を残す必要があるのですが、auひかり電話はネット回線が必須要件で
    今回は回線撤去になるので、auひかり電話を続けることはできません
    なのでKDDIが別途「メタルプラス電話(auおうち電話)」という固定電話用のサービスを提供しているのでそれに変更します
    この手続はbiglobeではできないので、biglobeでベーシックプランに変更する前にKDDIに問い合わせてメタルプラス電話に切り替えます
    メタルプラスは月額1,470なので、合計は
    ⇒210円+3,591円+1,470円=5,271円
    になります。また請求は3,801円がbiglobeから1,470円がKDDIからとなります

    メリットとしては回線移転の手続きがいらない
    デメリットとしてはbiglobeとKDDIの両方で手続きをしなければいけない、料金が高くなる

    2. auひかりの回線をそのまま引越しし電話番号をそのまま残す
    手続きは全部biglobeで行います
    電話またはwebからでも手続き可能です
    まず、引越した場合の月額料金は以下
    月額基本料金(ネット料金)+VDSL機器レンタル料+設置工事費用+auひかり電話料金
    ⇒3,570円+420円+1,313円+525円(+通話料)=5,825円
    設置工事費用は引越しでもかかります
    2年間分を分割で払っているので、全部で31,500円払うことになります
    しかもこの料金は途中で解約すると払いきれてない分は解約月に全額一括で支払うことになるので、
    引っ越してすぐに解約するととんでもないことになります
    もうちょっと詳しく書くと新規契約のときは大抵キャンペーンが適用になっていて工事費とかVDSLレンタル代とかは無料になったりしてます
    で、今回は引越しなので引越の場合はキャンペーンが適用にならないので、いきなり払う必要があるということです
    電話番号に関してはauひかり同士の引越しになるので「可能であるならば」そのまま電話番号も引き継げます
    可能であると表現しているのは電話番号をそのまま使えない可能性があるということで
    引越し先が現在と同じ電話の基地局を使うのであれば電話番号は引き継げるのですが、そうでない場合は引き継げないので
    全く新しい電話番号に勝手に切り替わります
    なので、必ず同じ電話番号が移転先で使えるかを「116」に問い合わせてから引越し手続きをするようにしてください
    これを確認しないで手続きしてしまうと引っ越したあとで電話番号が変わってしまったことに気がついて大変なことになりかねません

    メリットとしては手続きはbiglobeのみでかつwebで全部行える
    デメリットとしては月額料金が高くなる

    ■結論
    で、結局今回はどうしたかというと
    auひかりを解約して、新規で回線申込み
    をしました、1. 2. どっちも採用しませんでした
    理由としては
    • 116にかけたら引越し先では同じ電話番号が使えないことを知った
    • メタルプラス電話で個別に電話を契約しても電話番号が引き継げない
    • 料金が高くなる
    • 手続き的には新規契約とほとんど変わらなかった
    • 新規の回線契約ならばキャンペーンが再度使える
    あたりでしょうか

    その場合のTODOとしては
    • 新規で回線契約をする必要がある(引越し後でもおk)
    • biglobeでauひかりの回線を解約する必要がある
    • auひかりのモデルを返却する必要がある
    • 回線撤去の立会いが必要になる(かもしれない)
    になります
    こういうのって知らない人はどうしてるんだろうといつも心配になります
    この記事で誰か助かってくれると嬉しいです

    2013年5月8日水曜日

    【chef】zabbix cookbooksインストール時にNode attributes are read-only when you do not specify which precedence level to set

    ■エラー詳細
    FATAL: Chef::Exceptions::ImmutableAttributeModification: Node attributes are read-only when you do not specify which precedence level to set. To set an attribute use code like `node.default["key"] = "value"'

    ■対処方法
    zabbix/recipes/server_source.rb
    の以下の部分を変更

    configure_options = (node['zabbix']['server']['configure_options'] || Array.new).delete_if do |option|
      option.match(/\s*--prefix(\s|=).+/)
    end
    

    ↓↓↓まるごと以下のように変更↓↓↓

    node_options = node['zabbix']['server']['configure_options']
    configure_options  = Array.new
    
    if node_options
      node.set['zabbix']['server']['configure_options'].delete_if do |opt\
    ion|
        option.match(/\s*--prefix(\s|=).+/)
      end
      node_options.each do |item|
        configure_options << item
      end
    end
    

    Chefが11の場合に出ちゃうみたいです
    issueにも挙げられてるみたいですが、masterにはまだマージされてないみたいです
    あやうく自分でpull requestするところでしたw
    やっぱりちゃんとissueは見ないとダメですね
    https://github.com/AdallomRoy/zabbix/commit/0ecab38ce4545c479cb52f65b1a1b570baba7857

    rabbitmq clusterやってみた

    ■概要
    rabbitmqでclusterを構成を組んだ上でキューの作成やメッセージの送受信をしてみました

    ■rabbitmqインストール
    以下の記事を参考に2台のrabbitmqサーバを作成します
    chefによるインストールを紹介していますが、普通にchefじゃなくても大丈夫です
    http://kakakikikeke.blogspot.com/2013/05/rabbitmq.html

    ■cluster構成作成
    ・スレーブ側操作
    rabbitmqctl stop_app
    rabbitmqctl join_cluster --ram rabbit@マスタ側サーバIP
    rabbitmqctl start_app
    ・マスタ側操作
    rabbitmqctl cluster_status

    クラスタとして追加したサーバはRAMモードとDISKモードというキューの保存方法が異なる形式を選択することができます
    DISKモードに変更したい場合は以下の操作をスレーブ側で実行します
    rabbitmqctl stop_app
    rabbitmqctl change_cluster_node_type disc
    rabbitmqctl start_app

    クラスタから外したいときは以下の操作をスレーブ側で実行します
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl start_app

    ■キュー作成とメッセージのやりとり
    ※guestユーザでvhost「/」に対して実行した場合です
    rabbitmqadmin --host サーバのIPアドレス declare queue name=testqueue001
    rabbitmqadmin --host サーバのIPアドレス list queues
    rabbitmqadmin --host サーバのIPアドレス publish routing_key=testqueue001 payload="test message 001" exchange=amq.default
    rabbitmqadmin --host サーバのIPアドレス get queue=testqueue001 requeue=false

    上記実施後にマスタサーバとスレーブサーバ両方でキューの確認をすると両方のサーバに情報が反映されていることがわかります

    ■注意事項
    The nodes provided are either offline or not running
    上記のエラーが出るときはerlang.cookiesという設定ファイルがサーバ同志で共有されてない場合にでます
    /var/lib/rabbitmq/.erlang.cookie
    上記を共有したあとにrabbitmqを再起動すると直ります

    2013年5月7日火曜日

    rabbitmqやってみた

    ■概要
    rabbitmqサーバ1台とクライアント1台で簡単なキュー処理をやってみた
    ユーザとかvhostとか権限とかもやってみた

    ■rabbitmqインストール
    今回はchefでインストールします、なのであらかじめchefをインストールしておいてください
    http://kakakikikeke.blogspot.jp/2013/03/chefomnibus.html
    またrabbitmqのchefインストールは以下に必要なcookbooksも含めてまとめています(一番したの方)
    http://kakakikikeke.blogspot.jp/2013/05/opscodecookbooks.html

    ■rabbitmqadminインストール
    ※rabbitmqctlではクライアントツールとして動作しないのでデフォルトで付属している専用のクライアントツールをインストールする
    ※15672のWeb-API用のポートを使って通信する
    ・サーバ側操作
    rabbitmq-plugins enable rabbitmq_management
    /etc/init.d/rabbitmq-server restart
    netstat -an | grep 15672
    15672で新しくプロセスが上がっていることを確認する
    ・クライアント側操作
    cd /usr/local/sbin
    wget http://サーバ側IPアドレス:15672/cli/rabbitmqadmin
    chmod 755 rabbitmqadmin
    以下からはクライアント側で操作する

    ■ユーザとvhostと権限の作成
    rabbitmqadmin --host サーバのIPアドレス declare vhost name=testvhost
    rabbitmqadmin --host サーバのIPアドレス declare user name=kakakikikeke password=********** tags=testtag
    rabbitmqadmin --host サーバのIPアドレス declare permission vhost=testvhost user=kakakikikeke configure=".*" write=".*" read=".*"

    rabbitmqではユーザを指定しないとguest:administratorでアクセスされます
    vhostも「/」のみが有効になっています
    「ユーザ」「vhost」「権限」のつながりをまとめると
    ユーザとvhostを作成してvhostに対してどんな権限かと誰が触れるかを設定します

    ■クライアント・サーバで検証
    キューを作成して確認したあとメッセージを送信し受信します

    rabbitmqadmin --host サーバのIPアドレス --vhost testvhost --user kakakikikeke --password ********** declare queue name=testqueue001
    rabbitmqadmin --host サーバのIPアドレス --vhost testvhost --user kakakikikeke --password ********** list queues
    rabbitmqadmin --host サーバのIPアドレス --vhost testvhost --user kakakikikeke --password ********** publish routing_key=testqueue001 payload="test message 001" exchange=amq.default
    rabbitmqadmin --host サーバのIPアドレス --vhost testvhost --user kakakikikeke --password ********** get queue=testqueue001 requeue=false

    他のアクションコマンドの一覧を表示
    rabbitmqadmin help subcommands

    AMQP互換のrabbitmqには様々なクライアントが用意されており簡単に触れます
    今回は付属のcliツールを使いましたが、他にもいろいろありかつクライアントによっては
    実装されていない機能もあるので、結構良し悪しがありそうです

    ■Tips
    キューを作成する際にdurable=falseで作成するとrabbitmqが再起動した後にキューが削除されている

    2013年5月4日土曜日

    【apache】DocumentRootでindex.cgiを動作させる方法

    ■環境
    CentOS release 6.4 (Final) x86_64
    perl v5.10.1

    ■apache httpdインストール
    yum -y install httpd*

    ■index.cgiの作成
    cd /var/www/html
    wget http://www.tohoho-web.com/cgi/wwwperl.txt
    mv wwwperl.txt index.cgi
    ※perlのパスだけ書き換える必要があるかもしれない
    nkf -w --overwrite index.cgi
    chmod 755 /var/www/html/index.cgi

    ■apache設定
    vi /etc/conf/conf/httpd.conf
    以下を編集する
    Options Indexes FollowSymLinks

    Options Indexes FollowSymLinks ExecCGI

    #AddHandler cgi-script .cgi

    AddHandler cgi-script .cgi

    DirectoryIndex index.html index.html.var

    DirectoryIndex index.cgi index.html index.html.var

    ■動作確認
    service httpd start
    http://localhost/にアクセスして環境変数の一覧が表示されることを確認する

    2013年5月2日木曜日

    Opscodeで公開されているいろんなcookbooksを試してみた

    P.S 20140226
    最近この記事のアクセスが増えてきたので一旦内容を精査しました
    主な修正点は以下です
    細かい部分に関しては各cookbooksの検証結果内に赤字で追記しています
    • git のインストールを事前手順に追加
    • Tomcat7が動作しなくなっていたのを追記
    • Tomcat7 その2の依存ライブラリ修正
    • Jenkinsの実行レシピ名が変更になっていたので修正
    • 誤字脱字修正
    • 体裁修正
    • その他、赤字での追記

    ■環境
    CentOS 6.4 64bit
    Chef 11.4.0(chef-soloを使用)

    ■事前作業
    chef-soloのインストール
    gitのインストール
    yum -y install git
    cookbooksディレクトリの作成
    cd /; git clone git://github.com/opscode/chef-repo.git
    mkdir /etc/chef
    vim /etc/chef/solo.rb
    file_cache_path "/tmp/chef-solo"
    cookbook_path ["/chef-repo/cookbooks"]
    role_path "/chef-repos/roles"
    log_level :debug
    
    以下作業ディレクトリは/chef-repo/cookbookとします

    ■chef-solo検証
    ■Java(デフォルト6)
    □実行方法
    • git clone git://github.com/opscode-cookbooks/java.git
    • git clone git://github.com/opscode-cookbooks/windows.git
    • git clone git://github.com/opscode-cookbooks/chef_handler.git

    vim /chef-repo/cookbooks/java.json
    {
      "override_attributes": {
        "java": {
          "install_flavor": "oracle"
        }
      },
      "run_list": [
        "recipe[java]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/java.json

    □実行結果
    • open-jdk-1.6.0がインストールされた
    • java version "1.6.0_24" OpenJDK Runtime Environment (IcedTea6 1.11.9) (rhel-1.57.1.11.9.el6_4-x86_64) OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode) ⇒20140228追記:1.6.0_30がインストールされるようになっていた
    • yum installで実施しているみたいだが非常に時間がかかる(賞味30分くらい)
    • Chef::Exceptions::CookbookNotFound: Cookbook windows not found. If you're loading windows from another cookbook, make sure you configure the dependency in your metadata対策
    • 上記2つのcookbooks「windows」と「chef_hander」も必要
    • ※override_attributesに関して
    • chef-soloにoverride_attributesの概念はない roleに対してはoverrideできるが、レシピに記載されているdefaultのattributeに対してchef-soloの場合効果がない override_attributesを指定しないでjsonに直接実行すれば、default_attributeの値を上書きして実行してくれる

    ■Java(java7へ変更)
    □実行方法
    • git clone するものは上記のJava(デフォルト6)と同様

    vim /chef-repo/cookbooks/java.json
    {
      "java": {
        "install_flavor": "oracle",
        "jdk_version": 7,
        "java_home": "/usr/local/java",
        "oracle" : {
          "accept_oracle_download_terms": true
        }
      },
      "run_list": [
        "recipe[java]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/java.json

    □実行結果
    • oracle javaの1.7がインストールされた
    • java version "1.7.0_17" Java(TM) SE Runtime Environment (build 1.7.0_17-b02) Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode) ⇒20140228追記:1.7.0_51がインストールされるようになっていた

    ■Emacs
    □実行
    • git clone git://github.com/opscode-cookbooks/emacs.git

    vim /chef-repo/cookbooks/emacs.json
    {
      "run_list": [
        "recipe[emacs]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/emacs.json

    □実行結果
    • GNU Emacs 23.1.1 (x86_64-redhat-linux-gnu) of 2012-03-01 on c6b18n3.bsys.dev.centos.org

    ■Tomcat7
    ⇒20140228追記:すいません、うまく動作しないようです
    FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
    が出てうまくインストールできません

    □実行
    • git clone git://github.com/opscode-cookbooks/tomcat.git
    • git clone git://github.com/mcortesi/tomcat.git
    • git clone git://github.com/opscode-cookbooks/java.git
    • git clone git://github.com/opscode-cookbooks/windows.git
    • git clone git://github.com/opscode-cookbooks/chef_handler.git
    yum -y install yum-plugin-priorities
    rpm -Uvh http://mirrors.dotsrc.org/jpackage/6.0/generic/free/RPMS/jpackage-release-6-3.jpp6.noarch.rpm
    yum clean all
    yum -y update

    vim /chef-repo/cookbooks/tomcat.json
    {
      "tomcat": {
        "base_version": 7
      },
      "java": {
        "install_flavor": "oracle",
        "jdk_version": 7,
        "java_home": "/usr/local/java",
        "oracle" : {
          "accept_oracle_download_terms": true
        }
      },
      "run_list": [
        "recipe[java]",
        "recipe[tomcat]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/tomcat.json

    □実行結果
    • opscodeで提供されているtomcatのcookbooksがtomcat7に対応していないためforkして作られたcookbooksを使用する
    • http://blog.cloudpack.jp/2013/01/server-news-centos6-tomcat7-rpm-yum.html
    • jpackageのリポジトリとepelのリポジトリがenable状態になっているとyum updateで失敗するのでepelを無効にしておく必要あり
    • Javaのcookbooksに依存しているのでjavaもcloneする必要あり
    • 普通のtar展開によるtomcatインストールと違ってyumインストールはフォルダが変なところに置かれるのでわかりづらい

    ■Tomcat7 その2
    □実行
    • git clone git://github.com/opscode-cookbooks/java.git
    • git clone git://github.com/opscode-cookbooks/windows.git
    • git clone git://github.com/opscode-cookbooks/chef_handler.git
    • git clone git://github.com/bryanwb/chef-tomcat.git
    • cp -ipr chef-tomcat tomcat (tomcatという自分自身と同じ内容のcookbooksが必要)
    • git clone git://github.com/opscode-cookbooks/ark.git
    • git clone git://github.com/opscode-cookbooks/logrotate.git

    vim /chef-repo/cookbooks/chef-tomcat.json

    {
      "run_list": [
        "recipe[chef-tomcat]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/chef-tomcat.json

    □実行結果
    • /usr/local/tomcat/default/bin/version.sh
    • Server version: Apache Tomcat/7.0.32

    ■MongoDB
    □実行
    • git clone git://github.com/kakakikikeke/cookbooks-jpackage.git
    • git clone git://github.com/edelight/chef-mongodb.git
    • cp -ipr chef-mongodb mongodb (mongodbという自分自身と同じ内容のcookbooksが必要)
    • git clone git://github.com/opscode-cookbooks/apt.git
    • git clone git://github.com/opscode-cookbooks/yum.git
    • git clone git://github.com/opscode-cookbooks/python.git
    • git clone git://github.com/opscode-cookbooks/build-essential.git
    • git clone git://github.com/opscode-cookbooks/yum-epel.git
    • git clone git://github.com/opscode-cookbooks/runit.git

    vim /chef-repo/cookbooks/chef-mongodb.json
    {
      "run_list": [
        "recipe[cookbooks-jpackage]",
        "recipe[chef-mongodb]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/chef-mongodb.json

    □実行結果
    • MongoDB shell version: 2.4.2
    • ⇒20140228追記:2.4.9がインストールされるようになってました
    • 自作のcookbooksを使って10genのリポジトリを追加しています

    ■Redis
    □実行
    • git clone git://github.com/brianbianco/redisio.git
    • git clone git://github.com/bmhatfield/chef-ulimit.git
    mv chef-ulimit ulimit

    vim /chef-repo/cookbooks/redisio.json
    {
      "run_list": [
        "recipe[redisio::install]",
        "recipe[redisio::enable]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/redisio.json

    □実行結果
    • redis-cli 2.6.11
    • ⇒20140228追記:2.6.17がインストールされるようになってました
    • 設定ファイルは /etc/redis/6379.conf にある
    • デフォルトのポートは6379でLISTENしている
    • 起動ファイルは /etc/init.d/redis6379 にある
    • sentinelの起動は以下で実施できます(設定ファイルは作成してください)
    • /usr/local/bin/redis-server /etc/redis/sentinel.conf --sentinel

    ■Jenkins
    □実行
    • git clone git://github.com/opscode-cookbooks/apache2.git
    • git clone git://github.com/opscode-cookbooks/iptables.git
    • git clone git://github.com/opscode-cookbooks/chef_handler.git
    • git clone git://github.com/opscode-cookbooks/windows.git
    • git clone git://github.com/opscode-cookbooks/java.git
    • git clone git://github.com/opscode-cookbooks/apt.git
    • git clone git://github.com/opscode-cookbooks/essential.git
    • git clone git://github.com/opscode-cookbooks/ohai.git
    • git clone git://github.com/opscode-cookbooks/yum.git
    • git clone git://github.com/opscode-cookbooks/nginx.git
    • git clone git://github.com/opscode-cookbooks/runit.git
    • git clone git://github.com/opscode-cookbooks/jenkins.git
    • git clone git://github.com/opscode-cookbooks/build-essential.git

    vim /chef-repo/cookbooks/jenkins.json
    {
      "run_list": [
        "recipe[jenkins::master]"
      ]
    }
    
    ⇒20140228追記:レシピがserverではなくmasterに名称変更してました
    chef-solo -j /chef-repo/cookbooks/jenkins.json

    □実行結果
    • URI::InvalidURIError: ruby_block[block_until_operational] (jenkins::server line 52) had an error: URI::InvalidURIError: the scheme http does not accept registry part: :8080 (or bad hostname?
    • なんてエラーが最後にでるのですが、どうやらインストールはできているみたい
    • /var/lib/jenkins/jenkins.war にwarがあります
    • chkconfigには登録されずにrunitで起動しています(/etc/sv/jenkins/run にrunit用のコマンドあり)
    • /etc/service/jenkins にシンボリックリンクがあるので、これを削除すれば自動起動しなくなります
    • sv start/stop/status jenkinsで各種起動や確認ができます
    • /etc/init.d/jenkins start|stopでも起動や停止ができます
    • Error executing action `enable` on resource 'runit_service[jenkins]'
    • rpm -ivh /root/rpmbuild/RPMS/runit-2.1.1.rpm(rpmがない場合はネットから探してくる)
    • Java7インストール時のattributesを指定しないと「openJDK 1.6.0_24」がインストールされます
    • runsvdir -P -H /etc/service でrunsv自体が止まってしまった場合に再起動できます
    • runsv jenkins: fatal: unable to lock supervise/lock: temporary failure
    • rm /etc/sv/jenkins/supervise/lock で一旦lockファイルを削除してからrunsvdirで起動してください
    • 起動ログ等は/var/log/messagesに吐かれています

    ■RabbitMQ
    □実行
    • git clone git://github.com/opscode-cookbooks/rabbitmq.git
    • git clone git://github.com/opscode-cookbooks/erlang.git
    • git clone git://github.com/opscode-cookbooks/apt.git
    • git clone git://github.com/opscode-cookbooks/yum.git
    • git clone git://github.com/opscode-cookbooks/build-essential.git

    vim /chef-repo/cookbooks/rabbitmq.json
    {
      "run_list": [
        "recipe[rabbitmq]"
      ]
    }
    
    chef-solo -j rabbitmq.json

    □実行結果
    • rabbitmqctl status | grep RabbitMQ
    • {running_applications,[{rabbit,"RabbitMQ","3.0.4"},

    ■Zabbix
    □実行
    • git clone git://github.com/laradji/zabbix.git
    • git clone git://github.com/opscode-cookbooks/database.git
    • git clone git://github.com/opscode-cookbooks/aws.git
    • git clone git://github.com/opscode-cookbooks/mysql.git
    • git clone git://github.com/opscode-cookbooks/build-essential.git
    • git clone git://github.com/opscode-cookbooks/openssl.git
    • git clone git://github.com/opscode-cookbooks/postgresql.git
    • git clone git://github.com/opscode-cookbooks/apt.git
    • git clone git://github.com/opscode-cookbooks/xfs.git
    • git clone git://github.com/opscode-cookbooks/apache2.git
    • git clone git://github.com/opscode-cookbooks/ark.git
    • git clone git://github.com/opscode-cookbooks/powershell.git
    • git clone git://github.com/opscode-cookbooks/windows.git
    • git clone git://github.com/opscode-cookbooks/chef_handler.git
    • git clone git://github.com/opscode-cookbooks/nginx.git
    • git clone git://github.com/opscode-cookbooks/ohai.git
    • git clone git://github.com/opscode-cookbooks/runit.git
    • git clone git://github.com/opscode-cookbooks/yum.git
    • git clone git://github.com/opscode-cookbooks/ufw.git
    • git clone git://github.com/opscode-cookbooks/firewall.git
    • git clone git://github.com/yevgenko/cookbook-php-fpm.git
    • git clone git://github.com/chocolatey/chocolatey-cookbook.git
    mv chocolatey-cookbook/ chocolatey
    mv cookbook-php-fpm/ php-fpm

    vim /chef-repo/cookbooks/zabbix.json
    {
      "run_list": [
        "recipe[yum::epel]",
        "recipe[apache2::mod_php5]",
        "recipe[database::mysql]",
        "recipe[mysql::server]",
        "recipe[zabbix]",
        "recipe[zabbix::database]",
        "recipe[zabbix::server]",
        "recipe[zabbix::web]"
      ],
      "zabbix": {
        "server": {
          "install": true
        },
        "web": {
          "install": true,
          "fqdn": "hostname"
        },
        "agent": {
          "servers": [
            "hostname",
            "hostname"
          ]
        },
        "database": {
          "dbpassword": "mysql",
          "rds_master_user": "mysql",
          "rds_master_password": "mysql"
        }
      },
      "mysql": {
        "server_debian_password": "mysql",
        "server_root_password": "mysql",
        "server_repl_password": "mysql"
      }
    }
    
    chef-solo -j /chef-repo/cookbooks/zabbix.json

    □実行結果
    • recipe[zabbix]のみを指定するとzabbix_agentのみがインストールされます
    • zabbix-serverのバージョンは2.0.3
    • /opt/zabbix配下にインストールされる
    • Forbiddenになる場合はパーミッションが755になっていることとSELinuxが無効になっていることを確認する
    • chmod 755 /opt/zabbix; chmod 755 /opt/zabbix/*
    • http://localhost/でzabbixの管理画面が表示されます(apacheのDocumentRootに登録される)
    • zabbix-serverインストール時に以下のエラーになる場合はリンクの記事を参考にしてください
    • Node attributes are read-only when you do not specify which precedence level to set
    • http://kakakikikeke.blogspot.com/2013/05/chefzabbix-cookbooksnode-attributes-are.html
    • Option source must be a kind of [String]! You passed {"default"=>"zabbix_agentd.init-rh.erb"}.
    • http://kakakikikeke.blogspot.com/2013/05/chef-zabbixoption-source-must-be-kind.html
    • FATAL: Errno::ENOENT: execute[generate-module-list] (apache2::default line 68) had an error: Errno::ENOENT: No such file or directory - /usr/local/bin/apache2_module_conf_generate.pl /usr/lib64/httpd /etc/httpd/mods-available
    • 理由はわからないがchef-soloを再実行すると上手く動作する
    • zabbixのDBはmysqlがインストールされバージョンは5.1.69、ユーザ名/パスワードはzabbix/mysqlとなる
    • デフォルトのzabbixのユーザ名/パスワードはadmin/zabbixになります

    ■Squid
    □実行
    • git clone git://github.com/opscode-cookbooks/squid.git

    vim /chef-repo/cookbooks/squid.json
    {
      "run_list": [
        "recipe[squid]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/squid.json

    □実行結果
    • Squid Cache: Version 3.1.10

    ■PHP
    □実行
    • git clone git://github.com/opscode-cookbooks/php.git

    vim /chef-repo/cookbooks/php.json
    {
      "run_list": [
        "recipe[php]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/php.json

    □実行結果
    • php 5.3.3

    ■Apache2
    □実行
    • git clone git://github.com/opscode-cookbooks/apache2.git

    vim /chef-repo/cookbooks/apache2.json
    {
      "run_list": [
        "recipe[apache2]",
        "recipe[apache2::mod_ssl]",
        "recipe[apache2::mod_proxy_ajp]"
      ],
      "apache": {
        "default_site_enabled": true
      }
    }
    
    chef-solo -j /chef-repo/cookbooks/apache2.json

    □実行結果
    • Apache/2.2.15
    • 80番ポートにブラウザでアクセスするとapacheのデフォルト画面が見れる

    SSLの設定に関して
    443番はプロセスがあがってますが、画面は見れない
    とりあえず画面をSSLで見れるように設定するには以下を実施する
    cd /etc/httpd/sites-available
    cp default default-ssl
    cd /etc/httpd/sites-enabled/
    ln -s /etc/httpd/sites-available/default-ssl 000-default-ssl
    emacs 000-default-ssl
    以下の部分を修正
    ポート番号を修正
    80⇒443
    
    SSLの設定を追記
    SSLEngine On
    SSLCertificateFile /etc/httpd/ssl/server.crt
    SSLCertificateKeyFile /etc/httpd/ssl/server.key
    
    cd /etc/httpd/ssl/
    openssl genrsa -aes128 1024 > server.key
    openssl req -new -key server.key > server.csr
    openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt
    service httpd restart

    ■Capistrano
    □実行
    wget http://community.opscode.com/cookbooks/capistrano/versions/0_7_0/downloads
    tar xvzf capistrano.tar.gz
    ※githubで公開はされてないようです

    vim /chef-repo/cookbooks/capistrano.json
    {
      "run_list": [
        "recipe[capistrano]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/capistrano.json

    □実行結果
    • Capistrano v2.15.4
    • インストール自体はgemから実施している様子
    • 依存しているパッケージはないけど、ruby, gemのインストールは必須だと思われる

    ■Git
    □実行
    以下依存関係のあるcookbooksです ["build-essential", "dmg", "yum", "runit", "chef_handler", "windows", :git] git://github.com/opscode-cookbooks/... から全てgit cloneしてください

    vim /chef-repo/cookbooks/git.json
    {
      "run_list": [
        "recipe[git]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/git.json

    □実行結果
    • git version 1.7.1

    ■Erlang
    □実行
    git clone git://github.com/opscode-cookbooks/erlang.git
    git clone git://github.com/opscode-cookbooks/apt.git
    git clone git://github.com/opscode-cookbooks/build-essential.git
    git clone git://github.com/opscode-cookbooks/yum.git

    vim /chef-repo/cookbooks/erlang.json
    {
      "run_list": [
        "recipe[erlang]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/git.json

    □実行結果
    • Erlang R14B04 (erts-5.8.5)

    ■Python
    □実行
    git clone git://github.com/opscode-cookbooks/python.git
    git clone git://github.com/opscode-cookbooks/yum.git
    git clone git://github.com/opscode-cookbooks/build-essential.git

    vim /chef-repo/cookbooks/python.json
    {
      "run_list": [
        "recipe[python]"
      ]
    }
    
    chef-solo -j /chef-repo/cookbooks/python.json

    □実行結果
    • python 2.6.8