Puppet duplicate resources and virtual resources

puppet

Overview

I just started using Puppet and have been unable to suss something.

Problem

Because of normalization, when I add two classes to a node with packages that have the same dependencies it fails.

In simple terms have duplicate resources – in this case the package libssl.

Note: packages are being held to prevent latest packages being installed.

Question

What's the best practice way to get round this?

class ssh {
  package { 'openssh-server':
    ensure  => installed,
    require => Package['libssl'],
  }
  package { 'libssl': ensure => installed, }
}

class apache {
  package { 'apache':
    ensure   => installed,
    require  => Package['libssl'], 
  }        
  package { 'libssl': ensure => installed, }
}

node server {
  include apache
  include openssl-server

Best Answer

You have two choices that are going to look almost the same.

1: make it it's own class.

class ssh {
  package { 'openssh-server':
    ensure => present,
    require => Class['ssl'],
  }
}
class ssl {
  package { 'libssl': ensure => present, }
}

2: virtual resource

class vpackages {
  @package { 'libssl': }
}
class ssh {
  include vpackages
  package { 'openssh-server':
    ensure => present,
    require => Package['libssl'],
  }
  realize Package['libssl']
}

I find it better to break dependencies out into their own modules rather than use virtual resources.