Problem with custom function returning array

1,319 views
Skip to first unread message

Nate

unread,
Oct 7, 2011, 9:50:15 AM10/7/11
to Puppet Users
Hi,

I'm trying create a custom function that will return an array of file
paths for the file type source. Instead of defining the following
array for source for each file type:

file: { "some_file":
source => [ "puppet:///file/$hostname/path", "puppet:///file/$role/
$mode/path", "puppet:///file/$role/path", "puppet:///file/common/
path", ],
...
}

I've created a custom function to return the generated array similar
to the following:

file: { "some_file":
source => find_file(path),
...
}

I'm getting the following message on the client:

err: Could not retrieve catalog from remote server: Error 400 on
SERVER: Function 'find_file' does not return a value at /etc/puppet/
manifests/class/sudo.pp:12 on node tnfs01

The function is located at /var/lib/puppet/lib/puppet/parser/functions/
find_file.rb.

Function:

module Puppet::Parser::Functions
newfunction(:find_file, :type => :rvalue) do |args|
filename = args[0]
hostname = lookupvar('hostname')
role = lookupvar('role')
mode = lookupvar('mode')
sources = Array.new
sources << "puppet:///files/#{hostname}/#{filename}"
sources << "puppet:///files/#{role}/#{mode}/#{filename}"
sources << "puppet:///files/#{role}/#{filename}"
sources << "puppet:///files/common/#{filename}"
return sources
end
end

Not sure what I'm doing wrong here. Any help would be greatly
appreciated. Also, if there's already a built-in way to do this in
Puppet I'd gladly ditch the custom function, although I'd still like
to figure out the problem for future reference.

Thanks,

Nate

Nate

unread,
Oct 13, 2011, 4:44:14 PM10/13/11
to Puppet Users
Anybody have any thoughts on this?

On Oct 7, 8:50 am, Nate <nathan.schum...@gmail.com> wrote:
> Hi,
>
> I'm trying create acustomfunctionthat willreturnanarrayof file
> paths for the file type source.  Instead of defining the followingarrayfor source for each file type:
>
> file: { "some_file":
>   source => [ "puppet:///file/$hostname/path", "puppet:///file/$role/
> $mode/path", "puppet:///file/$role/path", "puppet:///file/common/
> path", ],
>   ...
>
> }
>
> I've created acustomfunctiontoreturnthe generatedarraysimilar
> to the following:
>
> file: { "some_file":
>   source => find_file(path),
>   ...
>
> }
>
> I'm getting the following message on the client:
>
> err: Could not retrieve catalog from remote server: Error 400 on
> SERVER:Function'find_file' does notreturna value at /etc/puppet/
> manifests/class/sudo.pp:12 on node tnfs01
>
> Thefunctionis located at /var/lib/puppet/lib/puppet/parser/functions/
> find_file.rb.
>
> Function:
>
> module Puppet::Parser::Functions
>   newfunction(:find_file, :type => :rvalue) do |args|
>     filename = args[0]
>     hostname = lookupvar('hostname')
>     role = lookupvar('role')
>     mode = lookupvar('mode')
>     sources =Array.new
>     sources << "puppet:///files/#{hostname}/#{filename}"
>     sources << "puppet:///files/#{role}/#{mode}/#{filename}"
>     sources << "puppet:///files/#{role}/#{filename}"
>     sources << "puppet:///files/common/#{filename}"
>    returnsources
>   end
> end
>
> Not sure what I'm doing wrong here.  Any help would be greatly
> appreciated.  Also, if there's already a built-in way to do this in
> Puppet I'd gladly ditch thecustomfunction, although I'd still like

Jacob Helwig

unread,
Oct 13, 2011, 4:50:53 PM10/13/11
to puppet...@googlegroups.com
Did you topo part of the function definition, or does it actually have
'returnsources' at the end of the newfunction block?

You should have 'return sources', 'sources', or just leave that bit off,
since 'sources << "puppet:///files/common/#{filename}"' will return the
value of sources.

--
Jacob Helwig

signature.asc

Nan Liu

unread,
Oct 13, 2011, 7:32:56 PM10/13/11
to puppet...@googlegroups.com
On Fri, Oct 7, 2011 at 6:50 AM, Nate <nathan....@gmail.com> wrote:
> Hi,
>
> I'm trying create a custom function that will return an array of file
> paths for the file type source.  Instead of defining the following
> array for source for each file type:
>
> file: { "some_file":
>  source => [ "puppet:///file/$hostname/path", "puppet:///file/$role/
> $mode/path", "puppet:///file/$role/path", "puppet:///file/common/
> path", ],
>  ...
> }

In general more desirable to be explicit about the file you are
distributing rather than using this pattern. Moving on to the issue.

> I've created a custom function to return the generated array similar
> to the following:
>
> file: { "some_file":
>  source => find_file(path),
>  ...
> }

Function seems fine:
notice: Scope(Class[main]): puppet:///files/puppet/file.txt
puppet:///files/my_role//file.txt puppet:///files/my_role/file.txt
puppet:///files/common/file.txt
notice: Finished catalog run in 0.02 seconds

file: { ... should be file { "some_file": ...

Are you using path as a variable instead of the actual file path?

file { "some_file":
source => find_file("/path/to/file"),
...
}

HTH,

Nan

Nate

unread,
Oct 14, 2011, 2:43:16 PM10/14/11
to Puppet Users
Thank you all for the responses. For some reason when I was
originally testing this function it was giving the error mentioned
previously. However, it does seem to be working now. I'm wondering
if there wasn't something cached on the puppet client or a typo
somewhere else. Unfortunately I'm relatively new to Puppet and Ruby.

The argument to find_file function is actually a relative path like
"etc/hosts". We have a production and test environment which would
fill in the $mode, and several different system roles for $role. The
whole reason I created this function is to have one class defined that
would work with all $mode and $role options and to provide the ability
to create one-off files if needed used by $host and also a common to
all options. This may go against the idea of Puppet, but it will be
useful in our environment.

Thanks again!

Nate

On Oct 13, 6:32 pm, Nan Liu <n...@puppetlabs.com> wrote:
Reply all
Reply to author
Forward
0 new messages