On 2014-11-09 22:57, Brandon Metcalf wrote:
>
>
> On Thursday, September 11, 2014 12:56:50 PM UTC-5, Henrik Lindberg wrote:
>
> On 2014-11-09 16:04, Brandon Metcalf wrote:
> >
> > On Sunday, September 7, 2014 9:39:56 AM UTC-5, Felix.Frank wrote:
> >
> > On 09/06/2014 11:09 PM, Spencer Krum wrote:
> > >
> > > $java_home = $java_home_var
> > >
> > > Barring that, this is the correct way to use a template:
> > >
> > > $java_home = inline_template('<%= @java_home_var %>')
> >
> > Well, yes, but I got the impression that the OP has a
> *variable name*
> > stored in $java_home_var and needs way to retrieve it inside a
> > template..
> >
> > Granted, such things should be done in a parser function, but
> the error
> > message is very confusing nontheless.
> >
> >
> > That is correct. $java_home_var does contain a variable name..
> Using a
> > variable name in a variable is almost always the wrong approach,
> but I
> > couldn't find a better way to do this. Could you explain how
> this could
> > be accomplished with a parser function?
> >
> Before taking that route - where does the $java_home_var come from ?
> Is it a fact? Does it refer to the name of another fact?
>
>
> It looks like
>
> $java_home_var = "${java_class}::java_home"
>
> which is a variable in other classes depending on the value of $java_class.
>
I asked because the facts are available in a $facts hash, which makes it
easy to construct the name and look it up.
In Puppet 4.0, (and in 3.7.0 with future parser) you can reference
parameters via the [] operator on the Class type - e.g:
Class['class_name']['java_home']
and then no function is required.
If you are not on the latest version, and do not want to run with
--parser future, you have to write a function. Say something like this:
Puppet::Parser::Functions.newfunction(:javahome, :arity => 1,
:type => :rvalue, :doc => "The javahome does this..."") do |args|
lookup_qualified_variable(args[0], 'java_home', {} )
end
The lookup_qualified_variable is not marked as public API though, and
may not be available in older puppet versions. In which case you have to
interpolate the qualified name, and use that:
lookupvar("::#{args[0]}::java_home")
There may be a lookupvar(name) function available already in some module
if you do not want to write and maintain your own function.
(Note that functions in 3x and older versions are evaluated as methods
on the Scope class, so anything you call (like lookupvar) is a call to a
method on scope. Just saying so you know where the lookupvar and
lookup_qualified_variable comes from).
Regards
- henrik