FWIW, this is my working solution and I think it is much better:
/etc/puppet/modules/profiles/manifests/logstash/config.pp:
class profiles::logstash::config {
$brokers = $profiles::logstash::brokers
$cluster = $profiles::logstash::cluster
if (!empty($brokers)) and (empty($cluster)) {
notice("This is a shipper.")
logstash::configfile { 'output_broker':
content => template('profiles/logstash/output_broker.erb'),
order => 100
}
} elsif (!empty($cluster)) and (!empty($brokers)) {
notice("This is a central indexer.")
logstash::configfile { 'input_broker':
content => template('profiles/logstash/input_broker.erb'),
order => 10
}
logstash::configfile { 'output_es':
content => template('profiles/logstash/output_es.erb'),
order => 100
}
}
}
/etc/puppet/modules/profiles/manifests/logstash/install.pp
class profiles::logstash::install() {
$ensure = $profiles::logstash::enable ? {true => present, default =>
absent}
$status = $profiles::logstash::start ? {true => enabled, default =>
disabled}
class { '::logstash':
ensure => $ensure,
status => $status,
version => $profiles::logstash::version
}
}
/etc/puppet/modules/profiles/manifests/logstash.pp:
# == Class: profiles::logstash
#
# A basic module to manage logstash
#
# === Parameters
# [*version*]
# The package version to install
#
# [*brokers*]
# An array of brokers to use on this node
#
# [*enable*]
# Should the service be enabled during boot time?
#
# [*start*]
# Should the service be started by Puppet?
#
# Note: Values here are defaults and can be overriden by Hiera
# see - /etc/puppet/data/node/<host>.yaml
class profiles::logstash(
$version = "1.4.1-1_bd507eb",
$brokers = ["172.16.14.30", "172.16.14.60"],
$cluster = undef,
$enable = true,
$start = true
) {
class{'profiles::logstash::install': } ->
class{'profiles::logstash::config': } ->
Class["profiles::logstash"]
}
And my YAML:
classes:
- roles::logshipper
profiles::logstash::version: '1.4.1-1_bd507eb'
profiles::logstash::enable: true
profiles::logstash::start: false
profiles::logstash::brokers:
- hostname1
- hostname2
And my ERB files
/etc/puppet/modules/profiles/templates/logstash/
<% for @host in @brokers %>
input {
redis {
host => "<%= @host %>"
type => "redis-input"
data_type => "list"
key => "logstash"
}
}
<% end %>
/etc/puppet/modules/profiles/templates/logstash/output_broker.erb:
<%
# iterate over brokers array passed in via Hiera and concatenate
# redis hosts for logstash configuration
host_string = "["
@brokers.each_with_index { |host,idx|
host_string << "\"#{host}\"";
host_string << "," if idx < @brokers.length-1
}
host_string << "]"
%>
output {
redis {
host => <%= host_string %>
data_type => "list"
key => "logstash"
}
}
/etc/puppet/modules/profiles/templates/logstash/output_es.erb:
output {
elasticsearch {
cluster => "<%= cluster %>"
index => "logstash-%{+YYYY.MM.dd.HH}"
}
}
On Monday, June 2, 2014 11:11:32 AM UTC-4, jcbollinger wrote:
>
>
>
> On Thursday, May 29, 2014 2:39:15 PM UTC-5, Brian Wilkins wrote:
>>
>> Solved it using this tip.. it's odd but it works:
>> http://serverfault.com/a/538877/26514
>>
>>
>
> That's odd only inasmuch as the original problem in that serverfault
> question was different from yours. The OP was trying to achieve a similar
> structure to the one you are working on, though, so it is natural that what
> worked for him also works for you.
>
> For what it's worth, I think your original problem was here:
>
> [...]
>
> profiles::logstash::config { $name:
> content => $content,
> order => $order,
> }
>
> [...]
>
> The variables $content and $order had not been assigned any values in that
> scope (class profiles::logstash::shipper), which is exactly what the error
> message said.
>
> I think that create_resources() was a red herring. It should have been
> possible to use create_resources() more or less as you originally attempted
> to do, though you should have specified the fully-qualified name of the
> resource type ("profiles::logstash::config"), which you did not do.
> Indeed, your final data structure appears still amenable to use with
> create_resources().
>
>
>
>> shipper.pp
>>
>> class profiles::logstash::shipper() {
>>
>> $shipper_array = hiera_array('profiles::logstash::config_array')
>>
>> define hash_extract() {
>> $shipper_hash = hiera_hash('profiles::logstash::config_settings')
>> $shipper_config = $shipper_hash[$name]
>>
>> profiles::logstash::config {'shipper':
>> content => $shipper_config['content'],
>> order => $shipper_config['order'],
>> }
>> notice($shipper_config['content'])
>> notice($shipper_config['order'])
>> }
>>
>> hash_extract{$shipper_array:}
>>
>> class { 'logstash':
>> ensure => 'present',
>> version => '1.4.1-1_bd507eb',
>> status => 'enabled',
>> }
>> include logstash
>>
>
>
> Note that the 'include logstash' is completely redundant (but not directly
> harmful) in that context because Class['profiles::logstash'] is already
> declared (immediately prior). It would be much better to declare the class
> via its fully-qualified name, though, whichever form you use.
>
>
>
>> }
>>
>>
>
> I urge you, however, to avoid nesting classes or defined types. The
> semantics are not necessarily what you expect (THAT was the serverfault
> questioner's issue), it makes the class or definition harder to find, and
> it contributes to confusion about the actual names of these things.
>
>
> John
>
>
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/b9ecbc6a-8991-4300-a368-b5f268437d15%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.