Omnibus Chef Packaging を試してみた

ちょっと古いネタだけど、2012/06/29 にリリースされた "Omnibus Chef Packaging" というやつを試してみた。「Chef をパッケージ化して一括インストールする仕組み」という感じだと思う。

特徴としては「CentOS/Debian/Ubuntu/Amazon Linux のように複数のプラットフォームで利用できる」というのと「chef-solo や chef-client を実行するのに必要なソフトウェア (ruby とか rubygems) を /opt/chef というディレクトリ配下に隔離して置いてくれる」の 2 つが挙げられる。

使ってみた

使い方は簡単で、このページでインストールしたい OS・バージョンを選択し、表示されたコマンドを OS 上で実行するだけ。CentOS・5.x の場合はこんなのが表示された (rvm とかと同じ方式)。

curl -L http://www.opscode.com/chef/install.sh | bash

実際にまっさらの CentOS 5.6 64bit Server インスタンス上で実行すると、下記のような実行結果になる。ダウンロードされた install.sh が、今度は CentOS 向けの rpm ファイルをダウンロードし、インストールを完了させる (Debian 系の場合は .deb ファイルがダウンロードされるはず)。

[root@localhost ~]# curl -L http://www.opscode.com/chef/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5204  100  5204    0     0   2981      0  0:00:01  0:00:01 --:--:-- 2558k
Downloading Chef 10.12.0-1 for el...
--2012-08-03 16:16:50--  http://s3.amazonaws.com/opscode-full-stack/el-5.7-x86_64/chef-full-10.12.0-1.x86_64.rpm
s3.amazonaws.com をDNSに問いあわせています... 207.171.189.80
s3.amazonaws.com|207.171.189.80|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 18305984 (17M) [audio/x-pn-realaudio-plugin]
`/tmp/chef-full-10.12.0-1.x86_64.rpm' に保存中

100%[============================================================================================>] 18,305,984  1.63M/s 時間 12s

2012-08-03 16:17:03 (1.44 MB/s) - `/tmp/chef-full-10.12.0-1.x86_64.rpm' へ保存完了 [18305984/18305984]

Installing Chef 10.12.0-1
準備中...                ########################################### [100%]
   1:chef                   ########################################### [100%]

インストールが完了すると、必要最低限のコマンド (knife, shef, ohai, chef-solo, chef-client) が普通に使えるようになっている。
コマンド群は /usr/bin 配下にシンボリックリンクの形でインストールされており、実体は /opt/chef に配置されている。

[root@localhost ~]# which knife
/usr/bin/knife
[root@localhost ~]# find /usr/bin -mtime -1 -ls
5794282   32 drwxr-xr-x   2 root     root        28672  8月  3 16:17 /usr/bin
5798546    0 lrwxrwxrwx   1 root     root           19  8月  3 16:17 /usr/bin/knife -> /opt/chef/bin/knife
5798548    0 lrwxrwxrwx   1 root     root           18  8月  3 16:17 /usr/bin/shef -> /opt/chef/bin/shef
5798550    0 lrwxrwxrwx   1 root     root           18  8月  3 16:17 /usr/bin/ohai -> /opt/chef/bin/ohai
5798545    0 lrwxrwxrwx   1 root     root           23  8月  3 16:17 /usr/bin/chef-solo -> /opt/chef/bin/chef-solo
5798544    0 lrwxrwxrwx   1 root     root           25  8月  3 16:17 /usr/bin/chef-client -> /opt/chef/bin/chef-client

/opt/chef はこんな感じ。/opt/chef/bin に各コマンドの実体があり、/opt/chef/embedded にその他の必要なファイルが保存されている。

[root@localhost ~]# tree -L 2 /opt/chef
/opt/chef
|-- bin
|   |-- chef-client
|   |-- chef-solo
|   |-- erubis
|   |-- knife
|   |-- ohai
|   |-- restclient
|   |-- shef
|   `-- tt
|-- embedded
|   |-- bin
|   |-- include
|   |-- lib
|   |-- share
|   `-- ssl
`-- version-manifest.txt

7 directories, 9 files

Chef も Ruby も比較的新しいバージョンが入っている。

[root@localhost ~]# /opt/chef/bin/chef-solo -v
Chef: 10.12.0
[root@localhost ~]# /opt/chef/embedded/bin/ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]

仕組みとか

上記は CentOS の例だけど、Omnibus Chef Packaging では他の OS (Debian/Ubuntu 等) をサポートしているので、rpm ファイル・deb ファイルの両方を作ったりするのが大変そうに思うが、opscode はこれを優雅かつオープンな方法で解決していてかっこいい。

まず opscode/omnibus-ruby というライブラリがあり、これは Ruby の DSL で簡潔にさまざまなソフトウェアのビルド方法を記述できる。

この omnibus-ruby を使って実際のソフトウェアのビルド方法を opscode/omnibus-software に記述し、さらに omnibus-software のパーツを組み合わせて opscode/omnibus-chef で実際の複数プラットフォーム向け Chef 向けパッケージを作成しているという流れ。

だから、omnibus-ruby を使って ruby や chef 以外のビルド手順を記述することができるし、omnibus-software に公開されているパーツを使って自分好みの Omnibus パッケージを作成することも可能になっている。自分は opscode のこういうインターネットコミュニティに開かれているところが好きだな。

所感

Chef というツールにおいて「Chef 自体は Chef のレシピでインストールできない」という当たり前の問題があって、今までは bootstrap スクリプトでゴリゴリやっていたのを omnibus の仕組みを使ってものすごく簡単に済ませることができるようになったのが調子いいと思った。Chef 実行までに必要な ruby とか rubygems を一式 /opt/chef に隔離してくれるのも構成として美しい。

ちなみに 公式ブログ記事では「オープンソース版 Chef サーバも omnibus でインストールできるようにする予定だよ」と書いてあるから、異様に難しいことで有名な「CentOS に Chef サーバをインストールする」という苦行をコマンド一発で完了させられる日も遠くない、はず。

あと、chef gem 最新安定版 10.12.0 のコードを見ても、knife bootstrap のデフォルトが omnibus を使った chef-full になっているようなので、この仕組みに慣れておいて損はないと思う。

参考:

* https://github.com/opscode/chef/blob/master/chef/lib/chef/knife/bootstrap.rb
* https://github.com/opscode/chef/blob/master/chef/lib/chef/knife/bootstrap/chef-full.erb