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