Ruby の Gem で chef というのが流行しているらしい。chef は、環境構築を自動化するプログラム。Shell Script を環境構築用に最適化して、スクリプト (レシピと呼ぶらしい) を ruby の文法で書けるようにしたもの、と理解すれば良いかな。
Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]
入門Chef Solo - Infrastructure as Code
先日、Objective-C 用の環境を構築した。忘れないように、chef のレシピに残してみる。
Ruby の環境
rvm で管理している ruby-2.0.0 上で作業する:
$ rvm list rvm rubies ruby-1.9.3-p392 [ i686 ] =* ruby-2.0.0-p0 [ i686 ] # => - current # =* - current && default # * - default
chef のインストール
chef は複数のレシピを保持する chef サーバーと、そのクライアントたる chef クライアントの二つから成る。ただ、自分のマシンにレシピを持っておく (もしくは github などに保存しておく) なら chef サーバーは不要。
入門から入りたいので、難しい chef サーバーは使わない。chef クライアントだけ使ってみる。chef クライアントのインストールは次の通り:
$ gem install chef
これで、chef-solo コマンドや knife コマンドという主要コマンドがインストールされる。
format.rb の解決
chef-solo -v でバージョンを見ようとすると、format.rb がないというエラーが出て止まる。Ruby 2.0 になった時に RubyGems のディレクトリー構成が変わったのが原因とのこと。
上記ページがダミーの rubygems/format の作り方を書いているので真似をした:
$ cd ~/my-project $ bundle gem rubygems-format-dummy create rubygems-format-dummy/Gemfile create rubygems-format-dummy/Rakefile create rubygems-format-dummy/LICENSE.txt create rubygems-format-dummy/README.md create rubygems-format-dummy/.gitignore create rubygems-format-dummy/rubygems-format-dummy.gemspec create rubygems-format-dummy/lib/rubygems/format/dummy.rb create rubygems-format-dummy/lib/rubygems/format/dummy/version.rb Initializating git repo in /home/ataka/my-project/rubygems-format-dummy $ cd rubygems-format-dummy $ touch lib/rubygems/format.rb $ git add lib/rubygems/format.rb $ git commit -m 'initial commit' $ emacs -nw -q rubygems-format-dummy.gemspec (TODO とあるところを適当に書き換える) $ rake install
以上。
もう一度、chef-solo でバージョン確認。
$ chef-solo -v Chef: 11.4.0
上手くいった。
設定ファイル
まず、knife configure コマンドを実行する。chef-repo 以外は全てデフォールトのままで良いのかな?
$ sudo knife configure -i sudo: knife: コマンドが見つかりません
ありゃ、knife が見つからない。ああ、PATH の問題か。
$ sudo env PATH=$PATH knife configure -i
chef-repo は /var/chef-solo にした。
chef-solo には 2 つの設定ファイルがある。なくても動くけど、小さな設定ファイルなので書いちゃう。
1 つ目は /var/chef/solo.rb
:
file_cache_path "/var/chef-solo"
cookbook_path ["/var/chef-solo/cookbooks"]
キャシュと cookbook の置き場所を指定する。ちなみに cookbook の下に recipe というスクリプトを置く。recipe は後で書く。
2 つ目は /var/chef/node.json
:
{
"run_list": [ "recipe[objc]" ]
}
Recipe を書く
シンプルな Recipe を一つ。
knife コマンドでレシピの用意をする。
$ sudo env PATH=$PATH knife cookbook create tmux WARNING: No knife configuration file found ** Creating cookbook tmux ** Creating README for cookbook: tmux ** Creating CHANGELOG for cookbook: tmux ** Creating metadata for cookbook: tmux
WARNING が出たけど無視。
/var/chef-solo/cookbooks/tmux/recipes/default.rb
に以下のコードを追記:
package "tmux"
action :install
end
これでインストール・コマンドを行ってくれるはず。
chef-solo でレシピを指定して実行。
$ sudo env PATH=$PATH chef-solo -o tmux Starting Chef Client, version 11.4.0 [2013-04-05T10:24:49+09:00] WARN: Run List override has been provided. [2013-04-05T10:24:49+09:00] WARN: Original Run List: [] [2013-04-05T10:24:49+09:00] WARN: Overridden Run List: [recipe[tmux]] Compiling Cookbooks... Converging 1 resources Recipe: tmux::default * package[tmux] action install - install version 1.6-2 of package tmux Chef Client finished, 1 resources updated
成功。
Objective-C の開発環境構築
過去記事を参考に... 基本、必要なパッケージさえインストールすればいいだけ。
knife コマンドで objc レシピを作る。
$ sudo env PATH=$PATH knife cookbook create objc
/var/chef-solo/cookbooks/objc/recipes/default.rb
に追記。
%w{build-essential gobjc libgnustep-base-dev gnustep gnustep-devel}.each do |pkg|
package pkg do
action :install
end
end
Ruby の文法を使えるのがありがたい。
インストール。今回、node.json をちゃんと書いているので、そちらを指定する。
$ sudo env PATH=$PATH chef-solo -j /etc/chef/node.json Starting Chef Client, version 11.4.0 Compiling Cookbooks... Converging 5 resources Recipe: objc::default * package[build-essential] action install (up to date) * package[gobjc] action install - install version 4:4.7.2-1ubuntu2 of package gobjc * package[libgnustep-base-dev] action install - install version 1.22.1-4ubuntu1 of package libgnustep-base-dev * package[gnustep] action install - install version 7.7 of package gnustep * package[gnustep-devel] action install - install version 7.7 of package gnustep-devel Chef Client finished, 4 resources updated
成功。システム全体のレシピを扱う場合は node.json に複数のレシピ (今回は一つだけだったけど) を書いて -j オプションで指定。レシピを選択して実行する場合は、-o オプションでレシピ名を指定する。
あとがき
今回はインストールだけだったけど、chef を使えば /etc ディレクトリー下のファイルを環境に応じて作成したり (template)、ユーザーやグループを作成したりできる。
最後に感想。knife configure が、ちと分からない。chef は日々進化しているようなので、最新の情報を探すのが大変だった。はたして、この情報もどれ位い最新に沿ったものなのか...
No comments:
Post a Comment