I usually use Ubuntu 10.04 as my server platform. Now that I'm switching to ruby 1.9.2 in production, the utter crapness of the built-in Ubuntu packages has become unsupportable (ruby 1.9.1 doesn't work with Bundler, for example).
So, I wanted a way to install ruby 1.9.2 using Puppet. This is what I came up with. The files fit together like this;
In my site.pp file, I've got this;
import "ruby192" include ruby
The init.pp file just contains this;
import "*"
The real fun is in the ruby.pp file;
class ruby {
exec { "apt-update":
command => "/usr/bin/apt-get update"
}
# pre-requisites
package { [
"gcc",
"g++",
"build-essential",
"libssl-dev",
"libreadline5-dev",
"zlib1g-dev",
"linux-headers-generic"
]:
ensure => "installed",
require => Exec["apt-update"]
}
# put the build script in /root
file { "/root/build-ruby.sh":
ensure => "present",
source => "puppet:///modules/ruby192/build-ruby.sh",
mode => 755
}
# run the build script
exec { "build-ruby192":
command => "/root/build-ruby.sh",
cwd => "/root",
timeout => 0,
creates => "/usr/bin/ruby",
require => File["/root/build-ruby.sh"]
}
# update rubygems
exec { "update-rubygems":
command => "/usr/bin/gem update --system",
unless => "/usr/bin/gem -v |/bin/grep ^1.8",
require => Exec["build-ruby192"]
}
}
As you can see, it updates the apt cache, installs some pre-requisites and then runs a script to build ruby 1.9.2 from source. The "timeout => 0" line is important. Without it, puppet will not allow long enough for the build script to run completely. Here's the build script;
#!/bin/bash
RUBY_VERSION='ruby-1.9.2-p290'
wget "http://ftp.ruby-lang.org/pub/ruby/1.9/${RUBY_VERSION}.tar.gz"
tar xzf ${RUBY_VERSION}.tar.gz
cd ${RUBY_VERSION}
./configure --prefix=/usr && make && make install
That will install ruby 1.9.2 and rubygems, so all that remains for the ruby.pp module is to update rubygems to the latest version.
