Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

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

Hi I'd like some help on how to code this in erb in puppet, basically I have

server::actionhost { 'details':
    servername[ 'felix', 'washington', ],
    ipa [ '', '', ],
    enviro [ 'prod', 'uat', ],

I now want to print this out to a file with each respective element from each array in one line, i.e the output from the template file in my class should be like:

felix prod
washington uat

When I attempted this I wrote the following code in my template file:

<% servername.each do |name| -%>
    <% ipa.each do |ip| -%>
        <% enviro.each do |env| -%>
            <%= name %> <%= ip %> <%= env %>
        <% end -%>
    <% end -%>
<% end -%>

but what I get is multiple recursive prints instead of a print from each array and then move to the next array element.

I'm thinking of a for loop but unsure how to get the array length as the argument to the for loop, Would appreciate some guidance on how to accomplish the correct output?

I tried doing something like this but it fails with errors on the puppet run?

<% for id in servername.length %>
    <%= servername[id] %> <%= ipa[id] %> <%= enviro[id] %>
<% end -%>

Thanks Dan

share|improve this question
up vote 4 down vote accepted

Any particular reason you need to use that data structure? That will get unreadable very quickly, and would be very easy to break things by accidentally adding or removing an element from one of the arrays and not the others. How about something like this instead?

$servers = [
    name => 'felix',
    ip   => '',
    env  => 'prod',
    name => 'washington',
    ip   => '',
    env  => 'uat',

Then it's much simpler to work with in the erb:

<% servers.each do |server| -%>
  <%= server['name'] %> <%= server['ip'] %> <%= server['env'] %>
<% end -%>

But, if you're stuck with your current data structure, then this should do it..

<% (1..servername.length).each do |i| -%>
share|improve this answer
That's brilliant. Thank you so much. I'm going to change my structure to your suggestion. Dan – Dan Feb 12 '13 at 18:46
btw how do I define the $servers in my nodes.pp? Thanks – Dan Feb 14 '13 at 12:08
@Dan Are you using that variable in just one particular node (maybe a provisioning node of some kind?) or in many or all nodes? – Shane Madden Feb 14 '13 at 18:21
While I am using the loop, I am getting error undefined method `each' for :undef:Symbol. – chandank Mar 22 '13 at 21:01
@chandank That probably means that the variable you're looping over isn't in the current scope. Can you provide more specific detail about your manifests and template? A new question would probably be the best place for that. – Shane Madden Mar 22 '13 at 23:32

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.