February 25, 2011 - Jonathan Otto email me: jonathan.otto@gmail.com
Chef is an incredible tool, but despite its beginnings in 2008/2009 it still lacks an effective quick start, or even an official "hello world" - so it takes too long to really get started as you desperately search for tutorials/examples/use cases. The existing quick starts or tutorials take too long and fail to explain the scope or what Chef is doing. This is really unfortunate because the world could be a better place if more people used Chef (or even Puppet) and we didn't have to guess how to configure a server for various applications.
Officially, Chef is a "configuration management tool" where you write "recipes". It's written in Ruby and you'll need at least version 1.8.6. Here's the official Chef Quick Start guide but I think it fails at succinctly presenting the scope of Chef or even how to use it, hence this document.
Put simpler, Chef is a Ruby DSL (domain specific language) for configuring GNU/Linux (or BSD) machines (Windows is not well supported), it has 2 flavors, "Chef Server" and "Chef Solo", in this document I'm talking about Chef SOLO because it's easier to get started with - and works well as a complement to Rails apps.
Put simpler yet: Chef is a ruby script that uses "recipes" (a recipe is a Ruby file that uses the Chef DSL) to install software and run scripts on GNU/Linux servers. You can run Chef over and over again safely because most recipes know not to, for example, reinstall something that already exists (sometimes you have to code this functionality of not installing something that already exists, but most of the DSLs do it already).
Think of Chef as having 4 components:package("vim")
Just duplicate the directory structure I have listed above, and in the default.rb file, you only need 1 line. that "package" method knows which package management software to use depending on what OS is running and then leverages it.
bash "really awesome way to create a mysql database from chef using the bash method" do
# dont if the db already exists
not_if("/usr/bin/mysql -uroot -pmiller_highlife_lol_jk -e'show databases' | grep #{node[:create_mysql_db][:db_name]}", :user => 'jotto')
# run as the jotto user
user "jotto"
# a heredoc of the code to execute, note the node hash is created from the JSON file
code <<-HEY_BRO_EOM
mysql -uroot -ppmiller_highlife_lol_jk -e 'create database #{node[:create_mysql_db][:db_name]}'
HEY_BRO_EOM
end
{
"name": "ottobib",
"recipes": [
"create_mysql_db",
"vim",
],
"create_mysql_db": {
"db_name": "ottobib_production"
}
}
file_cache_path "/tmp/chef-solo" cookbook_path "/home/jotto/my_cookbooks" log_level :info log_location STDOUT ssl_verify_mode :verify_none
NOW you can run it over and over again and your system will end up with Vim and a ottobib_production database. If you want to get CRAZY: add a recipe that checks out the latest copy of your application source code and then setup a cron job to execute your chef script every minute!
Here's what your /home/jotto/my_cookbooks dir should look like:
|-chefsoloconfig.rb
|-roles
-ottobib.json
|-vim
|-recipes
-default.rb
|-create_mysql_db
|-recipes
-default.rb
sudo /var/lib/gems/1.8/bin/chef-solo -c /home/jotto/my_cookbooks/chefsoloconfig.rb -j /home/jotto/my_cookbooks/roles/ottobib.json -ldebug
Here are some other sensible chef resources: