2013/02/18

Vagrant + chef-solo 使って nginx + sinatra で HelloWorld!

Markdown 手順書スラスラ書けてまじイノベーティブ!とか言ってたやつ誰だ! ( おれだ! )

Vagrant + chef-solo で  nginx + sinatra で HelloWorld! してみました。

amazedkoumei / vagrant-centos-nginx_sinatra

 

きっかけをくれたはこちらのエントリ 

Vagrant - naoyaのはてなダイアリー 

ちょっとしたテストのために壊してもいい環境が欲しいというのにももちろん使えますし、方々を見ていると組織の中で標準化された開発環境を全開発者に配布するときなんかにも使われているようですね。自分は EC2 でホストしているステージングサーバーへ chef-solo を流す前に vagrant で調整して、問題なければステージングにも chef を適用するのに使ってます。 



これは熱い。欲しくないプログラマがいるのかと。

 

サンプルリポジトリも用意してくれていたので、もちのろんで流用させてもらいました。

ただですね、、そのまま使うとまっさらなぼくの大切なVMにゼノブレイドのキャラクタがユーザとして追加されちゃうのです・・なんぞこれw

naoya / vagrant-centos-rbenv_chef

 

 

Vagrant の setup

作業ディレクトリを準備して

$ mkdir ~/vagrant-centos-nginx_sinatra
$ cd ~/vagrant-centos-nginx_sinatra

naoya さんとこに記載されてるコマンドをそのまま実行。

$ gem install vagrant
$ vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box
$ vagrant init centos
$ vagrant up

で、VM立ち上がります(まじで!)

このままだと naoya のはてなダイアリーコピペブログなので以下に補足説明をば。

 

$ vagrant box add [VM名] [ダウンロード先] でVMイメージをダウンロードしています。ここにダウンロードされます。

~/.vagrant.d/boxes/

上記のコマンド実行後の  ~/.vagrant.d/boxes/ はこんな感じ

$ls ~/.vagrant.d/boxes/centos/
Vagrantfile box-disk1.vmdk box.ovf

 

VMのダウンロード先の一覧はこちら。

A list of base boxes for Vagrant - Vagrantbox.es

 

Vagrantboxes なる拡張をインストールすることで

$ sudo vagrant vagrantboxes search

でわざわざブラウザに移動しなくてもコマンドラインから探せるようになるらしい。(私の環境では動作せず。どぼちて?)

 

 ~/.vagrant.d/boxes/ に VMイメージができたら $ vagrant init で CurrentDirectory に Vagrantfile が作成されます。

$ vagrant init centos
$ ls
Vagrantfile

 

その他のコマンドは vagrant -h で確認できますのでご確認をば。

 

Vagrant 導入の利点はというと Virtualbox GUI からの永遠のお別れといったところでしょうか。

ミラーサイトにいってイメージ落としてもっさりしたGUIでセットアップ、とか、起動のたびにもっさりしたGUI立ちあげてクリッククリックとか、そういったストレスから解放されますよっと。

言葉でいうと陳腐ですけどこれ意外と大きい。

以前に Rubymotion の利点としてXcodeからの解放!と書いたことがあるんですけど、それに似ています。

 

慣れてしまうとなかなかあれですが、解放されて初めて、ああ、おれの心はあの重いGUIに傷つけられていたのだな、と気がつくのであります。

 

Virtualbox の弱点 Vagrant が華麗に補う素敵なコラボレーション♪

 

 

chef-solo の setup - kitchenの作成と構成

 ますは knife-solo をインストール

$ gem install knife-solo

 

Vargantfile のあるディレクトリで  knfe solo init DIRECTORY を実行すると Chef の 基本構造を作成してくれます。

この基本構造の名前を探したのですがよくわかりませんでしたので knife-solo のドキュメント の表現を借りて kitchen と呼びますね!( 以下のコマンドでは chef-repo 配下が kitchen ) ( わかりにくいな。ごめんなさい。 )

$ knife solo init chef-repo
$ tree chef-repo/
chef-repo/
├── cookbooks
├── data_bags
├── nodes
├── roles
├── site-cookbooks
└── solo.rb

 

各構成要素はこんな感じ (ざっくり)

  • coobooks
  • data_bags
  • nodes
    • cookbook には変数を与えることができるのです。これの host ごとの変数を JSON で定義する
      • http://wiki.opscode.com/display/chef/Attributes#Attributes-NodeAttributes
      • うまく変数を切り出せてる cookbook は nodes の編集だけで、自分の環境に適合させることができるわけですな。
      • 逆にうまく切り出せてない cookbook は cookbook 自体を修正しないと自分の環境に適合させることができません。
        • 実害としては、独立しているはずの cookbook を git submodule として管理できない
    • 変数は cookbooks 配下 または site-cookbooks 配下に opscode-cookbooks / ohai を設置することで拡張可能
    • knife solo cook vagrant@HOSTNAME 実行時には node/HOSTNAME.json が読み込まれる (  vagrant-centos-nginx_sinatra では nodes/192.168.33.11.json )
      • なので Vargant 起動時にも HOSTNAME.json を読み込むようにしておくのが吉
        • Vargant 起動時の読み込み JSON は Vargantfile で設定できます。
  • roles
  • site-cookbooks
    • cookbooks と同じ
    • ただし cookbooks と site-cookbooks に同名の cookbook が存在した場合には site-cookbooks の cookbook のみが実行される。( cookbooks 内のcookbookは無視される! )
      • いまいちこの仕様の素敵さ加減がわかりません。
        • クラサバ型Chef との整合性の都合上えいや!で盛り込んだ?
  • solo.rb

 

chef-solo の setup - cookbookの作成と構成

続いて cookbook を作ります。

$ cd chef-repo/
$ knife cookbook create nginx_sinatra -o site-cookbooks
$ tree site-cookbooks/nginx_sinatra/
site-cookbooks/nginx_sinatra/
├── CHANGELOG.md
├── README.md
├── attributes
├── definitions
├── files
│   └── default
├── libraries
├── metadata.rb
├── providers
├── recipes
│   └── default.rb
├── resources
└── templates
       └── default

 

各構成要素はこんな感じ (またもやざっくり)

 

chef-solo の ドキュメント

あまりにざっくりなのでリンクを貼っておきますね。

 

 

wiki と docs と2つのドキュメントがあるのですが、wiki から docs への移行を進めているようにみえます。

現時点では wiki の方が情報が充実していること、wiki のページトップには docs へのリンクが貼ってあることから、まずは wiki を見て、それから docs を見るのがオススメです。

 

chef-solo の実行

cookbook を シコシコと書く もしくは 既存の cookbooks を流用するなどして chef-solo の設定を完了したらいよいよ実行です。

cookbook の既存資産はこのあたり

 

Vagrant には chef-solo 実行オプションが実行されているので Vagrantfile でパラメータ指定すれば vagrant up 時に自動で chef-solo を実行してくれます。

参考: https://github.com/amazedkoumei/vagrant-centos-nginx_sinatra/blob/master/Vagrantfile

また knife-solo cook を使えば Vagrant を再起動することなく chef-solo を実行できます。

$ knife solo cook vagrant@192.168.33.11

 

事前に knife-solo prepare の実行や ~/.ssh/config の設定が必要になります。詳しくはこちら!→ Vagrant - naoyaのはてなダイアリー

 

2013.02.27 追記

SublimeText から knife-solo を実行できる plugin 書きました。

SublimeKnifeSolo - SublimeText の Command Palette から knife solo を実行できる Plugin を書いたでござる | 諸葛亮孔明もびっくりですわ のブログ

 

最後に

思ったより・・分量あって・・けっこうgdgdに・・( ゚∀゚)・∵. グハッ!!

chef-solo は コマンド1発で いつでもどこでも同じ環境を作り出せるのが素敵ですね。

キモとなる recipe が実行がシーケンシャルなうえにブロックで記述できるので、相当に可読性高いだろうと予想したのですが、構成要素が多いために、やや学習コストが高くなってしまってるところが悩ましいですね。

中規模・大規模な現場だと導入したはいいが結局一部の人間しか理解できねえwwwww みたいなことになってしまうやも・・ならないかも・・メンバの意識とか現場の空気やらにもよるんでしょうな。

 

環境構築ツールではなくテスト・ツールですけど Cucumber なるものがあるようですね。

テストを自然言語風味で書けて日本語にも対応してるとか。こんな感じに書けるようです。すげえ!

Cucumber, ChefSpecとchefでテスト駆動のサーバ構築管理 #infrastructure #Cucumber #Ruby #chef #chefspec - Qiita

 

ソース即ドキュメント、とか美しすぐる

 

 

Comments