Chef (the DevOps kind, not the shouty restaurant kind)
When I started looking at the new wave of DevOps, I sort of just picked Puppet. A few respected people in the Drupal world were already using it and it wasn’t ruby. So easy win right?
We use Puppet at Demotix and really like it. But I recently wanted to see how the other half lives, so tried to do a simple Drupal stack using Chef.
Here are my basic notes on that process, I hope to do some more analysis later.
Anyway, onto the notes/tutorial/thing.
Jump past the tutorial to see how to install the bits your going to need.
QUICK START / TUTORIAL
I want to create a simple LAMP server and install Drupal Commerce Kickstart (https://drupal.org/project/commerce_kickstart).
To do this you will need :
- Chef
- Chef-solo
- Berkshelf
- Server (or VM) installed with Ubuntu to install onto.
Step 1: Create a solo kitchenknife solo init tutorial
Step 2: Download my probably very badly made cookbook for thiscd tutorial/site-cookbooks;
curl -L https://github.com/a-c-m/chef-drupal-kickstart-lamp/archive/master.zip | tar zx
mv chef-drupal-kickstart-lamp-master chef-drupal-kickstart-lamp
Step 3: Let Berkshelf download the dependencies, into the cookbooks foldercd chef-drupal-kickstart-lamp
berks install --path ../../cookbooks/
(this will install a lot of files into the cookbooks directory)
Step 4: Prepare the target servercd ../../
knife solo prepare <ip>
(this will create a file in nodes, which describes your node)
Step 5: Set up the node to run the recipe
Edit with a tool of your choice the nodes/
{
"mysql": {
"server_root_password": "ChangeMelikeRIGHTNOW",
"server_repl_password": "ChangeMelikeRIGHTNOW",
"server_debian_password": "ChangeMelikeRIGHTNOW"
},
"run_list":["recipe[apt]", "recipe[chef-drupal-kickstart-lamp]"]
}
Your setting up your mysql passwords and then asking chef to run apt (so its up to date), then run the main recipe.
Step 5: Start cooking (run the code)knife solo cook <ip>
Step 6: Done, go try out the new sitehttp://<ip>/
Tadaaaaa !
BEST QUICKSTART / TUTORIAL (other than this one)
http://devops.mashion.net/2011/08/04/chef-solo-basics/
CLIENT INSTALL
http://www.opscode.com/chef/install/
curl -L https://www.opscode.com/chef/install.sh | sudo bash
KNIFE SOLO
Running Chef without having a central server. These little set of tools makes that simpler.
gem install knife-solo
I think there is more than one way to skin this cat, but this is the one I found.
There is also some interesting stuff using solo with Capistrano.
LIBRARIAN
A script to auto download and manage your dependent “cook books”.
gem install librarian-chef
Then in the working dir run
librarian-chef init
Which will create you a Cheffile, which will have a bunch of commented out lines. Comment them back in (some you might not need) and then run
librarian-chef install
Which will go off and install your Dependant books. Smart!
BERKSHELF
Same idea as Librarian, except it does it a bit better by all accounts, it installs the dependencies to a shared location, instead of per module, also some some other smart things I’ve not worked out yet.
Installed via the gem
gem install berkshelf
It stores its dependencies in Berksfile.
By default when you
berks install
it installs them into your home directory, which means if your using solo (like we are), you need to force it to install to a local folder e.g.
berks install --path ../../cookbooks/
PROBLEMS & SOLUTIONS
undefined method
[]’ for nil:NilClassand
uninitialized constant Chef::Recipe::Opscode`
Basically, newer versions of Chef need you to load in defaults via the metadata.rb Thanks to : http://stackoverflow.com/questions/17391644/default-attribute-is-nil-for-chef-apache2-cookbook
I STILL WANT TO LOOK INTO
- Server based systems
- Capistrano based systems
- Roles (http://docs.opscode.com/essentials_roles.html)
- Environments (http://docs.opscode.com/essentials_environments.html)
- Data bags (http://docs.opscode.com/essentials_data_bags.html)
- Making it work with Docker.io