Eric Helgeson

Eric Helgeson

About Blog Email GitHub RSS

08 Jun 2015
Building chef from source to change Prefix

There may be times when you want chef to be located somewhere besides /opt/chef. Currently you can’t just use rpm --prefix=/data/myapp to move it to a different location due to compile time settings, so lets compile chef using omnibus to store it under /data/myapp/chef.

First we need three repos that comprise omnibus for chef -

$ git clone git@github.com:chef/opscode-omnibus.git
$ git clone git@github.com:chef/omnibus-software.git
$ git clone git@github.com:chef/omnibus-chef.git

Then lets checkout the version of omnibus-chef that is closest without going over the version of chef we’d like to install. omnibus-chef and chef versions do not match 1-1.

$ cd omnibus-chef
# git tag list # to list tags
# git checkout tags/<version here>
$ git checkout tags/chef-12.2.0

I’m building RPMs for centos. omnibus will build the package for whatever platform it is run on.

Lets Edit a few files for our usecase -

.kitchen.yml

# Change the box to something that can be downloaded from vagrant cloud
# in this case I replaced centos-6.5 with chef/centos-6.5
  - name: chef/centos-6.5
....
# Change the install_dir to the location you want the RPM to be installed
attributes:
  omnibus:
    <<: *attribute_defaults
        install_dir: /data/myapp/chef

We need to override the default_root in the omnibus-chef project to set the new root. Its originally set in the omnibus package, but we’ll just hax it here quick:

config/projects/chef.rb

default_root = "/data/myapp"

Lastly pin the version of chef you’d like installed

config/projects/chef.rb [0]

override :chef, version: "12.3.0"
override :ohai, version: "8.3.0"

Optionally edit, or remove, the package-scripts/chef/postinst script. In my case I wanted it to not touch other parts of the file system so I commented it out. Most cases you’d just change this line -

INSTALLER_DIR=/data/myapp/chef
$ kitchen converge chef-chef-centos-65
$ kitchen login chef-chef-centos-65
# Setup Env (dont worry about the error)
$ source ./load-omnibus-toolchain.sh
$ cd omnibus-chef
$ bundle install --without development

$ bundle exec omnibus build chef

# Clean out dir if you have an issue or change versions you're building
$ bundle exec omnibus clean chef

You then should have a package under the pkg/ folder ready to test out!

[0] - Example pin of chef version - https://github.com/chef/omnibus-chef/commit/0afd9bbe9df486ccebf5908b4f17a1b013860abc


Want to contribute to this article? Edit this post on Github!

About Blog Email GitHub RSS