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.