Class: BeakerPuppetHelpers::InstallUtils

Inherits:
Object
  • Object
show all
Defined in:
lib/beaker_puppet_helpers/install_utils.rb

Overview

Methods to install Puppet

Constant Summary collapse

REPOS =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

{
  release: {
    apt: 'https://apt.puppet.com',
    yum: 'https://yum.puppet.com',
  },
  nightly: {
    apt: 'https://nightlies.puppet.com/apt',
    yum: 'https://nightlies.puppet.com/yum',
  },
}.freeze

Class Method Summary collapse

Class Method Details

.install_puppet_release_repo_on(host, collection = 'puppet', nightly: false) ⇒ Object

Note:

This method only works on redhat-like and debian-like hosts. There are no official Puppet releases for other platforms.

Install official Puppet release repository configuration on host(s).

Examples:

Install Puppet 7

install_puppet_release_repo_on(hosts, 'puppet7')

Parameters:

  • host (Beaker::Host)

    A host to act upon.

  • collection (String) (defaults to: 'puppet')

    The collection to install. The default (puppet) is the latest available version.

  • nightly (Boolean) (defaults to: false)

    Whether to install nightly or release packages



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/beaker_puppet_helpers/install_utils.rb', line 36

def self.install_puppet_release_repo_on(host, collection = 'puppet', nightly: false)
  repos = REPOS[nightly ? :nightly : :release]

  variant, version, _arch = host['packaging_platform'].split('-', 3)

  case variant
  when 'el', 'fedora', 'sles', 'cisco-wrlinux'
    # sles 11 and later do not handle gpg keys well. We can't
    # automatically import the keys because of sad things, so we
    # have to manually import it once we install the release
    # package. We'll have to remember to update this block when
    # we update the signing keys
    if variant == 'sles' && version >= '11'
      %w[puppet puppet-20250406].each do |gpg_key|
        wget_on(host, "https://yum.puppet.com/RPM-GPG-KEY-#{gpg_key}") do |filename|
          host.exec(Beaker::Command.new("rpm --import '#{filename}'"))
        end
      end
    end

    url = "#{repos[:yum]}/#{collection}-release-#{variant}-#{version}.noarch.rpm"
    host.install_package(url)
  when 'debian', 'ubuntu'
    url = "#{repos[:apt]}/#{collection}-release-#{host['platform'].codename}.deb"
    wget_on(host, url) do |filename|
      host.install_package(filename)
    end
    host.exec(Beaker::Command.new('apt-get update'))

    # On Debian we can't count on /etc/profile.d
    host.add_env_var('PATH', '/opt/puppetlabs/bin')
  else
    raise "No repository installation step for #{variant} yet..."
  end
end

.puppet_package_name(host, prefer_aio: true) ⇒ String

Determine the Puppet package name

Parameters:

  • host (Beaker::Host)

    The host to act on

  • prefer_aio (Boolean) (defaults to: true)

    Whether to prefer AIO packages or OS packages

Returns:

  • (String)

    The Puppet package name



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/beaker_puppet_helpers/install_utils.rb', line 79

def self.puppet_package_name(host, prefer_aio: true)
  case host['packaging_platform'].split('-', 3).first
  when 'debian'
    # 12 started to ship puppet-agent with puppet as a legacy package
    prefer_aio || host['packaging_platform'].split('-', 3)[1].to_i >= 12 ? 'puppet-agent' : 'puppet'
  when /el|fedora|sles|cisco_/
    prefer_aio ? 'puppet-agent' : 'puppet'
  when /freebsd/
    'sysutils/puppet8'
  when 'ubuntu'
    # 23.04 started to ship puppet-agent with puppet as a legacy package
    prefer_aio || host['packaging_platform'].split('-', 3)[1].to_i >= 2304 ? 'puppet-agent' : 'puppet'
  else
    'puppet'
  end
end

.wget_on(host, url) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parameters:

  • host (Beaker::Host)

    The host to act on



99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/beaker_puppet_helpers/install_utils.rb', line 99

def self.wget_on(host, url)
  extension = File.extname(url)
  name = File.basename(url, extension)
  # Can't use host.tmpfile since we need to set an extension
  target = host.exec(Beaker::Command.new("mktemp -t '#{name}-XXXXXX#{extension}'")).stdout.strip
  begin
    host.exec(Beaker::Command.new("wget -O '#{target}' '#{url}'"))
    yield target
  ensure
    host.rm_rf(target)
  end
end