trouble with hiera %{calling_module} and puppet defines

985 views
Skip to first unread message

Florian Koch

unread,
Mar 15, 2012, 3:47:08 PM3/15/12
to puppet...@googlegroups.com
Hi,

i have some trouble with hiera and  %{calling_module}.

i have:

class tomcat::instance{

        $instances = hiera('tomcat_instances')

        tomcat::installer{$instances:}

}

define tomcat::installer {

        require 'tomcat'

        $instance_opts = hiera($name)

        $tomcat_user = $instance_opts[user]
        $tomcat_group = $instance_opts[group]
        $basedir = $instance_opts[basedir]
        $logdir = $instance_opts[logdir]
        $tomcat_name = $instance_opts[name]


        $tomcat_version='6'
...
}

i specify the tomcat names in a hiera file and run the define wit the names as array (so they get executed for each name)

'/var/lib/environments/test/hieradata'/tomcat/crowd.yaml

---
tomcat_instances:
        - crowd1
        - crowd2

       
crowd1:
        name: 'crowd1'
        basedir: '/srv'
        logdir: '/var/log'
        user: 'crowd'
        group: 'crowd'

crowd2:
        name: 'crowd2'
        basedir: '/srv'
        logdir: '/var/log'
        user: 'crowd'
        group: 'crowd'

my hiera.yaml
---
:hierarchy:
    - %{calling_module}/%{fqdn}
    - %{hostbasename}
    - %{domain}
    - common
:backends:
    - yaml
:yaml:
    :datadir: '/var/lib/environments/%{environment}/hieradata'


if i wrote the crowd.yaml content in the common.yaml all works, if its in the module subdirectory, puppet can not find the data from the hiera lookup in the tomcat::installer, but the call from the tomcat::instance class works, i get the right tomcat names in the error.

any idea?

rgds Florian

Gary Larizza

unread,
Mar 15, 2012, 4:33:17 PM3/15/12
to puppet...@googlegroups.com
Hi Florian,

I believe since $calling_module is a variable out of Puppet and not Facter, that you will need to ALSO setup the Puppet backend, in addition to the YAML backend, in the hiera.yaml file so Hiera can get its value.



--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To view this discussion on the web visit https://groups.google.com/d/msg/puppet-users/-/ZjdL5rHQxBYJ.
To post to this group, send email to puppet...@googlegroups.com.
To unsubscribe from this group, send email to puppet-users...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.



--

Gary Larizza
Professional Services Engineer
Puppet Labs

Dennis Hoppe

unread,
Mar 15, 2012, 4:56:34 PM3/15/12
to puppet...@googlegroups.com
Hello Florian,

Am 15.03.2012 20:47, schrieb Florian Koch:
> i have some trouble with hiera and %{calling_module}.

i have had a similiar problem. You need to submit the values to the define.

> i have:
>
> class tomcat::instance{
> $instances = hiera('tomcat_instances')
> tomcat::installer{$instances:}
> }
>
> define tomcat::installer {
> require 'tomcat'
>
> $instance_opts = hiera($name)
> $tomcat_user = $instance_opts[user]
> $tomcat_group = $instance_opts[group]
> $basedir = $instance_opts[basedir]
> $logdir = $instance_opts[logdir]
> $tomcat_name = $instance_opts[name]
>
> $tomcat_version='6'
> ...
> }

You should try something like this:

class tomcat::instance {
$instances = hiera('tomcat_instances')

tomcat::installer { $instances[name]:
basedir => $instances[basedir],
logdir => $instances[logdir],
user => $instances[user],
group => $instances[group],
}
}

define tomcat::installer ($basedir, $logdir, $user, $group) {
...
}

I am using this method for my Icinga module
(http://github.com/dhoppe/puppet-icinga). You should take a look at the
following files:

- examples/icinga.yaml
- manifests/contact.pp
- manifests/contact/contacts.pp

Regards, Dennis


signature.asc

Florian Koch

unread,
Mar 15, 2012, 4:58:01 PM3/15/12
to puppet...@googlegroups.com
Hi Gary,

hm for other classes it works , so i think the puppet backend is not needed
(https://github.com/ripienaar/hiera-puppet/commit/a7350529a99e5d1bad8b03749661f3f4c7f00216),
the problem is the define, i guess that a define won't set $module_path correct, the hiera cass from the class tocat::instance works perfect.

But i have found better solution, i use create_resources to build the defines, works really smart


class tomcat::instance{

$instances = hiera('tomcat_instances')

        create_resources('tomcat::installer',$instances)
}
define tomcat::installer ($user,$group,$basedir,$logdir,$name){ ....}
---
tomcat_instances:
        crowd1:
                name: 'cr1'

                basedir: '/srv'
                logdir: '/var/log'
                user: 'crowd'
                group: 'crowd'

        crowd2:
                name: 'cr2'

                basedir: '/srv'
                logdir: '/var/log'
                user: 'crowd'
                group: 'crowd'


rgds Florian

Am Donnerstag, 15. März 2012 21:33:17 UTC+1 schrieb Gary Larizza:
Hi Florian,

I believe since $calling_module is a variable out of Puppet and not Facter, that you will need to ALSO setup the Puppet backend, in addition to the YAML backend, in the hiera.yaml file so Hiera can get its value.

To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.

Florian Koch

unread,
Mar 15, 2012, 5:06:13 PM3/15/12
to puppet...@googlegroups.com
Hi Dennis,

i have found a better solution via create_resources (look at my  reply to Gery)

thanks anyway.

rgds Florian

Gary Larizza

unread,
Mar 15, 2012, 7:25:34 PM3/15/12
to puppet...@googlegroups.com
Ahh,

Good catch - thanks for replying back with the fix

-Gary

To view this discussion on the web visit https://groups.google.com/d/msg/puppet-users/-/c8Qv0i9cwEUJ.

To post to this group, send email to puppet...@googlegroups.com.
To unsubscribe from this group, send email to puppet-users...@googlegroups.com.

For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.

Martin Willemsma

unread,
Mar 16, 2012, 4:03:44 AM3/16/12
to puppet...@googlegroups.com
Hi Florian,
Interesting post. I was planning the same sort of approach for apache
vhosts with hiera and create_resources. This is good proof that the
idea works.

Are you using this approach in other modules as well, if so which?

Regards,

Martin

2012/3/16 Gary Larizza <ga...@puppetlabs.com>:

>>>> puppet-users...@googlegroups.com.
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/puppet-users?hl=en.
>>>
>>>
>>>
>>>
>>> --
>>>
>>> Gary Larizza
>>> Professional Services Engineer
>>> Puppet Labs
>>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Puppet Users" group.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msg/puppet-users/-/c8Qv0i9cwEUJ.
>>
>> To post to this group, send email to puppet...@googlegroups.com.
>> To unsubscribe from this group, send email to
>> puppet-users...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/puppet-users?hl=en.
>
>
>
>
> --
>
> Gary Larizza
> Professional Services Engineer
> Puppet Labs
>

> --
> You received this message because you are subscribed to the Google Groups
> "Puppet Users" group.

Florian Koch

unread,
Mar 16, 2012, 7:31:14 AM3/16/12
to puppet...@googlegroups.com
Hi Martin,

no currently only for the tomcat::instances.
we currently change our modules to hiera, so maybe i find other cases.

rgds Florian

>>>> puppet-users+unsubscribe@googlegroups.com.


>>>> For more options, visit this group at
>>>> http://groups.google.com/group/puppet-users?hl=en.
>>>
>>>
>>>
>>>
>>> --
>>>
>>> Gary Larizza
>>> Professional Services Engineer
>>> Puppet Labs
>>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Puppet Users" group.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msg/puppet-users/-/c8Qv0i9cwEUJ.
>>
>> To post to this group, send email to puppet...@googlegroups.com.
>> To unsubscribe from this group, send email to

>> puppet-users+unsubscribe@googlegroups.com.


>> For more options, visit this group at
>> http://groups.google.com/group/puppet-users?hl=en.
>
>
>
>
> --
>
> Gary Larizza
> Professional Services Engineer
> Puppet Labs
>
> --
> You received this message because you are subscribed to the Google Groups
> "Puppet Users" group.
> To post to this group, send email to puppet...@googlegroups.com.
> To unsubscribe from this group, send email to

> puppet-users+unsubscribe@googlegroups.com.

Juan José Presa Rodal

unread,
Mar 16, 2012, 10:24:00 AM3/16/12
to puppet...@googlegroups.com
Hi Florian. great and smart method. But I've found a problem. If i have a hash with two dimensions I'm losing the information of the first dimension. Explained:

yaml:
---
routers:
  router1:
     ip: 1.2.3.4
     ports:
        1:
           foo: true
           bar: false
        2:
           foo: false
           bar: false
  router2:
     ip: 5.6.7.8
     ports:
        1:
           foo: true
           bar: true
        2:
           foo: false
           bar: true

manifest:

create_resources('foo::map',$routers)
}

define foo::map ($ip,$ports) {
  create_resources('ports::map',$ports)
}

define ports::map ($foo,$bar) {
}


When catalog reaches ports::map, catalog have lost information about original router name. Is it correct? Or am I missing something?
Thanks in advance.

Jan Ivar Beddari

unread,
Mar 16, 2012, 12:27:41 PM3/16/12
to puppet...@googlegroups.com, Florian Koch
On 15. mars 2012 22:06, Florian Koch wrote:
> Hi Dennis,
>
> i have found a better solution via create_resources (look at my reply to
> Gery)

Not neccessarily better in my mind because ..

> You should try something like this:
>
> class tomcat::instance {
> $instances = hiera('tomcat_instances')
>
> tomcat::installer { $instances[name]:
> basedir => $instances[basedir],
> logdir => $instances[logdir],
> user => $instances[user],
> group => $instances[group],
> }
> }
>
> define tomcat::installer ($basedir, $logdir, $user, $group) {
> ...
> }

.. this code is easier to explain and follow.

Not to be underestimated! :-)


--
http://www.uib.no/personer/Jan.Ivar.Beddari

Florian Koch

unread,
Mar 16, 2012, 1:48:48 PM3/16/12
to puppet...@googlegroups.com, Florian Koch
hi,

yes better depends on personal preferences

SteveTraylen

unread,
May 14, 2012, 10:46:16 AM5/14/12
to puppet...@googlegroups.com
On Thursday, 15 March 2012 21:58:01 UTC+1, Florian Koch wrote:
Hi Gary,

hm for other classes it works , so i think the puppet backend is not needed
(https://github.com/ripienaar/hiera-puppet/commit/a7350529a99e5d1bad8b03749661f3f4c7f00216),
the problem is the define, i guess that a define won't set $module_path correct, the hiera cass from the class tocat::instance works perfect.

Just on that last point is it a bug that $calling_module is not set within a define and so can't be used in the 
hiera search path when defines are being used? I think so I'll submit it shortly unless there is comment.

It seems you can however use $modue_name in a hiera search path and this is passed to hiera from puppet okay.

Not sure of the difference between $module_name and $calling_module but former goes against the hiera examples
of course.

Steve.
Reply all
Reply to author
Forward
0 new messages