VagrantでローカルにCloud Foundry v2を構築 (2013-11-01更新)


PaaS(Platform as a Service)が注目されだして久しいですが、注目企業Pivotalから[Pivotal CF](http://www.gopivotal.com/pivotal-products/pivotal-cf)なんかも出てきていよいよ広く知られていきそうですね。

このPivotal CFの心臓部であるOpen PaaSソフトウェアであるCloud Foundry v2がVagrantで簡単に構築できるようになっているようです。PaaSといってもイマイチ利便性が分からない私のような人なんかはぜひ動かしてみたいところです。

 # v1では仮想マシンイメージ(Micro Cloud Foundry)を配布してましたが、現在は公開停止されています。

## 参考にさせていただいたサイト

- [Installing Cloud Foundry on Vagrant]
(http://blog.cloudfoundry.com/2013/06/27/installing-cloud-foundry-on-vagrant/)

## 動作環境 (2013-11-01更新)

先に言っておきますが、大ハマリしました。 **バージョン重要** です。
`vagrant up`に成功した組み合わせを貼っておきます。

* OS X 10.8.5
* Vagrant 1.3.5 (1.3.3でエラー)

```
[Berkshelf] Updating Vagrant's berkshelf: '~/.berkshelf/cf-install/vagrant/berkshelf-20131031-62519-onsa33-cf-install'
[Berkshelf] Using apt (1.10.0)
[Berkshelf] Using git (2.7.0)
[Berkshelf] Using sqlite (1.0.0)
[Berkshelf] Installing mysql (3.0.12) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks' -> 3.0.10でエラー
[Berkshelf] Using postgresql (3.0.4)
[Berkshelf] Using chef-golang (1.0.1)
[Berkshelf] Using java (1.14.0)
[Berkshelf] Using ruby_build (0.8.0)
[Berkshelf] Installing rbenv (0.7.3) from github: 'fnichol/chef-rbenv' with branch: 'e10f98d5fd07bdb8d212ebf42160b65c39036b90' over protocol: 'git' -> このコミット限定！
[Berkshelf] Using rbenv-alias (0.0.0) at './chef/rbenv-alias'
[Berkshelf] Using rbenv-sudo (0.0.1) at './chef/rbenv-sudo'
[Berkshelf] Using cloudfoundry (0.0.0) at './chef/cloudfoundry'
[Berkshelf] Using dmg (2.0.2)
[Berkshelf] Using build-essential (1.4.2)
[Berkshelf] Using yum (2.3.4)
[Berkshelf] Using windows (1.11.0)
[Berkshelf] Using chef_handler (1.1.4)
[Berkshelf] Using runit (1.2.0)
[Berkshelf] Using openssl (1.1.0)
[Berkshelf] Using aws (0.101.6)
```



##やってみよ（だが未完） ←　解決！！！！！(末尾の追記参照)

インストーラを持ってきます。

```Bash:
$ git clone https://github.com/Altoros/cf-vagrant-installer.git
```

`cf-vagrant-installer`ディレクトリに移動して、コマンド一発。
今回はデプロイ先としてVMware Fusionを指定しています。

```Bash:
$ cd cf-vagrant-installer
$ rake host:bootstrap
$ vagrant up --provider=vmware_fusion
```

と思いきや…

```Bash:
Bringing machine 'cf-install' up with 'vmware_fusion' provider...
There are errors in the configuration of this machine. Please fix
the following errors and try again:

Vagrant:
* Unknown configuration section 'berkshelf'.
* Unknown configuration section 'omnibus'.
```

何か足りないと言われています。
参考サイトをよく見ると、

> The number of Chef recipes may be limited, so be sure to use Berkshelf to manage your cookbooks or their dependencies. Berkshelf maintains proven and stable recipes downloaded from OpsCode. 

と書いてありますので、以下のプラグインをインストールします。

- Berkshelf
- OpsCode

実はこの辺り、全部リポジトリのREADMEに書いてました。
ちゃんと読まないといけませんね。

```Bash:
$ vagrant plugin install vagrant-berkshelf
$ vagrant plugin install vagrant-omnibus
```

ちなみに、同マニュアルにはこんなことも書いてありました。

>Stop!! If you are going to use the VMware provider, you must follow the instructions here first, or the next steps will result in an environment that will not work.

引用文中のリンク先は[こちら](https://github.com/Altoros/cf-vagrant-installer/blob/master/vmware/VMware-Instructions.md)。
要するに以下のコマンド叩いてprecise64のVMware_fusion版入れといてね、て話なんですけど、2013/10/8現在のインストーラなら、なければ最初に入れてくれるみたいです。なので無視しても問題ない(はずです)。

```Bash:
$ vagrant box add precise64 http://files.vagrantup.com/precise64_vmware.box --provider=vmware_fusion
```

いざ再挑戦。がしかし。

```Bash:
[Berkshelf] Failed to download 'rbenv' from github: 'fnichol/chef-rbenv' with branch: 'e10f98d5fd07bdb8d212ebf42160b65c39036b90' over protocol: 'git'
Berkshelf::CookbookNotFound: Cookbook 'rbenv' not found in any of the default locations
```

rbenvの指定されたブランチが見つかりません！と怒られます。
現象としては[このサイト](https://github.com/Altoros/cf-vagrant-installer/issues/56)と同じです。`Berksfile`で[chef-rbenvのコミットが指定](https://github.com/Altoros/cf-vagrant-installer/commit/744f52fe9866a3611f551048881e47921e78b4e6)されているのですが、どうやらこのコミットのchef-rbenvでないとうまく動作しないらしく、根本原因は調査中(Pending Root Cause Analysis)、ってな感じみたいです。

と、とりあえず中断。

## 2013-11-01追記：解決しました

真面目にググってみたところ、[Vagrantのバージョンを1.3.4にあげたら似たような問題が解決したぜ！という書き込み](https://github.com/RiotGames/vagrant-berkshelf/issues/93)を見かけたので、半信半疑でVagrantを1.3.3から1.3.5にアップデートして再度cloneからやりなおしたところ、成功しました。
Vagrant V1.Xからのアップデートの場合、[Vagrant公式サイト](http://downloads.vagrantup.com/)から最新パッケージをダウンロードしてきてそのままインストールすれば上書きしてくれます。
バージョンチェック方法は以下。

```
$ vagrant -v
Vagrant 1.3.5
```

これで`$vagrant up --provider=vmware_fusion`で動作するかと思いましたが、Chef-Soloの実行が下記のエラーで失敗しました。

```
[2013-10-31T07:39:47-07:00] FATAL: Errno::EINVAL: link[/vagrant] (cloudfoundry::vagrant-provision-start line 18) had an error: Errno::EINVAL: Invalid argument - /vagrant
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.
```

これはVagrantのproviderをVMware Fusionにしている場合限定の問題らしく、[解決法も既知です。](https://github.com/Altoros/cf-vagrant-installer/issues/68)
細かいことは書いてませんでしたが以下でうまくいきました。

1. `$ vagrant destroy`で一旦起動済みVMを削除します。
1. `chef/cloudfoundry/recipes/vagrant-provision-start.rb`をvi等で編集して18-25行目をコメントアウトします(下記参照)。
1. `$ vagrant up --provider=vmware_fusion`で再度立ち上げ。

```vagrant-provision-start.rb
 17 # Delete the vagrant link if vmware guest
 18 # link "/vagrant" do
 19 #   action :delete
 20 #   only_if { node[:virtualization][:system] == "vmware" }
 21 #   only_if { node[:virtualization][:role] == "guest" }
 22 #   only_if do File.readlink("/vagrant") == "/mnt/hgfs/!%vagrant" end
 23 #   notifies :create, "directory[/vagrant]", :immediately
 24 #   notifies :mount, "mount[/vagrant]", :immediately
 25 # end
```

続いてのエラーです(つらい)。
今度はmysqlのリスタートに失敗しているみたい。

```
================================================================================
Error executing action `restart` on resource 'service[mysql]'
================================================================================


Chef::Exceptions::Exec
----------------------
/sbin/start mysql returned 1, expected 0


Resource Declaration:
---------------------
# In /tmp/vagrant-chef-1/chef-solo-1/cookbooks/mysql/recipes/server.rb

251:   service 'mysql' do
252:     action :start
253:   end
254: end



Compiled Resource:
------------------
# Declared in /tmp/vagrant-chef-1/chef-solo-1/cookbooks/mysql/recipes/server.rb:251:in `from_file'

service("mysql") do
  provider Chef::Provider::Service::Upstart
  action [:start]
  supports {:status=>true, :restart=>true, :reload=>true}
  retries 0
  retry_delay 2
  service_name "mysql"
  pattern "mysql"
  startup_type :automatic
  cookbook_name :mysql
  recipe_name "server"
end
```

ググってみました。[コレ](https://github.com/Altoros/cf-vagrant-installer/issues/93)ですかね。
更に調べた感じ[MySQL Cookbookのバグ](https://tickets.opscode.com/browse/COOK-3752)か…？
とりあえずこの問題は[v3.0.12のリリース](https://github.com/opscode-cookbooks/mysql/releases/tag/v3.0.12)で修正されたみたいです。

Berkshelfのログを見てみると…
`[Berkshelf] Using mysql (3.0.10)`というログが出てます。
なので`Berksfile`を編集して最新リリース(3.0.12)を指定してみます。(指定バージョンを再取得するため、`Berksfile.lock`は削除しました)

```Berksfile
cookbook 'mysql', '3.0.12'
```

今度こそ！と思いながら最早何度目か分からない`$ vagrant up --provider=vmware_fusion`を実行しましたところ、30分弱ほどかけつつ、ついに、ついに最後まで動作しました。や、やっと動いた(ただしVMであってCFではない)！

```
[2013-11-01T05:38:06-07:00] INFO: Chef Run complete in 1590.212645206 seconds
```

これだけ関連コンポーネントがあると常に動作するリリースを出し続けるのも無理な話、ということですかね。。

というわけでCloudFoundryの起動 -> サンプル動作までは後日別記事にする予定ですが( **また何が起こるか分かりませんが** )、本記事はトラブルシューティングリファレンスとして残しておくつもりです。

追記以上です。