Sorry, this is my fault. I hadn't done "git push" to deploy my new code before testing :( Your example works perfectly!

Thanks,
Jonathan

On 06/02/17 14:47, Jonathan Gazeley wrote:
Thanks for your reply. I'm still having problems with this :( This is my
worked example:

# Provide example config
uob_nagios::bpiconfig { 'radius':
  displayname        => 'RADIUS eduroam local',
  primary            => 1,
  members            => {
    'radius01.example.com' => {
      service => 'RADIUS',
      opt     => '&',
    },
    'radius02.example.com' => {
      service => 'RADIUS',
      opt     => '&',
    },
    'radius03.example.com' => {
      service => 'RADIUS',
      opt     => '&',
    },
  },
  warning_threshold  => 0,
  critical_threshold => 0,
  priority           => 1,
}

# Defined type
define uob_nagios::bpiconfig (
  $displayname,
  $members,
  $desc = undef,
  $primary = 1,
  $info = undef,
  $warning_threshold = 0,
  $critical_threshold = 0,
  $priority = 1,
) {
  concat::fragment{ "bpi-${title}":
    target  => '/usr/share/nagios/nagiosbpi/nagiosbpi/bpi.test.conf',
    content => template('uob_nagios/bpi.conf.erb'),
    order   => '20',
  }
}

# bpi.conf.erb
define <%= @title %> {
        title=<%= @displayname %>
        desc=<%= @desc %>
        primary=<%= @primary %>
        info=<%= @info %>
        members=<% @members.each_pair do |key, value| -%><%= key -%>;<%=
value['service'] -%>;<%= value['opt'] -%>,<% end -%>
        warning_threshold=<%= @warning_threshold %>
        critical_threshold=<%= @critical_threshold %>
        priority=<%= @priority %>
        }

Running this gives the error:

Error: Could not retrieve catalog from remote server: Error 500 on
SERVER: Server Error: Evaluation Error: Error while evaluating a
Resource Statement, Evaluation Error: Error while evaluating a Function
Call, Failed to parse template uob_nagios/bpi.conf.erb:
  Filepath:
/etc/puppetlabs/code/environments/367_bpi_config/local_modules/uob_nagios/templates/bpi.conf.erb

  Line: 6
  Detail: undefined local variable or method `members' for
#<Puppet::Parser::TemplateWrapper:0x6275a5c3>
 at
/etc/puppetlabs/code/environments/367_bpi_config/local_modules/uob_nagios/manifests/bpiconfig.pp:34:16
at
/etc/puppetlabs/code/environments/367_bpi_config/local_modules/uob_nagios/manifests/bpi.pp:26
on node monitor.resnet.bris.ac.uk
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run

I can't see anything wrong with the 'members' variable. Am I missing
something?

Thanks,
Jonathan


On 05/02/17 11:13, Robert wrote:
Hi Jonathan,

this erb template:

members=<% @members.each_pair do |key, value| -%>
<%= key -%>;<%= value['service'] -%>;<%= value['opt'] -%>,<% end -%>

gives you exactly the parameter you mentioned.

So if you define the variable $members in the pp file and a file
resource with content => template('modulename/templatename.erb')

Inside the template you simply iterate through the key, value pairs. You
can access hash members with their key; square brackets are used for
accessing.
 https://docs.puppet.com/puppet/latest/lang_data_hash.html#accessing-values


Sorry for the late answer, you probably figured it out already
yourself :)

Best
Rp



On Thu, Feb 2, 2017 at 12:00 PM, Jonathan Gazeley
<jonathan.gaze...@bristol.ac.uk <mailto:jonathan.gaze...@bristol.ac.uk>>
wrote:

    Hi folks,

    I'm grappling with a data structure that I want to model as a hash
    in Puppet and ultimately mash it down to a string for use in a
    config file.

    I'm writing out a config for Nagios BPI and there is one complex
    parameter "members" which is described like this in the
documentation:

    # members - a comma delineated list of members.
    #    For services, format is: <hostname>;<servicename>;<opt>,
    #    For groups, format is:  $<groupID>;<opt>,
    #        the <opt> is an '&' or '|' character.
    #        '&' option after host:servicename means service is part of
    a CLUSTER
    #    For clusters, 'critical' is only reached when ALL services in a
    cluster are NOT 'Ok'
    #       '|' option after host:servicename means it is an essential
    service for the group,
    #       example: a 'critical' service with an '|' option will cause
    a 'critical' state
    #       for the entire group.

    When configured, the parameter looks like this:

    members=radius-local01.example.com
    <http://radius-local01.example.com>;RADIUS;&,
    radius-local02.example.com
    <http://radius-local02.example.com>;RADIUS;&,
    radius-local03.example.com
<http://radius-local03.example.com>;RADIUS;&,

    I want to model this in a hash like this:

    $members = {
      'radius-local01.example.com <http://radius-local01.example.com>'
=> {
        service => 'RADIUS',
        opt => '&',
      },
      'radius-local02.example.com <http://radius-local02.example.com>'
=> {
        service => 'RADIUS',
        opt => '&',
      },
      'radius-local03.example.com <http://radius-local03.example.com>'
=> {
        service => 'RADIUS',
        opt => '&',
      },
    }

    Is my design sensible, and how can I manipulate this data to
    generate a string in the config file as above? I'm using Puppet
    Enterprise 2016.5 but I only upgraded from Puppet 3.8 a couple of
    weeks ago, so I'm still new to the Puppet 4 syntax.

    Thanks,
    Jonathan

    --
    Jonathan Gazeley
    Senior Systems Administrator
    IT Services
    University of Bristol

    --
    You received this message because you are subscribed to the Google
    Groups "Puppet Users" group.
    To unsubscribe from this group and stop receiving emails from it,
    send an email to puppet-users+unsubscr...@googlegroups.com
    <mailto:puppet-users%2bunsubscr...@googlegroups.com>.
    To view this discussion on the web visit

https://groups.google.com/d/msgid/puppet-users/7794f367-7028-0bb5-422c-2d46bc133545%40bristol.ac.uk


<https://groups.google.com/d/msgid/puppet-users/7794f367-7028-0bb5-422c-2d46bc133545%40bristol.ac.uk>.

    For more options, visit https://groups.google.com/d/optout
    <https://groups.google.com/d/optout>.


--
You received this message because you are subscribed to the Google
Groups "Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to puppet-users+unsubscr...@googlegroups.com
<mailto:puppet-users+unsubscr...@googlegroups.com>.
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/CANwwCtz3_mWoMzk%3DQmN2jmCn2G8ce8hYp%2BMcvmW%2BNF2F4Ax6dg%40mail.gmail.com

<https://groups.google.com/d/msgid/puppet-users/CANwwCtz3_mWoMzk%3DQmN2jmCn2G8ce8hYp%2BMcvmW%2BNF2F4Ax6dg%40mail.gmail.com?utm_medium=email&utm_source=footer>.

For more options, visit https://groups.google.com/d/optout.




--
Jonathan Gazeley
Senior Systems Administrator
IT Services
University of Bristol

--
You received this message because you are subscribed to the Google Groups "Puppet 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/4cb2e34e-5e49-d2a9-4471-f65685b6445c%40bristol.ac.uk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to