Opscode Chef の Vagrant用レシピ。
-
アプリケーション実行用のユーザーを作る
-
ruby-build と rbenv で home での ruby 環境を構築
-
rbenv 環境での chef-solo を実行可能に
するところまでを整えるものです。
モチベーションとしては、chef-solo は新規で作った専用のユーザーの rbenv で実行したいけれど、その環境を構築するまでも chef-solo で整えたいという bootstrap 的なものです。<del>幸い、vagrant の CentOS VM にはシステムグローバルな ruby で chef-solo が使えますので、それを使って環境構築します。</del><ins>knife prepare を使う以上、chef-solo がプリインストールされてるかどうかは関係ありませんでした。</ins>
本レシピ実行以降は、後は煮るなり焼くなり・・・ そのままシステムグローバルな chef を使い続ける方が何かと実は楽なのでは説もありますが・・・。
ローカルのホストOSで VirtualBox をインストールした後、Vagrant をインストールします。また、chef と knife-solo を入れます。
$ gem install vagrant $ gem install chef $ gem install knife-solo $ rbenv rehash
次に、CentOS の VM を準備します。(ゲストは CentOS でなくても動くかもしれないが未検証)
$ mkdir -p ~/somewhere $ cd ~/somewhere $ vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box $ vagrant init
Vagrantfile を適当に記述します。ここでは VM のアドレスを 192.168.50.2 とします。
Vagrant::Config.run do |config| config.vm.box = "centos" config.vm.network :hostonly, '192.168.50.2' end
VM を起動します。
$ vagrant up
vagrant ユーザーで ssh できるよう、~/.ssh/config を編集します。
Host 192.168.50.2 IdentityFile ~/.vagrant.d/insecure_private_key
同ディレクトリ内に本レポジトリを clone した後、knife chef-solo prepare を実行し下準備します。
# chef-solo は git clone したディレクトリ $ cd chef-solo $ knife solo prepare vagrant@192.168.50.2
nodes/192.168.50.2.json を自分の環境に合わせて編集します。
{ "user":{ "name": "fiorung", "group" : "fiorung", "home": "/home/fiorung" }, "rbenv":{ "version": "1.9.3-p362" }, "recipes":[ "adduser", "rbenv", "chef" ] }
knife で chef-solo を実行して完了です!
$ knife solo cook vagrant@192.168.50.2
以下、動作確認の例。
$ vagrant ssh $ sudo su - fiorung $ ruby -v ruby 1.9.3p362 (2012-12-25 revision 38607) [x86_64-linux] $ which chef-solo ~/.rbenv/shims/chef-solo
It works!
なお、上記方法で rbenv 環境の chef-solo が使えるようになりますが、chef-solo の実行に knife-solo を使う場合そのままでは rbenv な chef-solo を実行してくれません。
work around として、knife-solo の v0.1.0 タグに以下のパッチを当てて使っています。
diff --git a/lib/chef/knife/solo_cook.rb b/lib/chef/knife/solo_cook.rb index c1c7538..a4791bd 100644 --- a/lib/chef/knife/solo_cook.rb +++ b/lib/chef/knife/solo_cook.rb @@ -129,6 +129,10 @@ class Chef result = run_command <<-BASH export PATH="#{OMNIBUS_EMBEDDED_PATHS.join(":")}:$PATH" export GEM_PATH="#{OMNIBUS_EMBEDDED_GEM_PATHS.join(":")}:$GEM_PATH" + if [ -d $HOME/.rbenv ] ; then + export PATH="$HOME/.rbenv/bin:$PATH" + eval "$(rbenv init -)" + fi ruby -rubygems -e "gem 'chef', '#{CHEF_VERSION_CONSTRAINT}'" BASH raise "Couldn't find Chef #{CHEF_VERSION_CONSTRAINT} on #{host}. Please run `#{$0} prepare #{ssh_args}` to ensure Chef is installed and up to date." unless result.success?
加えて、rbenv インストールまでの chef のキャッシュが残っていると新しいユーザーでの chef 時に permission で蹴られると思われます。
% knife solo clean vagrant@192.168.50.2
をあらかじめ実行しておきましょう。