Goiardi is an implementation of the Chef server (http://www.opscode.com) written
in Go. It can either run entirely in memory with the option to save and load the
in-memory data and search indexes to and from disk, drawing inspiration from
chef-zero, or it can use MySQL as its storage backend.
It is a work in progress. At the moment normal functionality as tested with
knife works, and chef-client runs complete successfully. At this point, almost
all chef-pendant tests successfully successfully run, with a few disagreements
that don't impact the clients. It does pretty well against the official
chef-pedant, but because goiardi handles some authentication matters a little
differently than the official chef-server, there is also a fork of chef-pedant
located at https://github.com/ctdk/chef-pedant that's more custom tailored to
Many go tests are present as well in different goiardi subdirectories.
Goiardi currently has five dependencies: go-flags, go-cache, go-trie, toml, and
the mysql driver from go-sql-driver.
To install them, run:
from your $GOROOT.
If you would like to modify the search grammar, you'll need the 'peg' package.
To install that, run
In the 'search/' directory, run 'peg -switch -inline search-parse.peg' to
generate the new grammar. If you don't plan on editing the search grammar,
though, you won't need that.
1. Install go. (http://golang.org/doc/install.html) You may need to upgrade to
go 1.2 to compile all the dependencies.
2. Make sure your $GOROOT and PATH are set up correctly per the Go installation
3. Download goairdi
4. Run tests, if desired. Several goiardi subdirectories have go tests, and
chef-pedant can and should be used for testing goiardi as well.
5. Install the goiardi binaries.
6. Run goiardi.
You can get a list of command-line options with the '-h' flag.
Goiardi can also take a config file, run like goiardi -c
/path/to/conf-file. See etc/goiardi.conf-sample for an example documented
configuration file. Options in the configuration file share the same name
as the long command line arguments (so, for example, --ipaddress=127.0.0.1
on the command line would be ipaddress = "127.0.0.1" in the config file.
Currently available command line and config file options:
For more documentation on Chef, see http://docs.opscode.com.
If goiardi is not running in use-auth mode, it does not actually care about .pem
files at all. You still need to have one to keep knife and chef-client happy.
It's like chef-zero in that regard.
If goiardi is running in use-auth mode, then proper keys are needed. When
goiardi is started, if the chef-webui and chef-validator clients, and the admin
user, are not present, it will create new keys in the --conf-root directory. Use
them as you would normally for validating clients, performing tasks with the
admin user, or using chef-webui if webui will run in front of goiardi.
*Note:* The admin user, when created on startup, does not have a password. This
prevents logging in to the webui with the admin user, so a password will have to
be set for admin before doing so.
Goiardi can now use MySQL to store its data, instead of keeping all its data
in memory (and optionally freezing its data to disk for persistence).
If you want to use MySQL, you (unsurprisingly) need a MySQL installation that
goiardi can access. This document assumes that you are able to install,
configure, and run MySQL.
Once the MySQL server is set up to your satisfaction, you'll need to install
sqitch to deploy the schema, and any changes to the database schema that may come
along later. It can be installed out of CPAN or homebrew; see "Installation" on
http://sqitch.org for details.
The sqitch MySQL tutorial at https://metacpan.org/pod/sqitchtutorial-mysql
explains how to deploy, verify, and revert changes to the database with sqitch,
but the basic steps to deploy the schema are:
* Create goiardi's database: `mysql -u root --execute 'CREATE DATABASE goiardi'`
* Optionally, create a separate mysql user for goiardi and give it permissions on that database.
* In sql-files/mysql-bundle, deploy the bundle: `sqitch deploy db:mysql://root@<password>/goiardi`
If you really really don't want to install sqitch, apply each SQL patch in
sql-files/mysql-bundle by hand in the same order they're listed in the
The above values are for illustration, of course; nothing requires goiardi's
database to be named "goiardi". Just make sure the right database is specified in
the config file.
Set `use-mysql = true` in the configuration file, or specify `--use-mysql` on
the command line. It is an error to specify both the `-D`/`--data-file` flag and
`--use-mysql` at the same time.
At this time, the mysql connection options have to be defined in the config
file. An example configuration is available in `etc/goiardi.conf-sample`, and is
Goiardi has been built and run with the native 6g compiler on Mac OS X (10.7,
10.8, and 10.9), Debian squeeze and wheezy, a fairly recent Arch Linux, and
Goiardi has also been built and run with gccgo (using the "-compiler gccgo"
option with the "go" command) on Arch Linux. Building it with gccgo without
the go command probably works, but it hasn't happened yet. This is a priority,
though, so goiardi can be built on platforms the native compiler doesn't support
Note regarding goiardi persistence and freezing data:
As mentioned above, goiardi can now freeze its in-memory data store and index to
disk if specified. It will save before quitting if the program receives a
SIGTERM or SIGINT signal, along with saving every "freeze-interval" seconds
Saving automatically helps guard against the case where the server receives a
signal that it can't handle and forces it to quit. In addition, goiardi will not
replace the old save files until the new one is all finished writing. However,
it's still not anywhere near a real database with transaction protection, etc.,
so while it should work fine in the general case, possibilities for data loss
and corruption do exist. The appropriate caution is warranted.
In addition to the aforementioned Chef documentation at http://docs.opscode.com,
more documentation specific to goiardi can be viewed with godoc. See
http://godoc.org/code.google.com/p/go.tools/cmd/godoc for an explanation of how
See the TODO file for an up-to-date list of what needs to be done. There's a
There's going to be a lot of these for a while, so we'll just keep those in a
BUGS file, won't we?
This started as a project to learn Go, and because I thought that an in memory
chef server would be handy. Then I found out about chef-zero, but I still wanted
a project to learn Go, so I kept it up. Chef 11 Server also only runs under
Linux at this time, while Goiardi is developed under Mac OS X and ought to run
under any platform Go supports (only partially at this time though).
If you feel like contributing, great! Just fork the repo, make your
improvements, and submit a pull request. Tests would, of course, be appreciated.
Adding tests where there are no tests currently would be even more appreciated.
At least, though, try and not break anything worse than it is. Test coverage has
improved, but is still an ongoing concern.
Goiardi is authored and copyright (c) Jeremy Bingham, 2013. Like many Chef
ecosystem programs, goairdi is licensed under the Apache 2.0 License. See the
LICENSE file for details.
Chef is copyright (c) 2008-2013 Opscode, Inc. and its various contributors.
Thanks go out to the fine folks of Opscode and the Chef community for all their
Also, if you were wondering, Ettore Boiardi was the man behind Chef Boyardee. Wakka wakka.