Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have some use cases where I want to define multiple similar resources that should end up in a single file (via a template).

As an example I'm trying to write a puppet module that will let me manage the mapping between MAC addresses and network interface names (writing udev's persistent-net-rules file from puppet), but there are also many other similar usage cases.

I searched around and found that it could be done with the new parameterised classes syntax: if implemented that way it should end up being used like this:

node { "":
  class { "network::iftab":
    interfaces => {
      "eth0" => { "mac" => "ab:cd:ef:98:76:54" }
      "eth1" => { "mac" => "98:76:de:ad:be:ef" }

Not too bad, I agree, but it would rapidly explode when you manage more complex stuff (think network configurations like in this module or any other multiple-complex-resources-in-a-single-config-file stuff).

In a similar question on SF someone suggested using Pienaar's puppet-concat module but I doubt it could get any better than parameterised classes.

What would be really cool and clean in the configuration definition would be something like the included host type, it's usage is simple, pretty and clean and naturally maps to multiple resources that will end up being configured in a single place. Transposed to my example it would be like:

node { "":
  interface { 
      "mac" => "ab:cd:ef:98:76:54",
      "foo" => "bar",
      "asd" => "lol",
      "mac" => "98:76:de:ad:be:ef",
      "foo" => "rab",
      "asd" => "olo",

...that looks much better to my eyes, even with 3x options to each resource.

Should I really be passing arrays to parameterised classes, or there is a better way to do this kind of stuff? Is there some accepted consensus in the puppet [users|developers] community?

By the way, I'm referring to the latest stable release of the 2.7 branch and I am not interested in compatibility with older versions.

share|improve this question
up vote 1 down vote accepted

I think what you are looking for is Types. Types will give you the syntax you want, and you can use the same type multiple times on the same host to configure multiple interfaces, which you can't do with classes.

You can create new types with Defined Types, which are written in Puppet DSL. More info on defined types is here. The other way to create types is with Custom Types, which are written in Ruby.

For examples of Defines Types, check out puppetlabs-apt, ripienaar-concat, and razorsedge-network. Good examples of Customs Types are puppetlabs-firewall and puppetlabs-vcsrepo.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.