ARM machines can be cheaper alternatives to
X86_64 instances either running
on bare metal (e.g. on Raspberry Pi) or in cloud.
They are becoming more and more popular and they're making their way into the
Chef is a popular
infrastructure-as-a-code tool, which you can install to
remotely or locally manage your servers.
In this post you can find how to build your favorite version of Chef for ARM.
At the time of writing this article the most recent versions of Chef are
available to download for ARM but not for all Linux distributions, namely
The Ruby GitHub page is very helpful when it comes to compiling Ruby from source code.
You can skip this step and go directly to Compiling
Chef if your distro already has a suitable ruby version
available. In my case, the version was too old for the Chef build to work.
The building process is as easy as:
Installation in a destination directory
make install will install Ruby in
/usr directory, but that behavior
can be changed using
make install DESTDIR=~/ruby
The above command will install the build in
~/ruby. This is useful if
access is not available, or if the build is meant to be copied to a different
Install Ruby globally
After building Ruby, you can install it globally by:
sudo cp -r ~/ruby/usr/* /usr
You will need
bundler to be installed to build Chef.
gem is also
needed which comes as a package with
bundler is installed, if not install it:
gem install bundler
Downloading the source
Download the specific version of Chef source from
Chef on GitHub
then extract the package.
wget https://github.com/chef/chef/archive/v15.6.10.tar.gz tar xf v15.6.10.tar.gz cd ~/chef-15.6.10/omnibus # yes, chef is built from the omnibus folder
Then install the required dependencies for building chef locally:
bundle install --without development --path=.bundle
This will install all the dependencies in
.bundle inside the source folder.
Building using omnibus
After that start building Chef using
bundle exec omnibus build chef -l internal
is a packaging solution that makes sure the packages and all its dependencies
are installed in a way that is easily manageable and will not conflict with the
existing packages installed on your system.
The result of the above build is a package specific to your OS, in this case,
I'm building Chef for Debian, so there will be a
.deb file that I will able
to install and uninstall using
ls pkg/ chef_15.6.10*.deb
In my case the build failed because of a licensing error, you can try
ignoring licensing problems for the build, read more about that in
I fixed that by editing the
omnibus.rb file (the omnibus config) and adding
these two lines:
fatal_licensing_warnings false fatal_transitive_dependency_licensing_warnings false
Installation of the built deb package
Now we can easily install the package:
sudo dpkg -i pkg/chef_15.6.10*.deb
And verify the desired version is installed:
chef-client -v Chef Infra Client: 15.6.10