How to run Engine Yard Local in CentOS 6.5
Engine Yard is a platform as a service (PaaS) company that focuses on deployment and management of Ruby on Rails, PHP and Node.js servers in order to provide to customer a quick and simple way to deploy applications. They provide also a local version of Ruby on Rails server on Gentoo Linux so anyone can test how it works. I wanted to run the Engine Yard Local on CentOS 6.5 to test sample a Ruby application without the use of cloud services but I have faced some difficulties during deployment that I’ve been able to resolve and wanted to share it with you. This article shows all the steps to run Engine Yard Local on fresh install of CentOS 6.5 that I used for deployment.
Prerequisites to run Engine Yard Local:
- VirtualBox 4.0, 4.1 or 4.2
- Ruby 1.9.3
There are two main options how to install Virtualbox:
- using package downloaded from Virtualbox sites. This link refers to download page for VirtualBox 4.2.22 version and you should choose version ending with:
VirtualBox-4.2.22-el6-1.i686.rpm for 32bit OS VirtualBox-4.2.22-el6-1.x86_64.rpm for 64bit OS
- using repository prepared for CentOS and other RHEL distributions. The repository can be set via
cd /etc/yum.repos.d wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
and VirtualBox 4.2.22 version installed by
yum install VirtualBox-4.2
You also need to have installed Dynamic Kernel Support Module (DKMS) from RPMForge repository, which can be installed by:
rpmforge-release-0.5.3-1.el6.rf.i686.rpm for 32bit OS rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm for 64bit OS
and for the DKMS install run:
yum --enablerepo rpmforge install dkms
There is a ruby in the official CentOS repository in version 1.8.7 but Engine Yard requires version 1.9.3 as it is written on Engine Yard Local page.
Prerequisites for Ruby
Before compiling and installing newer Ruby and Rubygems, it is also necessary to install some dependencies:
yum install openssl-devel zlib-devel
Note: These should be minimal dependencies to run Engine Yard Local, you can add another regarding your future requirements.
Optionally, you can install YAML lib which provides an option for Ruby to use a newer implementation of YAML parser (version 0.1.4). You will be getting the following warning message while using ruby, if you don’t install it:
/usr/local/lib/ruby/1.9.1/yaml.rb:84:in `<top (required)>': It seems your ruby installation is missing psych (for YAML output). To eliminate this warning, please install libyaml and reinstall your ruby.
This is how to install Psych YAML parser:
wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz tar zxfv yaml-0.1.4.tar.gz cd yaml-0.1.4 ./configure make
and with root privileges run
Download, compile and install Ruby (version 1.9.3 p484) is similar as previous steps:
wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p484.tar.gz tar zxfv ruby-1.9.3-p484.tar.gz cd ruby-1.9.3-p484 ./configure make
and with root privileges run
Verify that Ruby was succesfully installed by
As the Engine Yard Local is distributed as a Gem, you need to install RubyGems tool. You can download RubyGems (version 2.1.11) via:
wget http://production.cf.rubygems.org/rubygems/rubygems-2.1.11.tgz tar zxfv rubygems-2.1.11.tgz cd rubygems-2.1.11/
and with root privileges run
Verify that RubyGems was successfully installed by
Engine Yard Local gem
With all prerequisites met for Engine Yard Local, you can install it as written in documentation here (assuming root privileges):
gem install engineyard-local
Engine Yard Local example
You can try sample ruby application by downloading git repository
git clone git://github.com/engineyard/todo.git cd todo ey-local up
Note: You might see an error message indicating wrong settings for base MAC address for eth0/NAT. This is a known issue, workaround is start “ey-local up” once again.
When ey-local up successfully finishes, you should be able to see ToDo example running at http://127.0.0.1:8080.
If you see an error message instead of the ToDo application, you probably see some error messages at the end of the log too. These are given to stdout by ey-local up command. They look like:
[default] rake aborted! [default] undefined method `create' for Psych::Visitors::YAMLTree:Class [default] [default] Tasks: TOP => assets:precompile:primary [default] (See full trace by running task with --trace) [default] rake aborted! Command failed with status (1): [/usr/bin/ruby19 /usr/bin/rake assets:preco...] Tasks: TOP => assets:precompile (See full trace by running task with --trace
It seems that this happens when Ruby 1.9.3 is not compatible with Psych YAML parser so you need to switch back to Syck YAML parser. This incompatibility occurs in both cases no matter, if you installed it or not. There are two options how to solve it:
- add manually
YAML::ENGINE.yamler = "syck" if RUBY_VERSION >= "1.9.2"
Bundler.require(:default, Rails.env) if defined?(Bundler)
in config/application.rb file
- OR apply patch to config/application.rb in downloaded example’s todo directory.
Create new file e.g. engineyard.patch with content:
--- config/application.rb 2014-01-20 11:45:50.856045465 +0000 +++ config/application.rb 2014-01-20 11:45:32.680045487 +0000 @@ -5,6 +5,7 @@ # If you have a Gemfile, require the gems listed there, including any gems # you've limited to :test, :development, or :production. Bundler.require(:default, Rails.env) if defined?(Bundler) +YAML::ENGINE.yamler = "syck" if RUBY_VERSION >= "1.9.2" module Listr class Application < Rails::Application
and apply the patch using:
patch -p1 config/application.rb engineyard.patch
The last step is reboot the Gentoo rack machine to apply changes via
ey-local down ey-local up
You should be able to run Engine Yard Local version and you can discover Engine Yard options on your local machine. You can customize deploying the machine using different Chef’s cookbooks and managing recipes and test your applications with EngineYard’s platform. Running on Engine Yard local environment might be a good alternative if you want to learn about underlying platform or if you want to develop your applications in an environment where internet connection might be an issue such as while traveling on your business trips.