How to iterate over an array in Puppet

2019-01-17 00:37发布

问题:

I would like to iterate over an array that is stored as a Facter fact, and for each element of the array create a new system user and a directory, and finally make API calls to AWS.

Example of the fact : my_env => [shared1,shared2,shared3]

My Question is how to iterate over an array in puppet ?

I've tried the Ruby DSL but haven't succeded yet to get it work... Thanks !

回答1:

This might work, depending on what you are doing

// Assuming fact my_env => [ shared1, shared2, shared3 ]

define myResource {
  file { "/var/tmp/$name":
    ensure => directory,
    mode   => 0600,
  }
  user { $name:
    ensure => present,
  }
}
myResource { $my_env: }

It will work if your requirements are simple, if not, Puppet makes this very hard to do. The Puppet developers have irrational prejudices against iteration based on a misunderstanding about how declarative languages work.

If this kind of resource doesn't work for you, perhaps you could give a better idea of which resource properties you are trying to set from your array?

EDIT:

With Puppet 4, this lamentable flaw was finally fixed. Current state of affairs documented here. As the documentation says, you'll find example of the above solution in a lot of old code.



回答2:

As of puppet 3.2 this is possible using the "future" parser like so:

$my_env = [ 'shared1', 'shared2', 'shared3', ]
each($my_env) |$value| {
  file { "/var/tmp/$value":
    ensure => directory,
    mode => 0600,
  }
  user { $value:
    ensure -> present,
  }
}

See also: http://docs.puppetlabs.com/puppet/3/reference/lang_experimental_3_2.html#background-the-puppet-future-parser



回答3:

Puppet 3.7 released earlier this month have the new DSL, which one feature is the iteration, check the following URL https://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas-and-iteration

these new features can be enabled with the :

Setting parser = future in your puppet.conf file or adding the command line switch --parser=future

hope that helps



回答4:

itsbruce's answer is probably the best for now, but there is an iteration proposal going through puppetlabs' armatures process for possible implementation in future.



回答5:

There is a "create_resources()" function in puppet. that will be very helpful while iterating over the list of itmes