Sous Chef

Chef’s prep-cook

Description

Create bash scripts with chef-like syntax

Example

Given this code:

config = {:dir => '/home'}

SousChef.prep(:verbose, :shebang) do
  halt_on_failed_command

  log do
    stdout "/root/stdout.log"
    stderr "/root/stderr.log"
  end

  file "/etc/config.yml" do
    content config.to_yaml
    mode 0600
  end

  execute 'rvm' do
    creates "/usr/local/rvm/scripts/rvm"
    command "gem install rvm && rvm-install"
  end

  execute "source rvm" do
    command <<-EOS
RUBYOPT=""
source /usr/local/rvm/scripts/rvm
    EOS
  end

  gemfile config[:dir] do
    source "http://gemcutter.org/"

    gem 'chef'
    gem 'dbi',          '0.4.3'
    gem 'dbd-mysql',    '0.4.3'
    gem 'open4',        '0.9.6'
  end

  execute 'install bundler' do
    command "gem install bundler --no-ri --no-rdoc"
  end

  execute 'bundle gems' do
    cwd config[:dir]
    command "gem bundle"
  end
end

the return value will be:

#!/bin/bash

# halt on failed command
set -e

exec 1>/root/stdout.log 2>/root/stderr.log

# /etc/config.yml
if ! test -e /etc/config.yml; then
  echo '--- 
:dir: /home
' > /etc/config.yml
fi
chmod 0600 /etc/config.yml

# rvm
if ! test -e /usr/local/rvm/scripts/rvm; then
  gem install rvm && rvm-install
fi

# source rvm
RUBYOPT=""
source /usr/local/rvm/scripts/rvm

# /home
if ! test -e /home/Gemfile; then
  echo 'source "http://gemcutter.org/"

gem "chef"
gem "dbd-mysql", "0.4.3"
gem "dbi",       "0.4.3"
gem "open4",     "0.9.6"' > /home/Gemfile
fi

# install bundler
gem install bundler --no-ri --no-rdoc

# bundle gems
cd /home
gem bundle