Markdown 手順書スラスラ書けてまじイノベーティブ!とか言ってたやつ誰だ! ( おれだ! )
Vagrant + chef-solo で nginx + sinatra で HelloWorld! してみました。
きっかけをくれたはこちらのエントリ
ちょっとしたテストのために壊してもいい環境が欲しいというのにももちろん使えますし、方々を見ていると組織の中で標準化された開発環境を全開発者に配布するときなんかにも使われているようですね。自分は EC2 でホストしているステージングサーバーへ chef-solo を流す前に vagrant で調整して、問題なければステージングにも chef を適用するのに使ってます。
これは熱い。欲しくないプログラマがいるのかと。
サンプルリポジトリも用意してくれていたので、もちのろんで流用させてもらいました。
ただですね、、そのまま使うとまっさらなぼくの大切なVMにゼノブレイドのキャラクタがユーザとして追加されちゃうのです・・なんぞこれw
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
$ 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
- http://wiki.opscode.com/display/chef/Chef+Solo#ChefSolo-Roles
- ユーザごとの変数をJSONで定義をする(らしい)
- vagrant-centos-nginx_sinatra では使いませんでした ( つまりよくわかってません! )
- 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 を設置することで拡張可能
- host 固有の変数 ( 例えばIPアドレスやホスト名 ) などを ohai が自動設定してくれる
- 自動設定される変数の一覧はこちら → Automatic Attributes — Chef Docs
- 自動設定された Automatic Attribute を nodes で上書きすることはできません。→ Attributes - Chef - Opscode Open Source Wiki
- 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
- chef-solo でも role 使えますよ、という説明 http://wiki.opscode.com/display/chef/Chef+Solo#ChefSolo-Roles
- role の説明 http://wiki.opscode.com/display/chef/Roles
- たぶん複数 host を管理する場合に、host をグルーピングしてそれぞれのグループごとに変数を JSON で定義できますよ、ということ ( だと思われ)
- vagrant-centos-nginx_sinatra では使いませんでした ( つまりよくわかってません! )
- 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
各構成要素はこんな感じ (またもやざっくり)
- attributes
- kitchen の nodes で指定可能な変数が未指定だったときの変数のデフォルト値を定義します。
- 定義の仕方はこんな感じで http://wiki.opscode.com/display/chef/Attributes#Attributes-CookbookAttributes
- definitions
- resource の定義をします。
- resource とは recipe から呼ぶことができるメソッドのことです。詳しくはこちら → http://wiki.opscode.com/display/chef/Resources
- デフォルトでも使用可能な resource いぱーい
- directory
- file
- git
- template
- このあたりはよく使う
- しかしながら、これらだけでやりくりしようとすると可読性の観点や DRY の観点から好ましくないわけですな
- で、definition の出番ですよっと
- 例えば nagios cookbook だと conf ファイル作成の definistion を定義してますね! https://github.com/opscode-cookbooks/nagios/blob/master/definitions/nagios_conf.rb
- files
- http://wiki.opscode.com/display/chef/Resources#Resources-CookbookFile
- host ごとのファイルの定義っぽい
- vagrant-centos-nginx_sinatra では使いませ(ry
- libraries
- http://wiki.opscode.com/display/chef/Libraries
- Chef::Recipe とかの Chef で使用する Ruby Classの拡張をするらしい
- vagrant-centos-nginx_sinatra では使(ry
- providers
- Chef を Ruby ぽくオブジェクティブに拡張するためのキモになるっぽい(また曖昧なものいいですみません
- Lightweight Resources and Providers (LWRP)
- スライドもある→ http://www.slideshare.net/jtimberman/understanding-lwrp-development
- providers を実装している cookbook は割りとたくさんあるので参考にしつつ1個作ってみるときちんと把握できそう。
- そうです。vagrant-centos-nginx_sinatra では使いませんでした ( つまりよくわかってません!すみませんすみません )
- recipes
- chef のキモ
- http://wiki.opscode.com/display/chef/Recipes
- 記述した内容がシーケンシャルに実行されます。
- resources
- http://wiki.opscode.com/display/chef/Resources
- 関連項目→ definitions, providers
- templates
- erb 形式で記述します
- template resource を recipe 内で call して動的にファイル作成!
- http://wiki.opscode.com/display/chef/Templates
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
ソース即ドキュメント、とか美しすぐる