Search code examples
linuxinheritancepuppetsudo

Overriding a Puppet Class when using Inheritance


I'm trying to use class inheritance for puppet. There is a base class named foo and an inherited class named bar. Overriding file or package resources are quite fine and works properly. But at the same time i'm using a custom module for configuring sudo.

The problem arises when i try to override sudo class from inside class bar. Puppet classes are as follows:

 class foo {
  $nrpe_plugin_pkgs = [ .... ]

  service { 'nrpe service':
    ..
  }

  package { $nrpe_plugin_pkgs:
    ..
  }

  file { '/etc/nagios/nrpe.cfg':
    ..
  }

  file { '/etc/resolv.conf':
    ..
  }

  class { 'sudo':
    purge               => true,
    config_file_replace => true,
  }

  sudo::conf { 'sudo_conf':
    priority => 10,
    content  => [
      '%gr1 ALL=(userfoo) NOPASSWD: ALL',
      '%gr1 ALL=(root)  NOPASSWD: /usr/bin/wbinfo *',
    ]
  }
}


class bar inherits foo {
  File['/etc/resolv.conf'] {
    ..
  }

  sudo::conf { 'sudo_conf':
    priority => 10,
    content  => [
      '%gr2     ALL=NOPASSWD:/bin/chown userbar\:gr2 /dirbar/*',
      '%gr2     ALL=NOPASSWD:/bin/chown -R userbar\:gr2 /dirbar/*',
      '%gr2     ALL=NOPASSWD:/bin/chmod * /dirbar/*',
    ]
  }
}

I just want to customize only resolv.conf and sudo config, but i'm getting error as follows:

Error while evaluating a Resource Statement, Evaluation Error: Error while evaluating a Resource Statement, Duplicate declaration: Sudo::Conf[sudo_conf] is already declared in file /etc/puppetlabs/code/environments/foobar_servers/manifests/foobar.pp:80; cannot redeclare at /etc/puppetlabs/code/environments/foobar_servers/manifests/foobar.pp:335 at /etc/puppetlabs/code/environments/foobar_servers/manifests/foobar.pp:335:3 on node foobartest01

/etc/sudoers.d/10_sudo_conf file expected to be created. How can i achieve that?

Using: Puppet 4.9 Community version.

Any help appreciated.


Solution

  • The resolv.conf override works here, because you're using the correct syntax:

    class bar inherits foo {
      File['/etc/resolv.conf'] {
        ..
      }
    

    But the syntax for the next line where you try to override is different, so it fails:

    sudo::conf { 'sudo_conf':
    

    This is the syntax to declare a new resource (hence why you get a duplicate error) rather than to override an existing resource. It should be:

    Sudo::Conf['sudo_conf'] {
      priority => 10,
      content  => [
        '%gr2     ALL=NOPASSWD:/bin/chown userbar\:gr2 /dirbar/*',
        '%gr2     ALL=NOPASSWD:/bin/chown -R userbar\:gr2 /dirbar/*',
        '%gr2     ALL=NOPASSWD:/bin/chmod * /dirbar/*',
      ]
    }