cf-vagrant-installerを動くようにしてみた件

この記事について

この記事は、Cloud Foundry Advent Calendar 2013の11日目の記事です。Adventな記事は初めて書きましたよ。

はじめに

CloudFoundryを仕事にして、はや10ヶ月。ただ、どっちかっていうとプロジェクトマネジメント系のお仕事が中心で、コードと戯れる時間はあまりとれませんでした。っていうか、そもそもそういう環境を作るための時間がない・・・

ところがここ最近は、ChefだのVagrantだの、コードと戯れる環境を簡単に作ってくれるツールが次々と登場してきました。いい時代になりましたね。

そこで、CloudFoundryの最近のコードと戯れられるAll in One環境を簡単に作ってくれるcf-vagrant-installerについて、動かして使ってみたいと思いますよ。

えっ、動かないの?

jacopenさんのcfcrjpでの発表によると、

  • CC(cloud_controller_ng)が動いていない
  • 原因を調査する時間がないのでまた今度!

とのこと。

せっかく手持ちのMacBook AirVirtualBoxとVagrantを入れて、これでワイもImmutable Infrastructure屋の仲間入りやでぇ、ワイのDevOpsがBlue Greenやでぇ、とか思っていた矢先・・・ちょっぴり残念な思いがしました。

なんで、動かないのかな?

CCngのビルドに失敗しているので、CCngが起動しないのだと思い、じゃあCCngをビルドしているのはというと、Vagrantfileから呼び出されるcf_bootstrap.rbというrecipeから、VM上の/vagrantディレクトリでrake cf:bootstrapしているするところからですので、ログ出力である/vagrant/logs/cf_bootstrap.logを見てみることにしました。

すると、cf_bootstrap.logに、mysql関係のライブラリが入ってないためにCCngのbundle installがコケてる、というようなログが出てました。

cf-vagrant-installerのGitHub issuesを漁ると・・・ビンゴ!やはり、世の中には同じことで困っている人がいるものです。

解決へ

幸い、Pull Requestも出ていました。これを当てると、CCngのbundle installも通り、めでたくCCngが起動しましたよ。

vagrant@cf:~$ /vagrant/status.sh
cf-dir_server start/running, process 3523
cf-warden start/running, process 3450
cf-health_manager start/running, process 3452
cf-nats-server start/running, process 3455
cf-router start/running, process 3461
cf-uaa start/running, process 3479
cf-file_server start/running, process 3544
cf-cloud_controller start/running, process 3481
cf-dea start/running, process 3486
vagrant@cf:~$

めでたし、めでたし。

準備したもの

git cloneしてからrake host:bootstrapするまでに行った設定

diffを置いておきますね。

上で紹介したPull Requestのパッチと、IPアドレス設定を反映したものになります。

特に、IPアドレスについては、VirtualBoxとVagrantの相性の関係で、Vagrantfileにて10.0.2.100という謎のホストオンリーネットワークの固定IPアドレスを振っていたりします。192.168.12.xxxだと、某所の開発用NWとアドレス帯が被るので・・・・。なおこの設定により、VMにNATにつながるNICとホストオンリーネットワークにつながるNICの2つができてしまいますが・・・まあ動けばいいということで。

rake host:bootstrapを忘れずに

Vagrantfileを含むブツをgit cloneしたら、すぐにvagrant upしたくなるのが人情というものです。

しかし、cf-vagrant-installerはCFの各コンポーネントへのsubmodule pointerを含んでおり、単にgit cloneしただけだとCF各コンポーネントのコード実体が存在しないままにVM上でchef recipeが走ることになって、コケます(経験者は語る)。

vagrant upの前にはrake host:bootstrapを忘れずに実行しましょう。

vagrant upしてから時間が掛かる件

recipeを大量に設定したVagrantfileを使ってvagrant upすると、なかなか終わらなくてイライラすることってよくあると思いませんか?

cf-vagrant-installerのVagrantfileも、これまた大量のrecipeを使う満漢全席になっています。その中でも時間がかかるのは以下の4つの処理でしょう。

  • Ubuntu 12.04 serverのVMイメージprecise64.boxファイルのfiles.vagrantup.comからのダウンロード(初回vagrant up時のみ)
    • 予め手元にUbuntu 12.04 serverのboxを持っている方は、Vagrantfileでそちらを指定したほうが速いでしょう。ただし、cf-vagrant-installer/cloudfoundry/recipes/vagrant-provision-start.rb にて、"admin"というグループをGID=999で作成しようとしますので、これと被らないような/etc/groupになってるboxである必要があります。
  • rbenv installによるRubyのbuild(これは毎回)
    • this could take a while... とか予め言ってくれるので、これはまあ待ってやろうかという気になります。
  • remove all remnants of apparmor のあとの、download warden rootfs from s3(これも毎回)
    • wardenコンテナ上で稼働させるUbuntu 10.04のrootfsイメージをAmazon S3からダウンロードしてくるのですが、これが存外に時間がかかり、いつまでたってもコマンドプロンプトが返ってこないので、ctrl-Cしたくなる衝動に駆られます。ご用心。
    • 頻繁にvagrant upする方は、cf-vagrant-installer/cloudfoundry/recipes/warden.rb の冒頭にあるURLを手近のものに書き換えて高速化するという手がありますね。
  • libcurl4-openssl-dev とか libcurl3-dev のapt-get install後の rake cf:bootstrap(これも毎回)
    • これが始まると、/vagrant/logs/cf_bootstrap.log(ホストマシン上では.../cf-vagrant-installer/logs/cf_bootstrap.log) が作成され、そこにログが出力され始めます。それを眺めればイライラすることはないのですが、これに気づかないと、これまたいつまでたってもコマンドプロンプトが返ってこないので、ここでもctrl-Cしたくなる衝動に駆られます。くわばらくわばら。
    • 特に、UAAのためにmavenで依存jarファイルをダウンロードしてきまくるところが重いようです。UAAって大したことやってないような気もするけど。おそろしきかなSpring Framework

せっかくなので、Sinatraアプリでも動かしてみる

cf-vagrant-installerでは、有難いことにcfコマンドまでインストールしてくれます。さらにはSinatraとnode.jsのサンプルアプリまで用意してくれているではありませんか。これを使って、Sinatraアプリを動かしてみたいと思います。

なお、cfコマンドからのログインアカウントは、/vagrant/custom_config_files/uaa/uaa.yml の設定でUAA起動時に自動作成される管理者ユーザを使用します。以下にuaa.ymlの一部を引用しますが、これによるとIDはadmin,パスワードはpasswordになりますね。

users:
  - admin|password|scim.write,scim.read,openid,cloud_controller.admin

ではやってみましょう。

vagrant@cf:~$ cf target http://api.10.0.2.100.xip.io/
Setting target to http://api.10.0.2.100.xip.io... OK
vagrant@cf:~$ cf login
target: http://api.10.0.2.100.xip.io

Email> admin

Password> ********

Authenticating... OK
There are no spaces. You may want to create one with create-space.... OK
vagrant@cf:~$ cf create-org myorg 
Creating organization myorg... OK
Switching to organization myorg... OK
There are no spaces. You may want to create one with create-space.... OK

Target Information (where will apps be pushed):
  CF instance: http://api.10.0.2.100.xip.io (API version: 2)
  user: admin
  target app space: N/A (org: myorg)
vagrant@cf:~$ cf create-space myspace
Creating space myspace... OK
Adding you as a manager... OK
Adding you as a developer... OK
Space created!

cf switch-space myspace    # targets new space
vagrant@cf:~$ cf switch-space myspace
Switching to space myspace... OK

Target Information (where will apps be pushed):
  CF instance: http://api.10.0.2.100.xip.io (API version: 2)
  user: admin
  target app space: myspace (org: myorg)
vagrant@cf:~$ 

Sinatraサンプルアプリは、/vagrant/test/fixtures/apps/sinatra/ 配下にあります。

vagrant@cf:~$ cd /vagrant/test/fixtures/apps/sinatra/
vagrant@cf:/vagrant/test/fixtures/apps/sinatra$ cf push
Using manifest file manifest.yml

Creating hello... OK

Creating route hello.10.0.2.100.xip.io... OK
Binding hello.10.0.2.100.xip.io to hello... OK
Uploading hello... OK
Preparing to start hello... OK
Checking status of app 'hello'...
  0 of 1 instances running (1 starting)
  0 of 1 instances running (1 starting)
  1 of 1 instances running (1 running)
Push successful! App 'hello' available at hello.10.0.2.100.xip.io
vagrant@cf:/vagrant/test/fixtures/apps/sinatra$

アプリのインスタンスが起動しました。では、curlコマンドでアプリを叩いてみましょう。

vagrant@cf:/vagrant/test/fixtures/apps/sinatra$ curl hello.10.0.2.100.xip.io
  <h3>Sinatra Test app for CF Vagrant Installer</h3>
      Hello from 0.0.0.0:61003! <br/>
  <hr>
  <h4> Environment variables </h4>
TMPDIR= /home/vcap/tmp <br/>
VCAP_APP_PORT= 61003 <br/>
VCAP_CONSOLE_IP= 0.0.0.0 <br/>
USER= vcap <br/>
VCAP_APPLICATION= {"application_users":[],"instance_id":"9f788f3f6469c9ae97c7e14590103945","instance_index":0,"application_version":"1c9b8edb-2226-442e-bc44-5cc77cbcd1bb","application_name":"hello","application_uris":["hello.10.0.2.100.xip.io"],"started_at":"2013-12-11 05:25:11 +0000","started_at_timestamp":1386739511,"host":"0.0.0.0","port":61003,"limits":{"mem":256,"disk":1024,"fds":16384},"version":"1c9b8edb-2226-442e-bc44-5cc77cbcd1bb","name":"hello","uris":["hello.10.0.2.100.xip.io"],"users":[],"start":"2013-12-11 05:25:11 +0000","state_timestamp":1386739511} <br/>
RACK_ENV= production <br/>
PATH= /home/vcap/app/vendor/bundle/ruby/1.9.1/bin:/home/vcap/app/bin:/bin:/usr/bin <br/>
PWD= /home/vcap/app <br/>
LANG= en_US.UTF-8 <br/>
VCAP_SERVICES= {} <br/>
HOME= /home/vcap/app <br/>
SHLVL= 2 <br/>
GEM_PATH=  <br/>
PORT= 61003 <br/>
VCAP_APP_HOST= 0.0.0.0 <br/>
MEMORY_LIMIT= 256m <br/>
VCAP_CONSOLE_PORT= 61004 <br/>
vagrant@cf:/vagrant/test/fixtures/apps/sinatra$ 

動きましたー。めでたし、めでたし。