cf-vagrant-installerを動くようにしてみた件
この記事について
この記事は、Cloud Foundry Advent Calendar 2013の11日目の記事です。Adventな記事は初めて書きましたよ。
はじめに
CloudFoundryを仕事にして、はや10ヶ月。ただ、どっちかっていうとプロジェクトマネジメント系のお仕事が中心で、コードと戯れる時間はあまりとれませんでした。っていうか、そもそもそういう環境を作るための時間がない・・・
ところがここ最近は、ChefだのVagrantだの、コードと戯れる環境を簡単に作ってくれるツールが次々と登場してきました。いい時代になりましたね。
そこで、CloudFoundryの最近のコードと戯れられるAll in One環境を簡単に作ってくれるcf-vagrant-installerについて、動かして使ってみたいと思いますよ。
えっ、動かないの?
- CC(cloud_controller_ng)が動いていない
- 原因を調査する時間がないのでまた今度!
とのこと。
せっかく手持ちのMacBook AirにVirtualBoxと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:~$
めでたし、めでたし。
準備したもの
- MacBook Air (MacOS X 10.9(Mavericks)入り)
- Ubuntu 12.04 Server上でも動かせますよ。
- VirtualBox 4.3.4
- Macはともかく、Ubuntu 12.04にVirtualBoxをインストールする方法はggrks
- Vagrant 1.3.5
- git
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(これも毎回)
- 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$
動きましたー。めでたし、めでたし。