Tobias Brunner bio photo

Tobias Brunner

...(a.k.a. tobru) is a Network and Linux Engineer (LPIC-2), working at VSHN AG and blogs about DevOps, Networking, Linux and OpenSource topics on his techblog tobrunet.ch.

Email Twitter XING Github Flattr this

Contents

Puppet as of version 2.7 has not been designed to iterate over datastructures, but there are some tricks we can use.

Here are two links to the Puppet documentation which explains Arrays and Hashes:

Iterate over Arrays

The easiest way to iterate over arrays is to use the array directly on the Class or Defined Type:

define arrayDebug {
  notify { "Item ${name}": }
}
 
class array {
  $array = [ 'item1', 'item2', 'item3' ]
  arrayDebug { $array: }
}

This calls arrayDebug 3 times with the array values as parameter.

Output of the example:

Item item1
Item item2
Item item3

Iterate over Arrays with split

If you need more values per iteration than just one, we could use the split function to create a pseudo Hash:

define arrayDebug {
  $value = split($name,',')
  notify { "Item ${value[0]} has value ${value[1]}": }
}
 
class array {
  $array = [ 'item1,value1', 'item2,value2', 'item3,value3' ]
  arrayDebug { $array: }
}

Output of the example:

Item item1 has value value1
Item item2 has value value2
Item item3 has value value3

Iterate over Hashes

The above method with the pseudo Hash functionality does it’s job, but not very nice. It would be much nicer to directly iterate over a Hash. To achieve this, there is this nice function called create_resources:

define hashDebug($value, $othervalue, $somevalue) {
  notify { "Item ${name} has value ${value}, othervalue ${othervalue} and somevalue ${somevalue}": }
}
 
class array {
  $hash = {
    item1 => { value      => '1',
               othervalue => 'a',
               somevalue  => 'jjj' },
    item2 => { value      => '2',
               othervalue => 'b' },
  }
 
  $hashDefaults = {
    $somevalue => 'zzz'
  }
 
  create_resources(hashDebug, $hash, $hashDefaults)
}

This example calls hashDebug two times, passing the Hash item as arguments. The variable $hashDefaults defines default values for missing parameters in the Hash.

Output of the example:

Item item1 has value 1, othervalue a and somevalue jjj
Item item1 has value 2, othervalue b and somevalue zzz