This is a guest blog post by Altoros, a software development firm specializing in PaaS enablement and integration services around Hadoop and NoSQL.
Cloud Foundry is by default a highly distributed multi-tenant platform that is usually deployed at scale (>40 nodes) on top of existing virtualized infrastructure (e.g., VMware vSphere or vCloud, Amazon AWS or OpenStack). For the novice Cloud Foundry developer, a full scale PaaS deployment isn’t always an affordable choice. To address this issue, the Cloud Foundry team released Micro Cloud Foundry as a virtual machine image that could be run on a laptop. Micro Cloud Foundry behaved much like a production cloud and provided developers a sandbox to play with. An alternative to using Micro Cloud Foundry on a virtual machine is to install Cloud Foundry natively on a development tool such as Vagrant.
What is Vagrant?
Vagrant is really a developer’s VM toolbox, as it provides an easy way to create and configure lightweight, reproducible, and portable development environments. It sits on top of a virtualization layer such as Virtualbox, VMware Fusion or VMware Workstation. The VM definition and configuration file (Vagrantfile
) is part of the versioned source code repository.
Cloud Foundry on Vagrant
The Cloud Foundry deployment on Vagrant is a self-contained partial Cloud Foundry v2 installation which runs inside of a Vagrant-managed VM with Ubuntu 12.04.2 LTS. To get started, you need to download and install Vagrant. After that, just follow the step by step directions for deploying the Cloud Foundry Vagrant installer on Github.
You should be able to setup and configure everything in under 30 minutes, and easily push a simple Ruby Sinatra web application on the local Cloud Foundry PaaS.
Installation
Vagrant allows you to run Chef recipes after booting up the VM (these are located under the chef
directory). Every time you bring up a VM (vagrant up
), it will check the Chef folder and determine if any recipes should be run. The first time the Vagrant image is started, it will take some time to install all of the required packages.
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. Big thanks to Scott Frederick aka @scottyfred who provided the contribution of Berkshelf support!
Starting and Stopping Cloud Foundry Components
There are two main ways to start or stop the Cloud Foundry components. Most operators prefer to use start.sh
and stop.sh
which are bash scripts that launch upstart commands to run the components.
$ cd /vagrant $ ./start.sh cf-ng start/running # Verify running processes $ ps ax 11733 ? S 0:00 /bin/bash ./bin/file_server 11734 ? S 0:00 /bin/bash ./bin/dea_ng 11739 ? Sl 0:00 ruby spec/bin/file_server.rb 11745 ? S 0:00 /bin/bash ./bin/dir_server 11750 ? Sl 0:00 ruby /home/vagrant/.rbenv/versions/1.9.3-p392/bin/nats-server 11752 ? Sl 0:01 ruby bin/dea config/dea.yml 11759 ? S 0:00 /bin/bash ./bin/warden 11766 ? Sl 0:00 ruby /home/vagrant/.rbenv/versions/1.9.3-p392/bin/rake dir_server:run 11793 ? S 0:00 bash /home/vagrant/.rbenv/plugins/rbenv-sudo/bin/rbenv-sudo bundle exec rake warden:start[config/test_vm.yml] 11842 ? S 0:00 /bin/bash ./bin/health_manager 11852 ? S 0:00 /bin/bash ./bin/gorouter 11861 ? S 0:00 /bin/bash ./bin/cloud_controller 11865 ? Sl 0:00 ruby ./bin/health_manager 11866 ? S 0:00 sudo env PATH=/home/vagrant/.rbenv/shims:/home/vagrant/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin bundle exec rake warden:start[config/test_vm.yml] 11877 ? S 0:00 sudo ./bin/router -c=config/gorouter.yml 11878 ? Sl 0:00 ruby /home/vagrant/.rbenv/versions/1.9.3/bin/rake warden:start[config/test_vm.yml] 11896 ? Sl 0:00 ./bin/router -c=config/gorouter.yml 11946 ? S 0:00 /bin/bash ./bin/uaa 11951 ? Sl 0:29 /usr/lib/jvm/default-java/bin/java -classpath /usr/share/maven/boot/plexus-classworlds-2.x.jar -Dclassworlds.conf=/usr/share/maven/bin/m2.conf -Dmaven.home=/usr/share/maven org 12012 ? Sl 0:00 go/bin/runner -conf config/dea.yml 12103 ? Sl 0:02 ruby bin/cloud_controller -m
An alternate method is to use Foreman to declare the processes required to run your application in a single file: Procfile
. Foreman is a useful Ruby gem that allows you to run several processes with only one command (foreman start
). Foreman will start and the display the stdout
and stderr
of each process – this is useful because you can see all the logs in one terminal with different colors for each process. The scripts below were generated using Foreman (via foreman export
).
Our Procfile
nats: nats-server warden: ./bin/warden uaa: ./bin/uaa dir_server: ./bin/dir_server file_server: ./bin/file_server dea_ng: ./bin/dea_ng gorouter: ./bin/gorouter cc_ng: ./bin/cloud_controller health_manager: ./bin/health_manager
Foreman output (colored)
Custom Config Files
Vagrant uses the Cloud Foundry source code, downloaded directly from the corresponding Github repository for each module (CCNG, Router, NATS, DEA, etc). The .gitmodules
file contains configuration details that can be customized or adapted for local installation onto Vagrant. The following are a few examples of different customizations for local Cloud Foundry deployments.
To add logging and increase the verbosity of the logging stream:
logging: file: /vagrant/logs/cloud_controller.log level: debug2
To make a DB persistent after VM shutdown, configure it in the corresponding custom_config_files/cloud_controller_ng/cloud_controller.yml
file.
db: database: "sqlite:///vagrant/db/cloud_controller.db"
To set vcap.me as default domain, which is pointed to localhost:
Domain in cloud_controller.yml
:
system_domain_organization: vcap.me system_domain: vcap.me external_domain: - api2.vcap.me app_domains: - vcap.me
There are more examples and detailed changes recommended to the configuration files in the documentation on Altoros’s Github Vagrant Installer.
Building the Virtual Machine
We won’t duplicate the instructions to build the Cloud Foundry virtual machine in this blog post. Just follow the step-by-step instructions provided and you’ll have a Cloud Foundry v2 instance in a matter of minutes.
Learn More About Cloud Foundry
Cloud Foundry on Vagrant is a great tool for learning about the inner workings of Cloud Foundry and its various components. As always, don’t forget to refer to the great wealth of documentation available at the Cloud Foundry project page, and in particular the sections on using and running Cloud Foundry. Also, if you’re a developer you should signup and subscribe to the mailing list.
You can also find more information on the web about Cloud Foundry, including these popular sites:
- http://starkandwayne.com/articles.html
- http://corneliadavis.com/blog/tag/cloudfoundry/
- http://www.think-foundry.com/
Feel free to leave us feedback on your experience deploying Cloud Foundry on Vagrant and be sure to check back frequently for updates and improvements on the Github project.