Puppet Class: ruby

Inherits:
ruby::params
Defined in:
manifests/init.pp

Overview

Class: ruby

This class installs Ruby and manages rubygems

Parameters:

version: (default installed)
  Set the version of Ruby to install

gems_version: (default installed)
  Set the version of Rubygems to be installed

rubygems_update: (default false)
  If set to true, the module will ensure that the rubygems package is
  installed but will use rubygems-update (same as gem update --system
  but versionable) to update Rubygems to the version defined in
  $gems_version. If set to false then the rubygems package resource
  will be versioned from $gems_version

ruby_package: (default ruby)
  Set the package name for ruby

rubygems_package: (default rubygems)
  Set the package name for rubygems

Actions:

- Install Ruby
- Install Rubygems
- Optionally Update Rubygems

Requires:

Sample Usage:

For a standard install using the latest Rubygems provided by
rubygems *without update* on Redhat use:

  class { 'ruby':
    gems_version  => 'latest',
  }

On Redhat this is equivalent to
  $ yum install ruby rubygems

To install a specific version of ruby and then call
gem update, use:

  class { 'ruby':
    version         => '1.8.7',
    rubygems_update => true,
  }

On RedHat this is equivalent to
  $ yum install ruby-1.8.7 rubygems
  $ gem update --system

To install a specific version of ruby and rubygems
use:

  class { 'ruby':
    version         => '1.8.7',
    gems_version    => '1.8.24',
    rubygems_update => true,
  }

On Redhat this is equivalent to
  $ yum install ruby-1.8.7 rubygems-1.8.24
  $ gem update --system

If you need to use different packages for either ruby or rubygems you
can. This could be for different versions or custom packages. For instance
the following installs ruby 1.9 on Ubuntu 12.04.

  class { 'ruby':
    ruby_package     => 'ruby1.9.1-full',
    rubygems_package => 'rubygems1.9.1',
    gems_version     => 'latest',
  }

Ruby package names are not straightforward. Especially in Debian osfamily Linux distributions ruby is a virtual package that points to ruby1.8 ruby1.8 installs Ruby 1.8.7 (and earlier versions), requires a PPA for 14.04 or later ruby1.9.1 installs Ruby 1.9.x ruby1.9.1-full installs Ruby 1.9.x ruby1.9.3 installs Ruby 1.9.x Ruby 2.0.0 is availible from a PPA or Ubuntu 13.10 or later. Ruby 2.1.0 is availible from a PPA. …and this should all be overridden if a package is specified

Parameters:

  • version (Any) (defaults to: $ruby::params::version)
  • latest_release (Any) (defaults to: undef)
  • gems_version (Any) (defaults to: $ruby::params::gems_version)
  • rubygems_update (Any) (defaults to: $ruby::params::rubygems_update)
  • ruby_package (Any) (defaults to: $ruby::params::ruby_package)
  • ruby_dev_packages (Any) (defaults to: $ruby::params::ruby_dev)
  • rubygems_package (Any) (defaults to: $ruby::params::rubygems_package)
  • suppress_warnings (Any) (defaults to: false)
  • set_system_default (Any) (defaults to: false)
  • system_default_bin (Any) (defaults to: undef)
  • system_default_gem (Any) (defaults to: undef)
  • gem_integration (Any) (defaults to: false)
  • gem_integration_package (Any) (defaults to: $ruby::params::gem_integration_package)
  • switch (Any) (defaults to: undef)


91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'manifests/init.pp', line 91

class ruby (
  $version                  = $ruby::params::version,
  $latest_release           = undef,
  $gems_version             = $ruby::params::gems_version,
  $rubygems_update          = $ruby::params::rubygems_update,
  $ruby_package             = $ruby::params::ruby_package,
  $ruby_dev_packages        = $ruby::params::ruby_dev,
  $rubygems_package         = $ruby::params::rubygems_package,
  $suppress_warnings        = false,
  $set_system_default       = false,
  $system_default_bin       = undef,
  $system_default_gem       = undef,
  $gem_integration          = false,
  $gem_integration_package  = $ruby::params::gem_integration_package,
  $switch                   = undef
) inherits ruby::params {

  if $latest_release {
    $ruby_package_ensure = 'latest'
  } else {
    $ruby_package_ensure = 'installed'
  }

  case $::osfamily {
    'Debian': {
      case $ruby_package {
        installed: {
          $real_ruby_package = $ruby_package
        }
        default:{
          case $version {
            /^1\.8.*$/:{
              $real_ruby_package  = "${ruby::params::ruby_package}1.8"
              if ! $suppress_warnings and versioncmp($::operatingsystemrelease, '14.04') >= 0 {
                warning('Packages for Ruby 1.8 are not available from default repositories.')
              }
            }
            /^1\.9.*$/:{
              $real_ruby_package  = "${ruby::params::ruby_package}1.9.1"
            }
            /^2\.0.*$/:{
              $real_ruby_package  = "${ruby::params::ruby_package}2.0"
              if ! $suppress_warnings and versioncmp($::operatingsystemrelease, '13.10') < 0 {
                warning('Packages for Ruby 2.0 are not available from default repositories.')
              }
            }
            /^2\.1.*$/:{
              $real_ruby_package  = "${ruby::params::ruby_package}2.1"
              if ! $suppress_warnings {
                warning('Packages for Ruby 2.1 are not available from default repositories.')
              }
            }
            default: {
              $real_ruby_package  = $ruby_package
            }
          }
        }
      }
    }
    default: {
      $real_ruby_package  = $ruby_package
    }
  }

  # The "version" switch seems to do nothing on a non-Debian distro. This is
  # probably the safest behavior for the moment, since RedHat doesn't change
  # the ruby package name the way Debian does when new versions become
  # available. It's a bit misleading for the user, though, since they can
  # specify a version and it will just silently continue installing the
  # default version.
  package { 'ruby':
    ensure => $ruby_package_ensure,
    name   => $real_ruby_package,
  }

  # if rubygems_update is set to true then we only need to make the package
  # resource for rubygems ensure to installed, we'll let rubygems-update
  # take care of the versioning.

  if $rubygems_update == true {
    $rubygems_ensure = 'installed'
  } else {
    $rubygems_ensure = $gems_version
  }

  package { 'rubygems':
    ensure  => $rubygems_ensure,
    name    => $rubygems_package,
    require => Package['ruby'],
  }

  if $rubygems_update {
    package { 'rubygems-update':
      ensure   => $gems_version,
      provider => 'gem',
      require  => Package['rubygems'],
      notify   => Exec['ruby::update_rubygems'],
    }

    exec { 'ruby::update_rubygems':
      path        => '/usr/local/bin:/usr/bin:/bin',
      command     => 'update_rubygems',
      refreshonly => true,
    }
  }

  if $set_system_default or $switch {
    case $::osfamily {
      'Debian': {
        if $system_default_bin {
          $real_default_bin = $system_default_bin
        } else {
          case $version {
            /^1\.8.*$/:{
              $real_default_bin  = "${ruby::params::ruby_bin_base}1.8"
              if ! $suppress_warnings and versioncmp($::operatingsystemrelease, '14.04') >= 0 {
                warning('No binary for Ruby 1.8.x available from default repositories')
              }
            }
            /^1\.9.*$/:{
              $real_default_bin  = "${ruby::params::ruby_bin_base}1.9.1"
            }
            /^2\.0.*$/:{
              $real_default_bin  = "${ruby::params::ruby_bin_base}2.0"
              if ! $suppress_warnings and versioncmp($::operatingsystemrelease, '13.10') < 0 {
                warning('No binary for Ruby 2.0.x available from default repositories')
              }
            }
            /^2\.1.*$/:{
              $real_default_bin  = "${ruby::params::ruby_bin_base}2.1"
              if ! $suppress_warnings {
                warning('No binary for Ruby 2.1.x available from default repositories')
              }
            }
            default: {
              fail('Unable to resolve default ruby binary')
            }
          }
        }
        if $system_default_gem {
          $real_default_gem = $system_default_gem
        } else {
          case $version {
            /^1\.8.*$/:{
              $real_default_gem  = "${ruby::params::ruby_gem_base}1.8"
              if ! $suppress_warnings and versioncmp($::operatingsystemrelease, '14.04') >= 0 {
                warning('No binary package for Ruby 1.8.x available from default repositories')
              }
            }
            /^1\.9.*$/:{
              $real_default_gem  = "${ruby::params::ruby_gem_base}1.9.1"
            }
            /^2\.0.*$/:{
              $real_default_gem  = "${ruby::params::ruby_gem_base}2.0"
              if ! $suppress_warnings and versioncmp($::operatingsystemrelease, '13.10') < 0 {
                warning('No binary package for Ruby 2.0.x available from default repositories')
              }
            }
            /^2\.1.*$/:{
              $real_default_gem  = "${ruby::params::ruby_gem_base}2.1"
              if ! $suppress_warnings {
                warning('No binary package for Ruby 2.1.x available from default repositories')
              }
            }
            default: {
              fail('Unable to resolve default gem binary')
            }
          }
        }
        # update-alternatives does not support ruby in 14.04!
        file{'ruby_bin':
          ensure  => link,
          path    => $::ruby::params::ruby_bin_base,
          target  => $real_default_bin,
          require => Package['ruby'],
        }
        # This should notify Exec['ruby::update_rubygems'] but if rubygems_update is false
        # it doesn't exist.
        file{'gem_bin':
          ensure  => link,
          path    => $::ruby::params::ruby_gem_base,
          target  => $real_default_gem,
          require => Package['rubygems'],
        }
      }
      default: {
        if $switch {
          warning('The switch parameter is depreciated, use set_system_default')
          notice("The switch parameter for the ruby class does not work for ${::operatingsystem}, no action taken.")
        }
        if $set_system_default {
          notice("The set_system_default parameter for the ruby class does not work for ${::operatingsystem}, no action taken.")
        }
      }
    }
  }

  if $gem_integration {
    case $::osfamily {
      Debian: {
        if ! $suppress_warnings and $::operatingsystem == 'Ubuntu' and versioncmp($::operatingsystemrelease, '13.04') < 0 {
          warning('No package for rubygems_integration available from default repositories')
        }
        package{'rubygems_integration':
          ensure  => $ruby_package_ensure,
          name    => $gem_integration_package,
          require => Package['rubygems'],
        }
      }
      default: {
        notice("The gem_integration parameter for the ruby class does not work for ${::operatingsystem}, no action taken.")
      }
    }
  }
}