すごいBOSHたのしく学ぼう

32
NTT Software Innovation Center すごいBOSHたのしく学ぼう 岩嵜 雄大 NTT Software Innovation Center 2012-06-21

description

VMWareが開発を行っているOSSの分散システム構成管理ツールBOSHの紹介。環境構築からCloudFoundryのデプロイまで。 「第7回CloudFoundry輪読会」で発表を行いました: http://atnd.org/events/29652

Transcript of すごいBOSHたのしく学ぼう

Page 1: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

すごいBOSHたのしく学ぼう

岩嵜 雄大

NTT Software Innovation Center

2012-06-21

Page 2: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

もくじ

BOSHとは

BOSHの基礎

BOSH環境の構築

BOSHによるオペレーション

まとめ

2012-06-21 2

Page 3: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

もくじ

BOSHとは

BOSHの基礎

BOSH環境の構築

BOSHによるオペレーション

まとめ

2012-06-21 3

Page 4: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

BOSHとは

CloudFoundryの環境構築はとても大変

– サーバが増えると何処で何が動いているのか分からなくなる

– 動いてるサービスのバージョン管理も煩雑

BOSHが解決してくれること

– 分散システム全体の構成管理を一元管理

– サービスのバージョンも管理できる

– VMWare謹製なのでCloudFoundryと相性が良い

2012-06-21 4

https://github.com/cloudfoundry/bosh

Page 5: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

それ ~ でできるよ

• Puppet

– 細かい作業も出来て素敵

– でもPuppet使って実際に構成管理ツール作るのすごく大変

• Chef

– より新しい

– でもChef使って実際に構成管理ツール作るのすごく大変

• Capistorano

– Capistorano使って実際に構成管理ツール作ったら爆発した!

分散システムの構成管理ツールは前からあるのでは?

車輪の再発名になってませんか?

2012-06-21 5

Page 6: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

それ ~ でできるよ

• Puppet

– 大体あってる

– でもPuppet使って実際に構成管理ツール作るのすごく大変

• Chef

– 大体あってる

– でもChef使って実際に構成管理ツール作るのすごく大変

• Capistorano

– Capistorano使って実際に構成管理ツール作ったら爆発した!

分散システムの構成管理システムは前からあるのでは?

車輪の再発名になってませんか?

2012-06-21 6

フレームワーク

Puppet Chef

Capistrano

ロジック

デプロイ 起動・終了

ステータス監視 バージョン管理

問題はココ

Page 7: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

それ ~ でできるよ

• Puppet

– 大体あってる

– でもPuppet使って実際に構成管理ツール作るのすごく大変

• Chef

– 大体あってる

– でもChef使って実際に構成管理ツール作るのすごく大変

• Capistorano

– Capistorano使って実際に構成管理ツール作ったら爆発した!

分散システムの構成管理システムは前からあるのでは?

車輪の再発名になってませんか?

2012-06-21 7

フレームワーク

Puppet Chef

Capistrano

ロジック

デプロイ 起動・終了

ステータス監視 バージョン管理

BOSHはロジックを定形化

すぐに使える

Page 8: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

それ ~ でできるよ

• Puppet

– 大体あってる

– でもPuppet使って実際に構成管理ツール作るのすごく大変

• Chef

– 大体あってる

– でもChef使って実際に構成管理ツール作るのすごく大変

• Capistorano

– Capistorano使って実際に構成管理ツール作ったら爆発した!

分散システムの構成管理システムは前からあるのでは?

車輪の再発名になってませんか?

2012-06-21 8

フレームワーク

Puppet Chef

Capistrano

ロジック

デプロイ 起動・終了

ステータス監視 バージョン管理

BOSHはロジックを定形化

すぐに使える (環境構築さえ出来れば)

Page 9: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

もくじ

BOSHとは

BOSHの基礎

BOSH環境の構築

BOSHによるオペレーション

まとめ

2012-06-21 9

Page 10: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

BOSHの基礎

BOSHはそれ自身が複数のシステムからなる分散システム

BOSH DirectorがVMの管理を行う

BOSH CLIを用いてユーザはBOSH Directorに指示を出す

CPIというインターフェース経由でBOSH DirectorはIaaSを操作し、VMの作製や起動を行う (A)

– vShphereとAWSに対応

– OpenStackはPistonが開発中

– CloudStackはCloudBridgeで対応? • https://groups.google.com/a/cloudfoundry.org/group/bosh-dev/browse_thread/thread/5fdec0ace4439d12?pli=1

BOSH AgentはVMにインストールされ、BOSH Directorの指示に従ってサービスなどの操作を行う(B)

2012-06-21 10

https://github.com/cloudfoundry/oss-docs/blob/master/bosh/documentation/documentation.md

Page 11: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Stemcell

StemcellはBOSHが生成するVMの基本イメージ

– 実態はBOSH Agent+etc 入りのUbuntuイメージ

– Stemcell自体は単体では何もサービスを提供できない

– 上にJobをデプロイして使う

– イメージファイルはBlobstoreに保存されている

2012-06-21 11

VM

Stemcell

Job A

Package A

Package B

Package C

Agent

Page 12: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Releases

BOSHが扱うアプリケーションの全体構成

– VMにデプロイする単位=Job

– Jobを構成する各種サービス・プロセス=Package

– バージョンアップごとにReleaseとしてスナップショットを取る • bosh create release するとreleasesディレクトリに保存される

2012-06-21 12

VM

Stemcell

nats (Job)

common (Package)

nats (package)

ruby (package)

Agent

Release

common nats ruby mysql

nats mysql_node

Release

common nats ruby mysql

nats mysql_node

Release

common nats ruby mysql

nats mysql_node

Release 78

common nats ruby mysql

nats mysql_node

Release

Page 13: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Jobs

使用するパッケージとテンプレートの一覧を定義する

– 実態は設定ファイルのみ

– jobsディレクトリを見よ

2012-06-21 13

--- name: acm templates: acm_ctl.erb: bin/acm_ctl acm.yml.erb: config/acm.yml syslog_forwarder.conf.erb: config/syslog_forwarder.conf packages: - libpq - common - ruby - syslog_aggregator - acm

cf-release/jobs/acm/spec

--- <% db = properties.acmdb.databases.find { |db| db.tag == "acm" } %> <% role = properties.acmdb.roles.find { |role| role.tag == "admin" } %> pid: /var/vcap/sys/run/acm/acm.pid name: ACM port: 9090 mbus: nats://<%= properties.nats.user %>:<%= properties.nats.password %>@<%= properties.nats.address %>:<%= properties.nats.port %>/ logging: level: info file: /var/vcap/sys/log/acm/acm.log syslog: vcap.acm db: database: postgres://<%= role.name %>:<%= role.password %>@<%= properties.acmdb.address %>:<%= properties.acmdb.port %>/<%= db.name %> max_connections: 25 pool_timeout: 2000 basic_auth: user: <%= properties.acm.user %> password: <%= properties.acm.password %>

cf-release/jobs/templates/acm.yml.erb

ERB内で Manifestの値が

参照される(後述)

• specファイルにJobが必要とするpackageの一覧を記述する

• templateは設定ファイルなどの生成に利用

Page 14: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Packages

パッケージのコンパイル方法を指定する

– packagesディレクトリを見よ

2012-06-21 14

--- name: acm dependencies: - libpq - ruby files: - acm/Gemfile* - acm/bin/**/* - acm/lib/**/* - acm/db/**/* - acm/vendor/**/* - core/common/**/

cf-release/packages/acm/spec

# abort script on any command that exit with a non zero value set -e cp -a * ${BOSH_INSTALL_TARGET} ( cd ${BOSH_INSTALL_TARGET}/acm bundle_cmd=/var/vcap/packages/ruby/bin/bundle libpq_dir=/var/vcap/packages/libpq $bundle_cmd config build.pg --with-pg-lib=$libpq_dir/lib --with-pg-include=$libpq_dir/include $bundle_cmd install --local --deployment --without development test )

cf-release/packages/acm/packaging

コンパイル時の 依存パッケージ

(運用時ではない)

• packgeはデプロイ時にコンパイルが行われる(キャッシュが無い場合)

• コンパイルはコンパイル用のVMを生成してその上で行われる

• packagingファイルがコンパイルを行うスクリプトとなる

Page 15: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

srcとblob

パッケージのソースコードはsrcディレクトリに保存しておく

– gitのサブモジュールでもよい

– 実際はパッチ程度しか置いてない

.tar.gzなどの巨大なファイルはblobsディレクトリに入れる

– releasesが肥大化するのを防ぐ • 他のマシンに環境を構築する場合に便利

– blobs内のファイルはblobstoreにアップロードする • blobstoreの設定は config/final.yml もしくはconfig/private.yml

– ローカル環境にファイルが無い場合、デプロイ時(bosh upload deployment)にblobstoreからダウンロードされる

– cf-releaseではblob.cfblobl.comからファイルがダウンロードされる

2012-06-21 15

--- final_name: appcloud min_cli_version: 0.19.1 blobstore: provider: atmos options: tag: BOSH url: https://blob.cfblob.com uid: bb6a0c89ef4048a8a0f814e25385d1c5/user1 blobstore_options: deprecated

cf-release/config/final.yml

Page 16: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

もくじ

BOSHとは

BOSHの基礎

BOSH環境の構築

BOSHによるオペレーション

まとめ

2012-06-21 16

Page 17: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

デプロイ作業の流れ

1. ローカルにBOSH CLI環境を構築する

2. ローカル環境にStemcellをダウンロードする

3. リモートのBOSHにStemcellをアップロードする

4. ローカル環境にReleasesを作成(ダウンロード)する

5. リモートのBOSHにReleaseをアップロードする

– 足りないファイルはblobstoreからローカルにダウンロードされた後にアップロードされる

6. 構成を記載したManifestファイルを作る

7. Manifestファイルを使ってデプロイを行う

2012-06-21 17

Page 18: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

BOSH CLIのインストール

リモートにあるBOSHを操作するためのコマンドラインインターフェース

– CloudFoundryにおけるVMCのようなもの

– ローカルに環境を作る

インストール方法は公式ドキュメントを見よ – https://github.com/cloudfoundry/oss-docs/blob/master/bosh/documentation/documentation.md

– 「Installing BOSH Command Line Interface」

– Ubuntu10.04で構築するとすんなりインストールできる

2012-06-21 18

# 依存パッケージのインストール

sudo apt-get install git-core build-essential libsqlite3-dev curl ¥

libmysqlclient-dev libxml2-dev libxslt-dev libpq-dev

# 最新版rbenv(Ruby環境構成ツール)の取得

cd ~

git clone git://github.com/sstephenson/rbenv.git .rbenv

# rbenvにパスを通す

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# shimsとautocompletionを有効に

echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# ruby1.9.2をダウンロードしてインストール

wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.gz

tar xvfz ruby-1.9.2-p290.tar.gz cd ruby-1.9.2-p290

./configure --prefix=$HOME/.rbenv/versions/1.9.2-p290

make

make install

# dotfileの再読み込み

source ~/.bash_profile

# デフォルトのRubyを1.9.2に設定

rbenv global 1.9.2-p290

# gemとbundlerをアップデート・インストール(rehash忘れずに)

rbenv rehash

gem update –system

gem install bundler

rbenv rehash

# bosh_cliをインストール

gem install bosh_cli

rbenv rehash

# 動いているか確認

bosh --version

Page 19: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

デプロイ作業の流れ

1. ローカルにBOSH CLI環境を構築する

2. ローカル環境にStemcellをダウンロードする

3. ローカル環境にReleasesを作成(作成)する

4. リモートのBOSHにStemcellをアップロードする

5. リモートのBOSHにReleaseをアップロードする

– 足りないファイルはblobstoreからローカルにダウンロードされた後にアップロードされる

6. 構成を記載したManifestファイルを作る

7. Manifestファイルを使ってデプロイを行う

2012-06-21 19

あ、BOSH環境作らないと

Page 20: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Micro BOSHとBOSH Deployer

Micro BOSHとは

– BOSH自体が分散システムなので、BOSHのデプロイにはBOSHが必要(無限ループ)

– 単体構成(全部入り)のBOSHであるMicro BOSHでブートストラップする • Micro BOSHで十分使い物になる

BOSH Deployerとは

– Micro BOSHをデプロイするためのBOSH CLIの拡張 • Micro BOSHは少し特殊なので専用の拡張が必要

• 専用のStemcellをデプロイするだけで動作する

– bosh micro コマンドでMicro BOSHを扱う

BOSH Deployerのインストール

– BOSHリポジトリ内のファイルをinstall

2012-06-21 20

git clone https://github.com/cloudfoundry/bosh.git

cd bosh/deployer

bundle install

rake install

Page 21: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

デプロイ作業の流れ

1. ローカルにBOSH CLI環境を構築する

2. ローカル環境にStemcellをダウンロードする

3. ローカル環境にReleasesを作成(作成)する

4. リモートのBOSHにStemcellをアップロードする

5. リモートのBOSHにReleaseをアップロードする

– 足りないファイルはblobstoreからローカルにダウンロードされた後にアップロードされる

6. 構成を記載したManifestファイルを作る

7. Manifestファイルを使ってデプロイを行う

2012-06-21 21

ここから先は IaaS が vSphare の場合です

AWSでは設定が異なります

Page 22: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Micro BOSHのデプロイ

設定ファイルを書いてデプロイを実行する

– 設定に沿って自動的にVMが新規作成され、Micro BOSHが起動する

2012-06-21 22

--- name: micro01 (デプロイ名:任意) network: (Micro Boshを動かすネットワークの設定) ip: 192.168.12.132 (Micro BOSHのサーバIP)

netmask: 255.255.252.0 gateway: 192.168.12.1 dns: - 192.168.3.1 cloud_properties: (vCenter上でどのネットワークにつなげるか)

name: VM Network cloud: plugin: vsphere (vSphereを使うという宣言)

properties: agent: ntp: - 192.168.3.1 vcenters: (デプロイ先のvCenterの設定)

- host: 192.168.15.1 user: Administrator password: ****** datacenters: - name: dell1 (データセンター名)

vm_folder: bosh_vm template_folder: bosh_template disk_path: bosh_disk datastore_pattern: netstor2 persistent_datastore_pattern: netstor2 allow_mixed_datastores: true clusters: - BoshTest (オプション)

# Micro BOSHのデプロイ設定用ディレクトリを作る

mkdir ~/deployments; cd ~/deployments mkdir micro01; cd micro01 vi micro_bosh.yml # 専用のStemcellをダウンロードしてくる

mkdir ~/stemcells; cd ~/stemcells bosh download public stemcell ¥ micro-bosh-stemcell-0.1.0.tgz # デプロイを実行(新しいVMが自動で作成される)

cd ~/deployments bosh micro deployment micro01 bosh micro deploy ¥ ~/stemcells/micro-bosh-stemcell-0.1.0.tgz

vCenter上で 設定に合わせてフォルダを作る

Page 23: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Micro BOSHのデプロイ

動いているか確認

以降ではこのMicro BOSH環境を単なるBOSH環境として扱う

– bosh(not bosh micro)コマンドを使う上では両者は同一である

2012-06-21 23

bosh micro status Stemcell CID sc-fa7998fa-6bd0-4c69-bcde-6c7fde5c653c Stemcell name micro-bosh-stemcell-0.1.0 VM CID vm-b2d540a2-59a7-4b83-9476-6bfdcb0a4652 Disk CID 1 Micro BOSH CID bm-82a2b61f-eee4-4d4c-afc4-9021873e50ea Deployment /home/testuser/deployments/micro01/micro_bosh.yml Target micro (http://192.168.12.132:25555) Ver: 0.4 (00000000)

Page 24: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

BOSHへのログイン

BOSH CLIに対してリモートのBOSH環境を指定する

2012-06-21 24

# さっき作った(Micro)BOSHをターゲットに設定

bosh target 192.168.12.132:25555 # admin/adminでログイン可能

Page 25: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Stemcellのダウンロードとアップロード

Stemcellは基本的に公式のものをダウンロードして使う

BOSHへアップロード

2012-06-21 25

# 公式stemcell一覧を見てみる

bosh public stemcells +-------------------------------+-------------------------------------------------------+ | Name | Url | +-------------------------------+-------------------------------------------------------+ | bosh-stemcell-0.3.0.tgz | https://blob.cfblob.com/rest/objects/4e4e78bca41e1... | | bosh-stemcell-0.4.4.tgz | https://blob.cfblob.com/rest/objects/4e4e78bca51e1... | | bosh-stemcell-0.4.7.tgz | https://blob.cfblob.com/rest/objects/4e4e78bca21e1... | | bosh-stemcell-0.5.2.tgz | https://blob.cfblob.com/rest/objects/4e4e78bca31e1... | | bosh-stemcell-aws-0.5.1.tgz | https://blob.cfblob.com/rest/objects/4e4e78bca21e1... | | micro-bosh-stemcell-0.1.0.tgz | https://blob.cfblob.com/rest/objects/4e4e78bca51e1... | +-------------------------------+-------------------------------------------------------+ To download use 'bosh download public stemcell <stemcell_name>'.For full url use --full. # stemcellのダウンロード(単なるtgzファイルなので適当なフォルダに置いておく)

bosh download public stemcell bosh-stemcell-0.5.2.tgz

bosh upload stemcell bosh-stemcell-0.5.2.tgz # 確認してみる

bosh stemcells +---------------+---------+-----------------------------------------+ | Name | Version | CID | +---------------+---------+-----------------------------------------+ | bosh-stemcell | 0.5.2 | sc-c7758729-77df-4884-b2e2-c798e6be1a37 | +---------------+---------+-----------------------------------------+ Stemcells total: 1

Page 26: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Releasesの作製とアップロード

今回は独自にReleaseを作らずにcf-releaseを使う • https://github.com/cloudfoundry/cf-release

– 独自にReleaseを作りたい場合は公式ドキュメントが参考になる

2012-06-21 26

# リリースファイルをgithubからクローン

git clone https://github.com/cloudfoundry/cf-release.git cd cf-release # リリース78をBOSHにアップロード

bosh upload release releases/appcloud-78.yml # 確認してみる

bosh releases +----------+----------+ | Name | Versions | +----------+----------+ | appcloud | 78 | +----------+----------+ Releases total: 1

Page 27: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Manifestファイルとデプロイ

Manifestファイルを作り、どのような構成でデプロイを行うかを定義する

– サンプルはこちら:https://github.com/cloudfoundry/oss-docs/blob/master/bosh/samples/cloudfoundry.yml

– ただし、古いので最新リリースでは動かない

非常に長いので要点だけ

2012-06-21 27

--- name: cf01 director_uuid: 2f27ef11-29ea-47b9-b416-979d15b25b6c release: name: appcloud version: 78 compilation: workers: 4 network: default cloud_properties: ram: 4096 disk: 8096 cpu: 2 update: canaries: 1 canary_watch_time: 3000-90000 update_watch_time: 3000-90000 max_in_flight: 2 max_errors: 1

コンパイル用VMの 設定

workers: VM数

bosh status で確認できるUUID

Releaseの 名前とバージョン

アップデート時の 検証用VMの設定

Page 28: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Manifestファイルとデプロイ

2012-06-21 28

networks: - name: default subnets: - reserved: - 192.168.12.2 - 192.168.12.255 - 192.168.13.1 - 192.168.13.255 - 192.168.14.1 - 192.168.14.9 - 192.168.15.1 - 192.168.15.254 static: - 192.168.14.10 - 192.168.14.140 range: 192.168.12.0/22 gateway: 192.168.12.1 dns: - 192.168.3.1 cloud_properties: name: VM Network resource_pools: - name: infrastructure network: default size: 32 stemcell: name: bosh-stemcell version: 0.5.2 cloud_properties: ram: 2048 disk: 8192 cpu: 1 env: bosh: password: ******************** # c1oudc0w - password generated using mkpasswd -m sha-512

- name: deas network: default size: 4 stemcell: name: bosh-stemcell version: 0.5.2 cloud_properties: ram: 2048 disk: 16384 cpu: 2 env: bosh: password: ******************** # c1oudc0w - password generated using mkpasswd -m sha-512

自動的に 払い出さないIP

IPを払い出すレンジ

VMのリソースプール 共通設定

VMのリソースプール DEAだけは別に設定

Page 29: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

Manifestファイルとデプロイ

Manifestが書けたらデプロイで実行

2012-06-21 29

jobs: - name: debian_nfs_server template: debian_nfs_server instances: 1 resource_pool: infrastructure persistent_disk: 8192 networks: - name: default static_ips: - 192.168.14.10 - 以下他のJobの設定

… properties: domain: cloudfoundry.test env: {} networks: apps: default management: default nats: user: nats password: aaa3ij3122 address: 192.168.14.11 port: 4222 以下他のpropertyの設定

Jobごとに いくつVMを 作るかを指定

共通設定を記述 値はJobのtemplate内で

利用可能

# Manifestを指定

bosh deployment ./cf01.yml # デプロイ

bosh deploy

Page 30: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

もくじ

BOSHとは

BOSHの基礎

BOSH環境の構築

BOSHによるオペレーション

まとめ

2012-06-21 30

Page 31: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

BOSHによるオペレーション

BOSH CLIからJobやTaskの操作が可能

Manifest変更後に再度bosh deployすると変更が反映される

2012-06-21 31

Job management start <job> [<index>] Start job/instance stop <job> [<index>] Stop job/instance --soft stop process only --hard power off VM restart <job> [<index>] Restart job/instance (soft stop + start) recreate <job> [<index>] Recreate job/instance (hard stop + start) Log management logs <job> <index> Fetch job (default) or agent (if option provided) logs --agent fetch agent logs --only <filter1>[...] only fetch logs that satisfy given filters (defined in job spec) --all fetch all files in the job or agent log directory Task management tasks Show the list of running tasks tasks recent [<number>] Show <number> recent tasks task [<task_id>|last] Show task status and start tracking its output --no-cache don't cache output locally --event|--soap|--debug different log types to track --raw don't beautify log cancel task <id> Cancel task once it reaches the next cancel checkpoint

Page 32: すごいBOSHたのしく学ぼう

NTT Software Innovation Center

まとめ

BOSHを使うことでシステム全体の構成管理が楽になる

Manifestファイルを書くのが大変だけど頑張ろう

まだまだ不安定な部分が多いので今後に期待

よくあるトラブル

– デプロイ中にBOSH Agentが応答しなくなる • メモリ不足の可能性あり。VMのメモリは最低4GBにしておく

– bosh upload releaseが失敗する • HDDがいっぱいになっている可能性あり。/tmpにたまってるファイルを消す

– UAADBとCCDB周りでManifestのエラーが出る • テンプレートが変わったので対応する • https://github.com/cloudfoundry/cf-release/commit/3a1abefe7352c22b4fff70dee9ae27c111ba75c8

2012-06-21 32