chef omnibus installer は /opt 以外にもファイルを作るらしい

昨日は Chef Casual Talk Vol.1 に参加してきました。
chef に関しては、これだという定石がなかなか見つかっていない段階のように感じられるので
こうして情報交換できる場があるというのはとても嬉しいことですね。
これから毎月開催していくとのことなので、次回にも期待したいと思います。

ところで、その Casual Talk の中でいままで知らなかったことを教えてもらったので、
ちょっと突っ込んで調べてみました。

chef omnibus installer がやっていること

omnibus installer といえば、みんな大好き knife-solo などでも使われている chef の統合インストーラです。
ruby から gem から、chef の実行に必要な物がすべて含まれているオールインワンの素敵パッケージさんです。

僕もいままで chef 環境をどうやって作るかの調査の中で、何度かどうインストールされるのか見ていたのですが、
ずっと/opt/chef 以下にファイルが配置されると信じていました。
が、昨日の Casual Talk で教えてもらったのは /usr/bin 以下に、実行ファイルの symlink を作るというものです。


本当なの!? ということで、実際に omnibus installer のソースコードをみてみる事にしましょう。
postinst ファイルを見てみると、56行目以降でこんなことをしています。

# rm -f before ln -sf is required for solaris 9
rm -f /usr/bin/chef-client
rm -f /usr/bin/chef-solo
rm -f /usr/bin/knife
rm -f /usr/bin/shef
rm -f /usr/bin/ohai

ln -sf $INSTALLER_DIR/bin/chef-client /usr/bin || error_exit "Cannot link chef-client to /usr/bin"
ln -sf $INSTALLER_DIR/bin/chef-solo /usr/bin || error_exit "Cannot link chef-solo to /usr/bin"
ln -sf $INSTALLER_DIR/bin/chef-apply /usr/bin || error_exit "Cannot link chef-apply to /usr/bin"
ln -sf $INSTALLER_DIR/bin/chef-shell /usr/bin || error_exit "Cannot link chef-shell to /usr/bin"
ln -sf $INSTALLER_DIR/bin/knife /usr/bin || error_exit "Cannot link knife to /usr/bin"
ln -sf $INSTALLER_DIR/bin/shef /usr/bin || error_exit "Cannot link shef to /usr/bin"
ln -sf $INSTALLER_DIR/bin/ohai /usr/bin || error_exit "Cannot link ohai to /usr/bin"

/usr/bin 以下のファイルを消して、/opt/chef/bin から symlink を張っています。
既存のファイルを消すというのはちょっと乱暴な感じがしますね :-p

他にも見ていくと、/etc/chef 以下に client.rb を使っている場面も見受けられます*1

  mkdir -p ${CONFIG_DIR} || error_exit "Cannot create ${CONFIG_DIR}!"
  (
  cat <<'EOP'
log_level :info
log_location STDOUT
EOP
  ) > ${CONFIG_DIR}/client.rb


というわけで、これまで chef omnibus installer は /opt/chef 以下にしかファイルを作らず、既存の環境に影響を与えない閉じたインストーラだと思っていましたが、
この動きを見ると必ずしもそうではないようです。

ついでにこの動きが issues で話題に登っていないか調べてみると、
#CHEF-2578 Omnibus installer should not put symlinks into /usr/binというチケットで議論されているようです。
どうやら、ここでの意見は /usr/bin 以下には symlink を作るべきだ、という意見が多いようです。

まとめ

chef omnibus installer は(いまのところ) /opt/chef, /usr/bin, /etc/chef にファイルを作るので、そのつもりでよろしく。

*1:-u オプションで chef_url を指定すると作らないようです