Cloud Foundry V2 (v172)をBosh-liteで構築する(VirtualBox+Vagrant編)


今回はCloud Foundry V2をAll in oneでデプロイしてみます。

All in oneをデプロイするにはいくつか方法がありますが、今回はCloud Foundryが公式に提供している、Bosh-liteを使ってデプロイを試します。

## 前提環境

````
VirtualBox
Vagrant(1.4.3以上)
Ruby(1.9.3以上), Bundler

上記2つが動作するOSX,あるいはLinux

メモリ: 6GBのVMを上げられるだけの空きメモリがあること
````

これらの環境を予め用意しておいてください。

VirtualBoxの他に、VMWare FusionやAWSでも利用可能ですが、今回はVirtualBox前提で解説します。

また、Windows環境でも動作させることは可能ですが、今回の解説では対象外とします。

## Bosh-liteのセットアップ

### bosh-liteをclone

````bash
mkdir ~/workspace
cd ~/workspace
git clone git@github.com:cloudfoundry/bosh-lite.git
````

~/workspace　を作ってcloneしてください。異なるディレクトリにすると、後々スクリプト修正が必要になってしまいます。


### vagrant up

````bash
cd bosh-lite
bundle install
vagrant up --provider virtualbox
````

### BOSHにログイン

````bash
$ bundle install
$ bosh target 192.168.50.4 lite
Target set to `Bosh Lite Director'
$ bosh login
Your username: admin
Enter password: *****
Logged in as `admin'
````

bundle installで必要なgemをインストールします。
--pathなどを付けずに、グローバルな領域にインストールすることをお勧めします。もし環境を汚したくないと言う場合は、rbenv等でRubyの環境を分けておきましょう。bundle install後、rbenv rehashするのを忘れずに。

インストールが終わったら、boshコマンドでログインします。
username/passwordは **admin/admin** です。

### Routeの追加

````bash
sudo scripts/add-route
````


### Warden Stemcellのセットアップ

````
wget http://bosh-jenkins-gems-warden.s3.amazonaws.com/stemcells/latest-bosh-stemcell-warden.tgz
bosh upload stemcell latest-bosh-stemcell-warden.tgz
````
VMやコンテナのベースになる、Stemcellをセットアップします。350MB前後あるので、少々時間がかかります。

### 何かうまく行かないとき

````
vagrant ssh -c "sudo sv restart director"

````

何故かboshへのログインやstemcellのアップロードが上手くいかないときは、このコマンドでboshの再起動を試しましょう。

## Cloud Foundryのセットアップ

### cf-releaseのcloneとセットアップ

````bash
cd ~/workspace
git clone https://github.com/cloudfoundry/cf-release
cd cf-release
git checkout v172
git submodule update --init --recursive --force
````

Cloud Foundryのリポジトリをworkspaceにcloneしたあと、セットアップしたいCFのバージョンをcheckoutします。

### releaseのアップロード

````bash
cd ~/workspace/bosh-lite
bosh upload release ../cf-release/releases/cf-172.yml

````
release ymlをboshにアップロードします。チェックアウトしたcf-releaseのバージョンと、ymlのファイル名が一致している必要があります。

しばらく時間がかかるので、気長に待ちます


### spiffのセットアップ

````
https://github.com/cloudfoundry-incubator/spiff/releases
````
次に、このURLから最新のspiffをダウンロードします。
OSXならば　spiff_darwin_amd64.zip
Linuxならば　spiff_linux_amd64.zip
をダウンロードし、解凍して出てきたspiffを、パスの通っている場所(/usr/local/bin など)にコピーし、パーミッションを755にしておきます。

(linuxでの例)

````bash
wget https://github.com/cloudfoundry-incubator/spiff/releases/download/v1.0/spiff_linux_amd64.zip
unzip spiff_linux_amd64.zip
sudo mv spiff /usr/local/bin
sudo chmod 755 /usr/local/bin/spiff
````

### manifestの作成

````bash
./scripts/make_manifest_spiff

````
manifestを作成するスクリプトを実行します。spiffのセットアップができていなかったり、workspaceディレクトリ以外にbosh-liteをcloneしていると、失敗するので要注意。

### CFのデプロイ

````bash
bosh deployment manifests/cf-manifest.yml
bosh deploy
````

長かったセットアップ作業もこれで最後です。
boshにmanifestをアップロードし、deployコマンドでデプロイを開始します。

これも30分程度時間がかかりますので、ゆっくり待ちましょう。スクリプトが流れ終わったらデプロイ完了です。

## ログインしてみる

### cfコマンドのセットアップ

CFにデプロイするために、cfコマンドをセットアップします。
https://github.com/cloudfoundry/cli
のDownloadsから、各OS向けのCLIインストーラがダウンロードできるので、ダウンロードしてインストールしておきます。

### ログインして最初の設定を行う

````bash
cf api http://api.10.244.0.34.xip.io
cf auth admin admin
cf create-org me
cf target -o me
cf create-space development
cf target -s development
````

cfコマンドをインストール出来たら、上記コマンドでログインし、最初の設定を行います。この一連の作業では

- APIエンドポイントの指定
- ログイン
- Orgの作成→指定
- Spaceの作成→指定

を行っています。

### アプリのデプロイ

それでは、さっそくアプリのデプロイをしてみましょう。
さきほどセットアップに利用したcf-releaseの中に、サンプルアプリケーションがあるのでそれを使ってみます。

````bash
cd ~/workspace/cf-release/src/acceptance-tests/assets/dora/
cf push dora
````

Sinatraで書かれた、doraというサンプルアプリをpushしました。

````
Showing health and status for app dora in org me / space development as admin...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: dora.10.244.0.34.xip.io

     state     since                    cpu    memory          disk
#0   running   2014-07-06 09:31:09 PM   0.0%   22.4M of 256M   0 of 1G
````

こういう表示が出たら、デプロイ成功です。

````
curl dora.10.244.0.34.xip.io
Hi, I'm Dora!%
````

ブラウザが使える環境なら、ブラウザを使ってアプリにアクセスしてみましょう。

## QA
### v172以外をデプロイしたい

チェックアウトするcf-releaseのtagをデプロイしたいバージョンにして、bosh upload releaseで上げるymlも変更すれば、他のバージョンをデプロイできます。

### カスタマイズしてデプロイしたい

spiffで作られたmanifestを変更することで、カスタマイズした構成でデプロイできます(といっても、All in oneで出来ることは限られますが・・・)

### MySQLやPostgresなどのServiceはデプロイ出来ないの？

Service系はreleaseが分けられているため、今回の手順だけではデプロイ出来ません。Service付きのデプロイ方法は、また後日解説します。

### gem install cfで入るcfコマンドは使えないの？

使えなくはないですが、Ruby CFコマンドはもうメンテされていないので、お勧めしません。
https://github.com/cloudfoundry/cli
からダウンロードできる、Go版のCFコマンドを使いましょう。

### ぶっちゃけこれデプロイ面倒くさくない？

めんどいよ！
いくつか簡単にする方法はあるんですが、それはまた後日。