2013-04-05

chef-solo を Ruby-2.0.0 で試す —— 例: Objective-C コンパイル環境の用意

Ruby の Gem で chef というのが流行しているらしい。chef は、環境構築を自動化するプログラム。Shell Script を環境構築用に最適化して、スクリプト (レシピと呼ぶらしい) を ruby の文法で書けるようにしたもの、と理解すれば良いかな。

Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]
Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]
入門Chef Solo - Infrastructure as Code
入門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