開発サーバに chef を入れるときの 11の方法

タイトルは釣りです。11個もやり方をしらないまま書き始めます。

最近 chef が流行っていますが、みなさんどうやって各サーバに chef をインストールしていますか?

ここでは僕がいままで紆余曲折していた方法を紹介します。
列挙だけするとこんな感じです。

  • vagrant の VM イメージに入っているもの
  • omnibus installer を使う
  • knife solo を使う
  • OS の ruby 環境に chef を入れる
  • RVM 環境を作って chef を入れる
  • rbenv 環境を作って chef を入れる
  • roundsman を使って chef を入れる

vagrant の VM イメージに入っているもの

vagrant の VM イメージには、大抵 ruby と chef がインストールされています。
veewee を使ってあたらしい VM イメージを作成すると必ずインストールされていますね。

vagrant provision コマンドなどを使うとこの方法になりますね。

メリットは

  • 準備がいらないということ

デメリットは

  • VM に入っている chef は大抵古い。バージョンアップは手動でやる必要がある
  • vagrant 以外の環境で chef を使う場合に、他のやり方を取る必要がある

というものです。

様々な実験を行うにはお手軽な方法なのですが、実環境(本番系)に入れようと思うと別の方法を探さなくてはならず、
最終的に僕はこの方法は利用していません。

omnibus installer を使う

chef omnibus installercurl さえあれば chef 環境を作ることができます。
ruby も同梱されているので、何も考えずに使いはじめることができます。
rpm や deb などの形式でも配布されているので、あらかじめダウンロードするのであれば curl すら必要ありません。

また、/opt/chef にインストールされるため、他のプログラムに影響を及ぼさずに使いはじめることができます。

メリットは

  • お手軽簡単
  • 環境を選ばない

デメリットはあまりないのですが、強いてあげると

  • ruby のプログラムをデプロイする場合は別途 ruby を入れる必要がある
  • omnibus installer を実行する方法を考える必要がある (なるべくログインしたくない)
  • chef-solo 使いの場合は実行方法を別途考える必要がある

というものです。
バランスのとれた方法だと思います。

knife-solo を使う

id:naoya さんの記事ではじめて知ったのですが、knife-solo というものがあります。

knife-solo を入れて

$ knife solo prepare

とするだけで chef omnibus installer を実行して chef をインストールしてくれます。
また、chef-solo のリモート実行を行うこともできるので、運用の際にも便利です。

メリットは

  • インストールがかんたん
  • 環境を選ばない
  • chef-solo の実行もできる

デメリットはほとんどありません。やはり強いて挙げるとすれば

  • 複数台になった場合に、それぞれに実行する必要がある

といったところです。
非常に便利だと思います。

OS の ruby 環境に chef を入れる

Linux の場合だと distro. に ruby のパッケージが存在するので、ログインして

$ sudo apt-get install ruby
$ sudo gem install chef

として chef を使いはじめるというものです。

メリットは

  • 結構簡単

デメリットは

  • ruby が古くて切ない
  • 手動で作業しないといけない
  • chef-solo 使いの場合は実行方法を別途考える必要がある

一時期試していましたが、すぐに挫折しました。

RVM 環境を作って chef を入れる

RVM で ruby をビルドして、chef を入れるパターンです。

以前説明した rvm-capistrano などを使えば、RVM と Ruby のインストールには手間をかけずに済みます。

また、capistrano

task :install_chef do
  run "gem install chef"
end
after 'deploy:setup', 'install_chef'

などと設定すれば、chef のインストールも rvm-capistrano とセットで行うことができます。

メリットは

  • あたらしい Ruby を使うことができる
  • 自動化可能
  • 複数のホストに対して同時にインストールを実行できる

デメリットは

  • capistrano (他)が使えないと手間が発生
  • Ruby のビルドが発生する。RHEL 5.x系だと EPEL のお世話になったり…
  • chef-solo 使いの場合は実行方法を別途考える必要がある

rbenv 環境を作って chef を入れる

rbenv で ruby をビルドして、chef を入れるパターンです。

この記事で紹介した capistrano-rbenv などを使えば、rbenv と Ruby のインストールには手間をかけずに済みます。

先ほどの rvm と同様の方法で chef のインストールまで済ませることができます。

メリット・デメリットは RVM と変わりません。
どちらの ruby マネージャが好みかによって、どちらを選んでも良いのではないかと思います。

roundsman を使って chef を入れる

最後は僕が今使っている方法です。
roundsman という capistrano のプラグインを利用して chef をインストールします。*1
ruby を入れる部分は前述の rvm-capistranocapistrano-rbenv を利用します。

roundsman を使うと chef-solo をリモート実行することができます。
利用する際は config/deploy.rb に chef タスクを定義してあげます。

set :run_list, [...]

namespace :chef do
  task :default do
    roundsman.run_list fetch(:run_list)
  end
end

あとは chef タスクを実行する際に(必要があれば) chef のインストールを行なってくれます。

メリットは

  • chef-solo の実行まで面倒を見てくれる
  • 複数ホストでの実行ができる

デメリットは

  • chef-client を使う場合は必要ない

という感じなので、みなさん roundsman を使って幸せに過ごしましょう(結論)。

ちなみに capistrano-rbenv と組み合わせて使う部分はまだマージされていません。
この pull request を取り込む必要があるのでご注意ください。


書き始めたら 7個もありました。いままで紆余曲折した甲斐があったかもしれません。

*1:rubygems.org をさまようと、capistrano を利用して chef-solo を実行するプラグイン/方法は他にも大量に存在します。