Faronitates
Faronitates

Reputation: 78

overriding Parameters in puppet modules

I want to override parameters of base nodes. What I want to get is a pattern like this:

# File manifests/nodes.pp
node myDefault {
    class { 'my::common::puppet_setup': 
        service => 'enable',
        pushable => 'disable',
    }
    # Do lots of default things ...
}
node 'myFirstNode' inherits myDefault {
    # Do something ...
}
node 'mySecondNode' inherits myDefault {
    class { 'my::common::puppet_setup::params':
        service => 'disable',
        pushable => 'enable',
    }
}

I understood the the puppet documentation, i could do this by writing my module like this:

# File modules/my/manifests/common/puppet_setup.pp
class my::common::puppet_setup (
    $pushable = $my::common::puppet_setup::params::pushable,
    $service  = $my::common::puppet_setup::params::service,
) inherits my::common::puppet_setup::params {
    # package that configures puppet node

    # input value validation
    validate_re($pushable, ['^enable$', '^disable$', '^ignore$', ])
    validate_re($service, ['^enable$', '^disable$', '^ignore$', '^cron$', ])

    # setup puppet, start or disable agent, put ssh keys for push ...

}

class my::common::puppet_setup::params {
    $pushable = 'enable'
    $service  = 'enable'
    $puppetserver = 'puppet.my.site.de'
    case $::osfamily {
        'Debian': {
        }
        default: {
            fail("not implemented yet for {::operatingsystem}")
        }
    }
}

The Documentations on puppet website says: When a derived class is declared, its base class is automatically declared first (if it wasn’t already declared elsewhere).

But i get this error (some indentation added):

mySecondNode# puppet agent --test --environment dev_my
Error: Could not retrieve catalog from remote server: 
  Error 400 on SERVER: Duplicate declaration:
    Class[My::Common::Puppet_setup::Params] is already declared;
    cannot redeclare at /.../puppet/manifests/nodes.pp:16 on node mySecondNode
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run

I'm reading on this for a week and i guess my understanding ist totally wrong somewhere, although i used the puppetlabs ntp modules as an example.

what am i missing?

Upvotes: 1

Views: 8183

Answers (2)

Mateusz M.
Mateusz M.

Reputation: 392

You should check Inheritance section from http://docs.puppetlabs.com/puppet/latest/reference/lang_node_definitions.html

Puppet treats node definitions like classes. It does not mash the two together and then compile the mix; instead, it compiles the base class, then compiles the derived class, which gets a parent scope and special permission to modify resource attributes from the base class.

One of the good solutions is to use roles and profiles, there's a great blog post about it: http://garylarizza.com/blog/2014/02/17/puppet-workflow-part-2/

Upvotes: 2

iamauser
iamauser

Reputation: 11479

You can use virtual resources :

http://docs.puppetlabs.com/guides/virtual_resources.html

Upvotes: 0

Related Questions